2014-07-16 4 views
1

내가 같을 것이다 봄 통합 V4의 DSL API를 사용하여 간단한 메시지 흐름 쓰기를 시도하고있다 : 나는를 주입 할 때,봄 통합 4 비동기 요청/응답

 -> in.ch -> Processing -> JmsGatewayOut -> JMS_OUT_QUEUE 
Gateway 
     <- out.ch <- Processing <- JmsGatewayIn <- JMS_IN_QUEUE 

요청/응답 비동기 인 상태를 메시지를 전달하면 메시지는 JMS_OUT_QUEUE로 계속 이동합니다. 이 메시지 흐름을 넘어서는 응답 메시지는 다시 JMS_IN_QUEUE에 저장되며 JmsGatewayIn에 의해 선택됩니다. 이 시점에서 메시지는 처리되고 out.ch에 배치됩니다 (응답을 out.ch에 도착시키는 이유는 거기에 배치되는 메시지를 기록하는 로거 인터셉터가 있기 때문입니다). 그러나 게이트웨이는 결코 응답을 수신하지 않습니다. 대신 응답

, JMS_OUT_QUEUE에서 메시지를 집어 JMS_IN_QUEUE에 응답을 배치이 메시지 흐름의 외부 시스템 (I 그것으로부터 JMS 응답 객체 직렬화 실패 생각 자체 JmsOutboundgateway에 javax.jms.MessageFormatException: MQJMS1061: Unable to deserialize object 수신 로그를보고).

분명히 올바르게 구성된 항목이 없지만 정확히 무엇을 모르겠습니다. 아무도 내가 빠진 것을 아는가?

spring-integration-core-4.0.3.RELEASE, spring-integration-jms-4.0.3.RELEASE, spring-integration-java-dsl-1.0.0.M2, spring-jms-4.0으로 작업하십시오. 6. 릴리스. 다음과 같이

내 게이트웨이 구성되어 다음과 같이

@MessagingGateway 
public interface WsGateway { 

    @Gateway(requestChannel = "in.ch", replyChannel = "out.ch", 
     replyTimeout = 45000) 
    AResponse process(ARequest request); 
} 

내 통합 흐름이 구성되어

@Configuration 
@EnableIntegration 
@IntegrationComponentScan 
@ComponentScan 
public class IntegrationConfig { 

    @Bean(name = "in.ch") 
    public DirectChannel inCh() { 
     return new DirectChannel(); 
    } 

    @Bean(name = "out.ch") 
    public DirectChannel outCh() { 
     return new DirectChannel(); 
    } 

    @Autowired 
    private MQQueueConnectionFactory mqConnectionFactory; 

    @Bean 
    public IntegrationFlow requestFlow() { 

     return IntegrationFlows.from("in.ch") 
       .handle("processor", "processARequest") 
       .handle(Jms.outboundGateway(mqConnectionFactory) 
         .requestDestination("JMS_OUT_QUEUE") 
         .correlationKey("JMSCorrelationID") 
       .get(); 
    } 

    @Bean 
    public IntegrationFlow responseFlow() { 

     return IntegrationFlows.from(Jms.inboundGateway(mqConnectionFactory) 
       .destination("JMS_IN_QUEUE")) 
       .handle("processor", "processAResponse") 
       .channel("out.ch") 
       .get(); 
    } 
} 

감사합니다 여기에 대한 도움, PM을 위해. 모든 구성의 첫 번째

답변

2

는 나쁜 :

  1. 당신이 정말이 응답을 기다려야한다 WsGateway#process에서 흐름을 시작하기 때문에. 게이트웨이의 요청/응답 기능은 TemporaryReplyChannel을 기반으로하며, 이는 비 순차 화 가능 값으로 headers에 배치됩니다.

  2. 답변을 게시 - 가입 논리로 수행하지 않으려는 경우 실제로는 해당 게이트웨이를 사용하기를 기다리는 한 replyChannel을 제공 할 이유가 없습니다.

  3. JMS 대기열로 메시지를 보낼 때 소비자 부분은 별도의 원격 응용 프로그램 일 수 있음을 이해해야합니다. 그리고 마지막 한 사람은 귀하의 out.ch에 대해 알지 못할 수도 있습니다.

  4. JMS 요청/응답 기능은 실제로 JMSCorrelationID을 기반으로하지만 충분하지 않습니다. 여기서 또 하나의 점은 ReplyTo JMS 헤더입니다. 따라서 소비자로부터 답장을 보내려한다면 JmsGatewayIn에 의존해야합니다. 당신을 위해 적합한 지,

    @MessagingGateway 
    public interface WsGateway { 
    
        @Gateway(requestChannel = "in.ch", replyTimeout = 45000) 
        AResponse process(ARequest request); 
    } 
    
    @Configuration 
    @EnableIntegration 
    @IntegrationComponentScan 
    @ComponentScan 
    public class IntegrationConfig { 
    
        @Bean(name = "in.ch") 
        public DirectChannel inCh() { 
         return new DirectChannel(); 
        } 
    
        @Autowired 
        private MQQueueConnectionFactory mqConnectionFactory; 
    
        @Bean 
        public IntegrationFlow requestFlow() { 
         return IntegrationFlows.from("in.ch") 
           .handle("processor", "processARequest") 
           .handle(Jms.outboundGateway(mqConnectionFactory) 
             .requestDestination("JMS_OUT_QUEUE") 
             .replyDestination("JMS_IN_QUEUE")) 
           .handle("processor", "processAResponse") 
           .get(); 
        } 
    
    } 
    

    가 알려줘 또는 하나 one-way 경우에 two-way 게이트웨이를 사용하는 이유 explian하려고 :

그래서 나는이 당신의 코드를 변경할 것입니다.어쩌면 Jms.outboundAdapter()Jms.inboundAdapter() 당신을 위해 더 좋을지 무엇입니까?

자바 DSL에서 <header-channels-to-string>를 사용하는 방법 UPDATE

:

.enrichHeaders(e -> e.headerChannelsToString()) 
+0

안녕, 당신의 솔루션 덕분에 맞습니다. 나는 Jms In/Out 게이트웨이를 Jms In/Out 어댑터로 교체하려고 시도했지만 그 역시 구성하는 데 문제가있었습니다. 그렇다면 replyDestination을 사용하는 Jms Out Gateway 만 솔루션에서와 같이 시도해 보았습니다. 내가 언급 한 것처럼 초기 @ Gateway의 replyChannel을 제거하지 않았습니다. 감사! –

+0

안녕하세요, 저는 다시이 게시물로 돌아올 필요가 있음을 발견합니다 ... 비동기 응답을 허용하기 위해 별도의 JMS 인바운드/아웃 바운드 어댑터를 사용해야한다고 생각하는 요구 사항이 있습니다. 이 작업을 수행하기 위해 WsGateway에서 replyChannel = "out.ch"를 다시 설정하고 Jms.outboundAdapter 및 Jms.inboundAdapter로 Jms.outboundGateway를 전환하고 보내기 전에 메시지에 JMSCorrelationID 헤더를 설정했지만, 응답이 돌아와서 out.ch에 배치되면 WsGateway는 응답 메시지를받지 못합니다. 내 SI 흐름은 실제로 여기 보이는 것보다 좀 더 복잡합니다 ... –

+1

요청을 보내기 전에' '과 함께''를 사용하십시오. –