Jakarta ee 在发送到死信队列之前修改JMS消息

Jakarta ee 在发送到死信队列之前修改JMS消息,jakarta-ee,jms,weblogic11g,java-ee-5,Jakarta Ee,Jms,Weblogic11g,Java Ee 5,我正在使用MDB来处理JMS消息。在出现异常的情况下,理想情况下,我希望在JMS消息上也标记错误详细信息(异常消息),并允许它进入死信队列(在Weblogic server中配置) 在catch块中,我对JMS消息对象进行了如下修改 msg.clearProperties(); msg.setStringProperty("error", e.getMessage()); 并抛出一个RuntimeException,该异常将消息使用过程标记为失败,因此它移动到一个失败的请求队列(我将Weblo

我正在使用
MDB
来处理
JMS
消息。在出现异常的情况下,理想情况下,我希望在
JMS
消息上也标记错误详细信息(异常消息),并允许它进入死信队列(在Weblogic server中配置)

在catch块中,我对
JMS
消息对象进行了如下修改

msg.clearProperties();
msg.setStringProperty("error", e.getMessage());
并抛出一个
RuntimeException
,该异常将消息使用过程标记为失败,因此它移动到一个失败的请求队列(我将Weblogic配置为不重新传递消息)

根据配置,消息Failes进入失败的请求队列-但是不包括“error”属性。阅读了
JMS
1.1规范文档后,它表示重新交付的
JMS
消息将具有“原始”内容。在这种情况下,我强制Weblogic不重新传递它-不确定为什么我看不到在消息上设置的自定义属性


这是预期的吗?如果是,有什么解决办法吗?

这是因为您回滚了事务。您不能回滚JMS事务,并且仍然对消息进行更改


您应该做的是将修改后的消息手动发送到同一事务中的错误队列。在这种情况下,您不能从MDB抛出异常。

同意。另外,考虑使用MQDLH。死信队列在WebSphere MQ中定义良好,它们定义了一些死信头(MQDLH)-使用它们(不清除以前的属性)可以帮助管理员执行分析或稍后重播消息。