2013-06-22 7 views
0

스프링 amqp를 통해 POJO를 사용하여 기본 요청/응답 메시징을 설정했으며 JSON 메시지 변환기를 통해 RabbitMQ로 교환합니다.이미지를 JSON 메시지로 base64로 인코딩해야합니까? 아니면 Spring AMQP에서 BytesMessage로 반환해야합니까?

내 응답 pojo의 페이로드는 지금까지 간단한 문자열 이었지만 지금은 때때로 이미지로 답장을 보내야합니다.

1)이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 이미지가 JSON 메시지의 페이로드 문자열로 인코딩 된 base64 여야합니까?

Q2) 이미지를 단순히 BytesMessage로 반환 할 수 있습니까?

Q2.a) spring-amqp는 POJO를 반환하는 두 개의 별도 리스너와 BytesMessage를 반환하는 다른 리스너를 처리 할 수 ​​있습니까? 그럴 생각하지만, 여기에 몇 가지 의사 코드는 내가 부탁 해요 주위의 : 때때로 POJO를 할 수있다합니다 (MessageListener를 개체를 반환하는 경우

<listener-container> 
    <listener ref="requestHandlerA" method="handleMessage" queue-names="#{requestQueue.name}" /> 
    <listener ref="requestHandlerB" method="handleMessage" queue-names="#{requestQueue.name}" /> 
</listener-container> 

public class RequestHandlerA { 
    public ResponseDelegatePojo handleMessage(RequestDelegatePojo requestDelegate) {...} 
} 
public class RequestHandlerB { 
    public BytesMessage handleMessage(RequestDelegatePojo requestDelegate) {...} 
} 

Q2.b를) OR ...에서 BytesMessage의 수 있습니다 다른 시간) ... spring-amqp 프레임 워크는 런타임에 json으로 직렬화 된 POJO와 때때로 BytesMessage 을 다른 시간대에으로 다시 보내도록 조정할 수 있습니까?

답변

1

두 명의 청취자가 작동하지 않습니다. 동일한 대기열에 두 개의 경쟁 소비자가 만들어집니다. 한 가지 해결책은 다른 큐 (및 다른 리스너)를 사용하는 것입니다. 둘 다 요청 유형에 대해 동일한 큐를 사용하려면

, 아마 가장 간단한 솔루션은 리스너 POJO 반환 Object (POJO 또는 byte[]) (질문 2b)를 가지고 사용자 정의 MessageConverter을 사용하는 것입니다.

맞춤형 messageConverter는 매우 간단합니다.

if (object instanceof byte[]) { 
    return this.simpleMessageConverter.toMessage(object, messageProperties); 
else { 
    return this.jsonMessageConverter.toMessage(object, messageProperties); 
} 

SimpleMessageConvertercontentType 속성을 설정합니다 : 당신은 항상 인바운드에 JSON을 얻을 가정, 항상 중 하나 JsonMessageConverter 또는 SimpleMessageConverter에 위임한다 fromMessage()와 아웃 바운드 측면 (toMessage)에 JsonMessageConverter에 위임 할 것 application/octet-stream으로 변경 한 후 toMessage 메서드 (message.getMessageProperties().setContentType(...);.

)를 호출 한 후에 원하는대로 변경할 수 있습니다.