停止启动 appServer 后的 jms 消息非持久性重新传递
jms message non persistent redelivery after stop-start appServer
使用 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,也会重新传送消息。
我想避免重新发送邮件。
这可能(以及如何)吗?
发送消息时,您执行setDeliveryMode(DeliveryMode.NON_PERSISTENT);
,这意味着在消息代理重启之间不会保存消息。如果您以嵌入式模式(默认)使用 OpenMQ 代理,它将与服务器一起重新启动。所以重启后,消息不存在,无法再次发送。
更新:
但是,您的代码在与发送消息的生产者不同的生产者上设置了传递模式(创建生产者,设置传递模式,然后丢弃;下一行创建一个新的生产者,它发送消息) .
需要将创建的producer存储在一个变量中,设置发送方式,然后使用同一个producer发送消息:
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);
}
使用 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,也会重新传送消息。
我想避免重新发送邮件。
这可能(以及如何)吗?
发送消息时,您执行setDeliveryMode(DeliveryMode.NON_PERSISTENT);
,这意味着在消息代理重启之间不会保存消息。如果您以嵌入式模式(默认)使用 OpenMQ 代理,它将与服务器一起重新启动。所以重启后,消息不存在,无法再次发送。
更新:
但是,您的代码在与发送消息的生产者不同的生产者上设置了传递模式(创建生产者,设置传递模式,然后丢弃;下一行创建一个新的生产者,它发送消息) . 需要将创建的producer存储在一个变量中,设置发送方式,然后使用同一个producer发送消息:
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);
}