2014-10-02 2 views
1

낙타 컨텍스트에서 경로의 끝점 선언에서 참조되는 스프링 빈을 사용하여 Camel 끝점을 구성하는 방법을 찾으려고 시도했지만 작동하지 않습니다.Spring bean으로 Camel Endpoint를 설정하기위한 긴 URI의 대안은 무엇입니까?

예를 들어 매개 변수가 많은 끝점 URI를 정의하는 것은 매우 끔찍한 일입니다 (!!). 빈과 해당 속성으로 끝점을 구성하는 것이 훨씬 쉬울 것입니다. (또는 더 나은 점은 XML로 끝점을 구성 할 때 또는 요소에 끝점의 매개 변수를 구성 할 수있는 일반 bean과 같은 하위 요소가 있어야한다는 것입니다.

아래의 첫 번째 접근 방식은 잘 작동하며 매우 표준적이고 간단합니다. 두 번째 방법은 대신 사용하고 싶지만 작동하지 않습니다. 나는 많은 변형을 시도했지만 성공하지 못했습니다! 아래의 세 번째 대안은 실제로 낙타 개발자를위한 흥미로운 제안 일뿐입니다. 그러나 또한 요점을 설명합니다.

아래 예에서 파일 끝점에 대해 3 개의 매개 변수 만 구성했지만 10 개의 매개 변수로 URI를 상상해보십시오 !! 제 질문은 어떻게하면 두 번째 접근 방식을 제대로 작동하게 할 수 있을까요? 저는 간단한 해결책이 있다는 것을 확신합니다! 나는 또한 factory-bean과 factory 메소드를 사용해 보았지만 둘 다 작동하지 않았다.

1) XML에서 낙타 엔드 포인트 (봄 콩)를 구성하는 기본 방법 :

... 
<camel:camelContext id="camelContext" > 

    <camel:route id="deviceDataLogsPoller" > 
     <camel:from uri="file://long/path/to/input?preMove=../inprogress&amp;move=../done&amp;moveFailed=../error" /> 

     <camel:log message="Input device data file read from file in input folder {{im.filePoller.folder.input}}." loggingLevel="INFO" /> 

    </camel:route> 
</camel:camelContext> 

내가 valide 될 것으로 예상하지만 나를 위해 (작동하지 않습니다 2) 대안) :!

을 위의 두 가지 대안) 사이 (혼합 미래에 흥미로운 일이 될 것이다
<bean id="filePoller" class="org.apache.camel.component.file.FileEndpoint" > 

    <property name="camelContext" ref="camelContext" /> 
    <property name="localWorkDirectory" value="/long/path/to/input" /> 
    <property name="preMove" value="../inprogress" /> 
    <property name="move"  value="../done" /> 
    <property name="moveFailed" value="../error" /> 
    ... 
</bean> 

... 
<camel:camelContext id="camelContext" > 

    <camel:route id="deviceDataLogsPoller" > 
     <camel:from ref="filePoller" /> 

     <camel:log message="Input device data file read from file in input folder {{im.filePoller.folder.input}}." loggingLevel="INFO" /> 

    </camel:route> 
</camel:camelContext> 

3) 대안 :

...

<camel:route id="deviceDataLogsPoller" > 
     <camel:from uri="file://long/path/to/input" > 
      <property name="preMove" value="../inprogress" /> 
      <property name="move"  value="../done" /> 
      <property name="moveFailed" value="../error" /> 
      ... 
     </camel:from> 

     <camel:log message="Input device data file read from file in input folder {{im.filePoller.folder.input}}." loggingLevel="INFO" /> 

    </camel:route> 
</camel:camelContext> 

답변

1

정확하게 작동하지 않은 것은 무엇입니까?

다음 설치는 예상대로 일을했다 :

<bean id="filePoller" class="org.apache.camel.component.file.FileEndpoint"> 
    <property name="file" value="src/data/bean-ref" /> 
    <property name="move" ref="moveExpression"/> 
