2015-01-30 3 views
2

현재 Camel을 사용중인 Spring 애플리케이션을 개발 중입니다. 애플리케이션에 진입 점으로 SQS를 폴링합니다 (1 차 경로). 스프링의 XML 기반 접근법을 사용하여 성공적으로 달성 할 수있었습니다.Camel, Amazon SQS - 유형 변환 : java.lang.String에서 필수 유형으로 변환 : com.amazonaws.services.sqs.AmazonSQS

내 AmazonSQSClient 콩 :

<bean id="sqsClient" class="com.amazonaws.services.sqs.AmazonSQSClient"> 
    <constructor-arg ref="sqsCredentialsProvider" /> 
    <property name="endpoint" value="${aws.sqs.endpoint}" /> 
</bean> 

내 낙타 경로 : 나는 위의 접근 방식이 시점에서 원하는

<route id="pollMessages"> 
    <from id="sqsEndpoint" uri="aws-sqs://{{queue.name}}?amazonSQSClient=#sqsClient&amp;deleteAfterRead=false" /> 
    <to uri="direct:readSQSMessage" /> 
</route> 

모든 작동합니다.

이제 모든 콩과 Camel Configuration을 Java 기반 접근 방식으로 마이그레이션하려고합니다.

나는 다음과 같은 내 아마존 SQS 클라이언트 콩을 만든이를 사용하지만

@Bean 
public CamelContext camelContext() throws Exception{ 
    CamelContext camelContext = new DefaultCamelContext(); 

    camelContext.addRoutes(new RouteBuilder() { 
     @Override 
     public void configure() { 

      from("aws-sqs://"+fulfillmentQueueName+"?amazonSQSClient=#sqsClient&amp;delay="+fulfillmentQueuePollInterval) 
      .to("direct:parseSQSMessage"); 

      } 
    }); 

    camelContext.start(); 
    return camelContext; 
} 

, 나는 점점 오전 오류 : 나는 낙타 경로 (조각)을 생성하고,

@Bean 
public AmazonSQS sqsClient(){ 
    ClientConfiguration clientConfiguration = new ClientConfiguration(); 
    AmazonSQSClient client = new AmazonSQSClient(sqsCredentialsProvider(), clientConfiguration); 
    client.setEndpoint(sqsEndpoint); 

    return client; 
} 

을 그리고처럼 보이는 접근 :

java.lang.IllegalArgumentException : 동일한 유형의 setter 메소드가 없으므로 amazonSQSClient 속성에 적절한 설정자를 찾을 수 없습니다. java.lang.String도 아닙니다. 타입 변환 가능 : 타입 변환이 불가능한 타입 변환기 : java.lang.String from 필수 타입 : com.amazonaws.services.sqs.AmazonSQS 값 #sqsClient

here 자바 스타일 카멜 생성 방법 경로

는 내가 레지스트리 (registry.bind)에 AWS 클라이언트를 바인드해야 here를 읽을 수 있지만 나는뿐만 아니라이 시도 JNDI

을 제외한 모든 레지스트리에 바인드 방법을 찾을 수 없습니다입니다 :

SimpleRegistry registry = new SimpleRegistry(); 
registry.put("sqsClient", sqsClient()); 

CamelContext camelContext = new DefaultCamelContext(registry); 

하지만 같은 오류가 발생했습니다.

나는 많은 것을 수색하고 더 많은 일을 계속하기를 계획했지만, 내가해야 할 일을하는 완전한 모범을 찾을 수 없다. 스 니펫이 여기에서 많은 도움이되고 있습니다.

도움을 주시면 대단히 감사하겠습니다. 감사합니다

답변

1

SpringCamelContext (스프링의 ApplicationContext을 생성자 매개 변수로 사용) - 응용 프로그램 컨텍스트의 bean 이름 "sqsClient"로 sqs 클라이언트를 조회합니다.

스프링 부트와 낙타 스프링을 사용하는 경우 기본적으로 SpringCamelContext이 생성됩니다.

2

amazonSQSClient=#sqsClient 매개 변수의 경우 Camel은 레지스트리 (ApplicationContextRegistry)에서 키가 sqsClient 인 항목을 찾으려고합니다.

첫 x 째 솔루션 (xml에 bean 지정)에서 bean의 id을 설정하고 Camel은 ApplicationContextRegistry에 id=sqsClient으로 bean을 등록했습니다.그러나 코드에서 bean을 구성 할 때 id/name을 설정하지 않았으므로 Camel은 찾지 못했습니다. 그것이 작동하게하려면 빈의 이름을 설정해야합니다!

솔루션 :

@Bean(name = "sqsClient") 
public AmazonSQS sqsClient(){ 
    ClientConfiguration clientConfiguration = new ClientConfiguration(); 
    AmazonSQSClient client = new AmazonSQSClient(sqsCredentialsProvider(), clientConfiguration); 
    client.setEndpoint(sqsEndpoint); 
    return client; 
}