好的,所以您的问题实际上是您在处理消息时停止侦听 JMS 队列,然后重新注册自己。当然,您可能会在处理前一条消息时错过消息。
我建议永远不要从 JMS 队列中注销自己,并且为了确保您一次处理一条消息,您可以使用一个线程池来推送您的处理。
例如,如果以前你有这样的事情:
public void onNewJMSMessage(JMSMessage message) {
unregisterMySelf();
processMessage(message);
registerMySelf();
}
改用这个:
像这样启动一个类成员:
private ExecutorsService processingPool = Executors.newSingleThreadExecutor();
和
public void onNewJMSMessage(final JMSMessage message) {
processingPool.submit(new Runnable() {
@Override
public void run() {
processMessage(message);
}
});
}
这将保证一次只处理一条消息(如果封闭类是唯一的,否则您将必须设置一个单例以确保单线程池的唯一性)。
完成之后,这将主要允许您Thread.sleep
在 EJB 中删除它,这是邪恶的,也是各种令人头疼的根源。