使用jms队列。
ejb发件人:
@Resource(lookup = "jms/csPdvQueue")
private Queue csPdvQueue;
@Inject
private JMSContext jmsContext;
方法发送消息:
public void asynchWatched(Pdv pdv, boolean pending) {
jmsContext.createProducer().setDeliveryMode(DeliveryMode.NON_PERSISTENT);
jmsContext.createProducer().send(csPdvQueue, pdv);
}
ejb消费者:
@MessageDriven(mappedName = "jms/csPdvQueue")
public class PdvProcessorMdb implements MessageListener {
@Override
public void onMessage(Message message) {
... execute some businesslogic...
}
}
如果应用程序服务器(payara)在消息消耗(onMessage)期间退出,则事务正确回滚。
当应用程序服务器再次启动时,即使我已设置DeliveryMode.NON_PERSISTENT,也会重新传送邮件。
我想避免重新发送消息。
是否可能(以及如何)?
答案 0 :(得分:1)
发送邮件时,您执行setDeliveryMode(DeliveryMode.NON_PERSISTENT);
,这意味着在重新启动邮件代理之间不会保存邮件。如果在嵌入模式下使用OpenMQ代理(默认),它将与服务器一起重新启动。因此,重新启动后,该消息不存在,无法再次发送。
<强>更新强>
但是,您的代码将交付模式设置在与发送消息的生产者不同的生产者上(创建生成器,设置交付模式,然后丢弃;下一行创建一个新的生产者,发送消息)。 您需要将创建的生成器存储在变量中,设置传递模式,然后使用相同的生成器发送消息:
public void asynchWatched(Pdv pdv, boolean pending) {
JMSProducer producer = jmsContext.createProducer();
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
producer.send(csPdvQueue, pdv);
}
您可以利用流畅的API缩短时间:
public void asynchWatched(Pdv pdv, boolean pending) {
jmsContext.createProducer()
.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
.send(csPdvQueue, pdv);
}