我一直在阅读谷歌的其他结果,有些人说我必须给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();才能返回消息?
发布于 2015-09-25 06:09:17
,我是否必须在每次捕获时调用context.setRollbackOnly()才能将消息放回?
这取决于我们,如果您想回退所有异常的消息,是的。如果是坏/坏消息,则没有回滚事务的意义,最好通过记录异常和消息的有效负载来丢弃。
用于您的第一个查询,如果onMessage上有异常,消息将被放回队列中,请查找以下要点:
JMS服务器可以重新传递消息,因为: java.lang.Error或java.lang.RuntimeException已从接收方/MDB的onMessage方法中抛出 用户在MDB的ejbcontext.setRollbackOnly方法中调用了ejbcontext.setRollbackOnly() (这仅适用于容器托管事务) 由于某种原因,参与事务的MDB失败。
下面的文章非常好,您可以参考它了解更多细节:
http://weblogic-wonders.com/weblogic/2011/01/10/working-with-jms-and-the-standard-issues-in-jms/
https://stackoverflow.com/questions/32767374
复制相似问题