我一直在阅读SO和其他一些谷歌搜索结果,我感到很困惑,有人说我要打电话给context.setRollbackOnly();
其他人说这不是必需的,因为MDB会自己做。
所以,我有一个MessageDrivenBean
课程,可以接收来自JMS Queue
的消息。
@MessageDriven(name = "MyEventReceiverJMS", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/TheQueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")
})
public class MyEventReceiverJMS implements MessageListener {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Resource
private MessageDrivenContext context;
@Override
public void onMessage(Message message) {
try {
// Some logic goes here
}
catch (JMSException ex) {
logger.error("JMSException|could not retrieve object from the message body - reason: {}", ex.getMessage());
context.setRollbackOnly();
}
catch (JSONException ex) {
logger.error("error while creating the JSON - reason: ", ex.getMessage());
context.setRollbackOnly();
}
catch (IOException ex) {
logger.error("could not communicate with the server - reason: {}", ex.getMessage());
context.setRollbackOnly();
}
}
}
我的问题是,如果onMessage
上存在异常,message
(或我称之为事件)会被MDB放回队列,还是我必须打电话每个捕获的context.setRollbackOnly();
都要回复消息?
答案 0 :(得分:2)
我是否必须在每个catch上调用context.setRollbackOnly()才能收回消息?
这取决于我们,如果你想回滚所有例外的消息,是的。 如果它是一个坏/有害的消息,没有回滚事务的意义,最好通过记录异常和消息的有效负载来丢弃。
对于您的第一个查询,如果onMessage上有异常,则会将消息放回到队列中,请找到以下几点:
由于以下原因,JMS服务器可以重新发送消息:
抛出了java.lang.Error或java.lang.RuntimeException Receiver / MDB的onMessage方法
用户在他的MDB中调用了ejbcontext.setRollbackOnly() onMessage方法(这仅适用于Container Managed Transaction)
参与交易的MDB因某种原因失败。
以下帖子非常好,您可以参考以获取更多详细信息:
http://weblogic-wonders.com/weblogic/2011/01/10/working-with-jms-and-the-standard-issues-in-jms/