如何暂时禁用消息侦听器

2022-09-02 21:48:54

暂时禁用消息侦听器的好方法是什么?我想解决的问题是:

  • JMS 消息由消息侦听器接收
  • 我在尝试处理邮件时遇到错误。
  • 我等待我的系统再次准备就绪,以便能够处理消息。
  • 在我的系统准备就绪之前,我不想再发送任何消息,所以...
  • ...我想禁用消息侦听器。
  • 我的系统已准备好再次进行处理。
  • 将处理失败的消息,并确认 JMS 消息。
  • 再次启用消息侦听器。

现在,我正在使用 Sun App Server。我通过在 MessageConsumer 中将其设置为 null 来禁用消息侦听器,并使用 setMessageListener(myOldMessageListener) 再次启用它,但在此之后,我不再收到任何消息。


答案 1

如果在系统准备好再次处理消息之前不从侦听器方法返回,该怎么办?这将阻止 JMS 在该使用者上传递另一条消息。onMessage()

这是异步等效于在同步情况下不调用。receive()

给定的 JMS 会话没有多线程,因此消息管道会一直保持到方法返回。onMessage()

我不熟悉动态调用的含义。javadoc表示,如果称为“当消息被现有侦听器或同步使用者使用时”,则存在未定义的行为。如果您从 内部调用 ,则听起来您正在遇到未定义的情况。setMessageListener()onMessage()

在连接级别有启动/停止方法,如果这对您来说不是太粗粒度。


答案 2

通过解决方法将消息侦听器替换为 receive() 循环解决了问题,但我仍然对如何禁用消息侦听器并很快再次启用它感兴趣。


推荐