Spring contentType从AMQP转到STOMP消息时遇到问题
以下是我的(总结) 当消息通过Spring contentType从AMQP转到STOMP消息时遇到问题,spring,spring-integration,spring-amqp,spring-websocket,Spring,Spring Integration,Spring Amqp,Spring Websocket,以下是我的(总结) 当消息通过、通过SimpleMessageListenerContainer和my''传入时,有效负载是一个字节[],contentType标头设置为application/octet stream 然后,我的convertMessage函数从负载中创建一条带有一些STOMP头的消息,并将其返回给sendMessage通道,STOMPSubtocolHandler将接管该通道。当它尝试将头转换为stomp消息时,即抛出异常java.lang.String无法转换为org.sp
、通过SimpleMessageListenerContainer
和my''传入时,有效负载是一个字节[],contentType标头设置为application/octet stream
然后,我的convertMessage函数从负载中创建一条带有一些STOMP头的消息,并将其返回给sendMessage通道,STOMPSubtocolHandler将接管该通道。当它尝试将头转换为stomp消息时,即抛出异常java.lang.String无法转换为org.springframework.util.MimeType
这是堆栈跟踪
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.util.MimeType
at org.springframework.messaging.support.MessageHeaderAccessor.getContentType(MessageHeaderAccessor.java:457)
at org.springframework.messaging.simp.stomp.StompHeaderAccessor.updateStompHeadersFromSimpMessageHeaders(StompHeaderAccessor.java:169)
at org.springframework.messaging.simp.stomp.StompHeaderAccessor.<init>(StompHeaderAccessor.java:127)
at org.springframework.messaging.simp.stomp.StompHeaderAccessor.wrap(StompHeaderAccessor.java:478)
at org.springframework.web.socket.messaging.StompSubProtocolHandler.getStompHeaderAccessor(StompSubProtocolHandler.java:402)
at org.springframework.web.socket.messaging.StompSubProtocolHandler.handleMessageToClient(StompSubProtocolHandler.java:329)
at org.springframework.integration.websocket.outbound.WebSocketOutboundMessageHandler.handleMessageInternal(WebSocketOutboundMessageHandler.java:151)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
原因:java.lang.ClassCastException:java.lang.String无法强制转换为org.springframework.util.MimeType
位于org.springframework.messaging.support.MessageHeaderAccessor.getContentType(MessageHeaderAccessor.java:457)
位于org.springframework.messaging.simp.stomp.StompHeaderAccessor.updateStompHeadersFromSimpMessageHeaders(StompHeaderAccessor.java:169)
位于org.springframework.messaging.simp.stomp.StompHeaderAccessor(StompHeaderAccessor.java:127)
位于org.springframework.messaging.simp.stomp.StompHeaderAccessor.wrap(StompHeaderAccessor.java:478)
位于org.springframework.web.socket.messaging.stompsubtocolhandler.getStompHeaderAccessor(stompsubtocolhandler.java:402)
位于org.springframework.web.socket.messaging.stompsubtocolhandler.handleMessageToClient(stompsubtocolhandler.java:329)
位于org.springframework.integration.websocket.outboundMessageHandler.handleMessageInternal(WebSocketOutboundMessageHandler.java:151)
位于org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
我觉得我没有添加我需要的标题,或者我需要使用一个消息转换器。。。或者也许我只是在一起做得不好
我需要对消息做什么来为StompSubtocolHandler准备它
我是否通过将
与SimpleMessageListenerContainer一起使用来正确处理来自AMQP的消息?(我需要容器随着订阅量的增加动态添加更多队列)但任务很好
当它准备好的时候,你介意把它作为一个样本分享给社区吗?
作为此项目的请求:
由于StackTrace指出内容类型
是字符串
,因此您可以在subscriptionHandler
中重写它:
AmqpMessageHeaderAccessor amqpMessageHeaderAccessor = AmqpMessageHeaderAccessor.wrap(message);
....
.setHeader(MessageHeaders.CONTENT_TYPE, amqpMessageHeaderAccessor.getContentType())
更新
顺便说一句,我们最近修复了contentType
歧义:。使用最新的SF4.1.5
,您不再需要关心contentType
转换。它是在框架中自动完成的。太棒了,工作得非常好。我可能无法在GitHub上共享该项目,尽管我真的很想。我写这篇文章的合同,我不相信我可以分享。不过我会调查的。
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.util.MimeType
at org.springframework.messaging.support.MessageHeaderAccessor.getContentType(MessageHeaderAccessor.java:457)
at org.springframework.messaging.simp.stomp.StompHeaderAccessor.updateStompHeadersFromSimpMessageHeaders(StompHeaderAccessor.java:169)
at org.springframework.messaging.simp.stomp.StompHeaderAccessor.<init>(StompHeaderAccessor.java:127)
at org.springframework.messaging.simp.stomp.StompHeaderAccessor.wrap(StompHeaderAccessor.java:478)
at org.springframework.web.socket.messaging.StompSubProtocolHandler.getStompHeaderAccessor(StompSubProtocolHandler.java:402)
at org.springframework.web.socket.messaging.StompSubProtocolHandler.handleMessageToClient(StompSubProtocolHandler.java:329)
at org.springframework.integration.websocket.outbound.WebSocketOutboundMessageHandler.handleMessageInternal(WebSocketOutboundMessageHandler.java:151)
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)
AmqpMessageHeaderAccessor amqpMessageHeaderAccessor = AmqpMessageHeaderAccessor.wrap(message);
....
.setHeader(MessageHeaders.CONTENT_TYPE, amqpMessageHeaderAccessor.getContentType())