2017-12-22 4 views
1

AMQP를 사용하여 두 개의 마이크로 서비스간에 비동기 메시징을 설정하기위한 "포장 도로"를 연구했습니다. 우리는 각 서비스가 별도의 도메인 객체를 사용하도록 촉진하고자합니다. 즉, 각 서비스는 큐를 통해 전달 된 객체의 사본을 정의해야합니다.스프링 통합 - AMQP 유추 된 유형 Java DSL?

우리는 생산자와 소비자 측 모두에서 Jackson2JsonMessageConverter을 사용하고 있으며 Java DSL을 사용하여 대기열로 /에서 대기열을 연결합니다.

나는 이것을 할 수있는 방법이있을 것이라고 확신하지만, 그것은 나를 벗어나고있다. 나는 소비자가 생산자로부터 전달 된 __TypeID__ 헤더를 무시하도록한다. 소비자는 그 사건의 다른 표현을 가질 수있다. 다른 Java 패키지에있을 가능성이 높습니다).

주석 @RabbitListener을 사용하는 경우 inferredArgumentType 인수가 파생되고 헤더 정보가 무시되는 작업이있는 것으로 보입니다. 이것이 내가하고 싶은 일이지만, Java DSL을 사용하고 싶습니다. 나는 이것을하기위한 명확한 방법을 아직 찾지 못했고 어쩌면 나는 명백한 것을 놓치고있을 수도있다.

return IntegrationFlows 
     .from(
       Amqp.inboundAdapter(factory, queueRemoteTaskStatus()) 
         .concurrentConsumers(10) 
         .errorHandler(errorHandler) 
         .messageConverter(messageConverter) 
     ) 
     .channel(channelRemoteTaskStatusIn()) 
     .handle(listener, "handleRemoteTaskStatus") 
     .get(); 

그러나, 이것은 ClassNotFound 예외가 발생합니다 다음 DSL을 사용하는 경우 유형을 도출 매우 정직 할 것 같다. 지금까지이 문제를 해결할 수있는 유일한 방법은 형식을 명시 적으로 정의해야하는 사용자 지정 메시지 변환기를 설정하는 것입니다.

public class ForcedTypeJsonMessageConverter extends Jackson2JsonMessageConverter { 

    ForcedTypeJsonMessageConverter(final Class<?> forcedType) { 
     setClassMapper(new ClassMapper() { 

      @Override 
      public void fromClass(Class<?> clazz, MessageProperties properties) { 
        //this class is only used for inbound marshalling. 
      } 

      @Override 
      public Class<?> toClass(MessageProperties properties) { 
       return forcedType; 
      } 
     }); 
    } 
} 

개발자가 실제로이 문제를 처리 할 필요가 없으므로이 내용이 파생되기를 정말로 바랍니다.

더 쉬운 방법이 있나요?

+0

미안하지만, 나는 뭔가를 놓치고있다. 그러나 그 유형을 유도하기 위해 그 흐름 정의에서 어떻게 "똑 바른"모습을 보이지 않습니까? 감사합니다 –

+0

변환기의 유형 매퍼에서 유형 ID 매핑 ('setIdClassMapping')을 사용하십시오. 내 대답을 보라. –

+0

"straight forward"가 잘못된 용어라고 생각합니다. 특정 유형의 매핑 전략을 명시 적으로 정의하지 않아도 content-type이 application/json 인 경우 유형을 암시 적으로 처리하려고합니다. 이것은 https://github.com/spring-cloud/spring-cloud-stream/issues/156에서 논의 된 것과 비슷한 아이디어입니다. 제작자 측에서 typeId를 제거하고 application/json을 그대로두면 "out of the box"마샬링을 얻는 것이 좋습니다. – Tyler

답변

1

가장 간단한 방법은 Jackson 변환기의 DefaultJackson2JavaTypeMapperTypeIdMapping (setIdClassMapping())으로 구성하는 것입니다.

송신 시스템에서 foo:com.one.Foo과 수신 시스템 맵 foo:com.two.Foo을 매핑하십시오.

그러면 __TypeId__ 헤더는 foo이되고 수신 시스템은이를 Foo의 표현으로 매핑합니다.

편집

또 다른 옵션은 인바운드 채널 어댑터의 리스너 컨테이너에 afterReceiveMessagePostProcessor를 추가하는 것 - 그것은 __TypeId__ 헤더를 변경할 수 있습니다.

관련 문제