</bean> 

<bean id="moveExpression" class="org.apache.camel.model.language.SimpleExpression"> 
    <constructor-arg value="${file:parent}/.done/${file:onlyname}" /> 
</bean> 

<camelContext xmlns="http://camel.apache.org/schema/spring" id="camelContext"> 
    <route> 
     <from ref="filePoller" /> 
     <log message="${body}" /> 
    </route> 
</camelContext> 

참고 :

  • 속성 file이 속성 move, moveFailed
  • 필수이며, preMove하지 유형 java.lang.String의 만의입니다 org.apache.camel.Expression을 입력하고 그에 따라 초기화해야합니다.
  • 속성 moveExpression에는 전체 파일 표현식이 필요합니다. ${file:parent}/.done/${file:onlyname} 대신 .done 만 사용하는 경우 파일의 이름이 .done으로 바뀌고 .done 디렉터리로 이동하지 않습니다.
+0

예, 작동하지만 일부 속성을 추가하여 params를 설정하는 순간 URI가 매개 변수로 지정된 것처럼 항상 올바르게 작동하지는 않습니다. 예를 들어 'move'속성과 SimpleExpression 타입의 빈을 값 (문자열 대신)으로 사용하여 '이동'매개 변수를 지정하면 모든 것이 시작되지만 입력 폴더의 파일은 다음으로 이동할 수 없습니다. '이동'폴더는 파일이 아니라 폴더를 기다리고 있기 때문에 (예외 메시지에 따라 분명히). – The4Summers

+0

@ The4Summers 당신 말이 맞아요, 같은 방식으로 작동하지 않습니다. 이것을 올바르게 처리하는 방법을 보여주는'moveExpression' 예제를 추가했습니다. –

+0

그래, 나는 그것을 잘 만들 수 있었지만,이 접근법은 URI를 사용하는 것보다 마침내 더 복잡하고 무거웠습니다 !! 위의 세 번째 대안에서 제안한 것처럼 끝점을 구성하는 방법을 사용하는 것이 더 재미있을 것입니다. 어쩌면 시간이 있다면 params 요소에서 전체 URI를 생성하여 기존 URI를 감싸는 "from"및 "to"태그를 직접 만들려고합니다 ...! Camel 개발자들에게도 이것을 제안 할 수 있습니다. 고맙습니다. – The4Summers

0

마지막 주석에서 언급했듯이 끝점 작업에 대한 bean 구성을 만들 수 있었지만 (위의 주석 참조) 결국이 방법은 결국 URI를 사용하는 것보다 훨씬 복잡하고 무거웠습니다 !!

위의 세 번째 대안에서 제안한 것처럼 끝점을 구성하는 방법이 더 재미있을 것입니다. 어쩌면 시간이 있다면 params 요소에서 전체 URI를 생성하여 기존 태그를 래핑하는 태그와 태그를 직접 만들려고합니다.Camel 개발자들에게도 이것을 제안 할 수 있습니다.

이 (또는 XML 래퍼 내가 코드 싶습니다)는 미래에 엔드 포인트를 구성 할 흥미로운 일이 될 수있는 방법의 아래의 예를 참조하십시오

<camel:route id="deviceDataLogsPoller"> 

    <camel:from uri="file://long/path/to/input" > 

     <param name="preMove" value="../inprogress" /> 
     <param name="move"  value="../done" /> 
     <param name="moveFailed" value="../error" /> 
     ... 
    </camel:from> 

    ... 

</camel:route> 
불행하게도

, 위의 그림과 같은 끝점 구성은 현재로서는 불가능하지만 생각하면 좋을 것입니다! 지금 당장은 모든 매개 변수를 매우 긴 URI의 매개 변수로 지정하거나 끝점을 일반 Bean으로 구성하고 모든 복잡성을 암시합니다 (자세한 내용은 위의 주석 참조).