gpt4 book ai didi

java - Spring JMS 监听器应如何处理具有空负载的消息?

转载 作者:行者123 更新时间:2023-11-30 07:28:20 25 4
gpt4 key购买 nike

我正在为我工​​作的公司开发一个错误队列监视工具,并且我已经使用 Spring Boot 启动并运行了这个工具,并使用注释(而不是使用任何 xml)完成了我所有的 bean 设置。该工具(到目前为止)按预期工作,除了以下事实:在我们的错误队列(IBM 的 MQ 系列)上,一些 xml 消息包含一个新行,我的 JMS 监听器将其作为自己的内容拾取。事实上,它似乎专门逐行处理 xml 消息,而不是处理整个消息(尽管它可以很好地处理整个 HL7 消息)。这个功能超出了我的知识范围,但这是它自己的问题。-

当我的 JMS 监听器捕获这个换行符时,它会抛出一个异常,指出消息有效负载不能为空,然后对索引零处的某些内容进行胡言乱语。它启动回滚并调用我的 JMSErrorhandler,问题是它仍然停留在这个循环中(永远......)。从调试器看来,这个异常发生在 Spring 代码中的某个位置,就在它进入我的 processOrder() 方法之前,因为它永远不会到达我的断点。我不在工作现场,所以我无法访问代码,也无法访问堆栈跟踪(希望我对错误的可怕解释就足够了),但我可以说监听器是直接从 Spring 站点的这个建模的:

@Component
public class MyService {

@JmsListener(destination = "myDestination")
public void processOrder(String data) { ... }
}

有什么我可以访问的吗?为了防止发生回滚,是否应该选择换行符之类的东西?另外,就像一般性声明一样,换行符可能是由另一个将这些消息放入队列的应用程序引起的,但我想涵盖所有基础知识,并获得一些知识。

编辑:为了澄清在我的监听器能够处理消息之前,Spring 代码中的某处引发了异常。我明白了:

Caused by: org.springframework.messaging.converter.MessageConversionException: No converter found to convert to class java.lang.String, message=GenericMessage [payload=
JMSMessage class: jms_none
JMSType: null
JMSDeliveryMode: 2
JMSExpiration: 0
JMSPriority: 5
JMSMessageID: ID:414d5120514d5f4445565f595731202056d7ea6b28797f6b
JMSTimestamp: 1460469585820
JMSCorrelationID: null
JMSDestination: null
JMSReplyTo: null
JMSRedelivered: false
JMSXAppID: perl
JMSXDeliveryCount: 1
JMSXUserID: cisadm
JMS_IBM_Character_Set: ISO-8859-1
JMS_IBM_Encoding: 273
JMS_IBM_Format: MQSTR
JMS_IBM_MsgType: 8
JMS_IBM_PutApplType: 6
JMS_IBM_PutDate: 20160412
JMS_IBM_PutTime: 13594582, headers={JMS_IBM_Character_Set=ISO-8859-1, JMS_IBM_MsgType=8, JMSXUserID=cisadm , jms_priority=5, JMS_IBM_Encoding=273, jms_timestamp=1460469585820, JMSXAppID=perl , JMS_IBM_PutApplType=6, JMS_IBM_Format=MQSTR , jms_redelivered=false, JMS_IBM_PutDate=20160412, jms_deliveryMode=2, JMSXDeliveryCount=1, JMS_IBM_PutTime=13594582, id=1dfefda3-49cb-dfcc-1a31-b8087e3d6ebd, jms_expiration=0, jms_messageId=ID:414d5120514d5f4445565f595731202056d7ea6b28797f6b, timestamp=1460469638210}]
at org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver.resolveArgument(PayloadArgumentResolver.java:118) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:139) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:108) ~[spring-messaging-4.2.4.RELEASE.jar:4.2.4.RELEASE]
at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:90) ~[spring-jms-4.2.4.RELEASE.jar:4.2.4.RELEASE]
... 10 more

不知道如何解决这个问题。有建议吗?

最佳答案

这有足够的观点促使我发布这个答案。我基本上通过这篇文章以更直接的方式重新问了这个问题:Spring JMSListener - How should it handle empty payloads? ,并得出结论。从评论中采纳了别人的建议,只是将参数类型从 String 更改为 javax.jms.Message 。这允许具有空负载(即空字符串,甚至换行符)的消息不会影响监听器的流程,它只会处理它们。

现在您所要做的就是从传入的 Message 中提取字符串,然后您可以检查其内容并决定如何处理它。所以听众最终看起来像这样:(或者至少是我所做的)

@JmsListener
public void processOrder(Message message) throws JMSException {
String convertedMessage = ((TextMessage) message).getText();
:
:
}

达菲莫是正确的,因为没有发生任何魔法。正如您在另一篇文章中所看到的,如果您不想使用这样的解决方案,您可以实现自己的消息转换器来对消息执行您想要的操作。

关于java - Spring JMS 监听器应如何处理具有空负载的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36518678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com