0

我正在寻找一种安排 MDB 的方法。我的要求是 MDB 设置为从公司提供系统。该系统每晚都会进行维护,但其他系统对此一无所知,可能会继续尝试为其提供服务。持久队列非常棒,因为它可以让我的消息被丢弃,直到系统重新上线。

我怎么能做到这一点?我已经遇到过这个问题:安排消息驱动的 bean 在特定时间访问队列?但它使用 java 7,最糟糕的是,如果服务器重新启动,消息会丢失(消息从 JMS 队列中取出并保存在内存中,直到计时器处理它)。

另一个用途是实现“重试”队列。如果出现错误,我想重试处理我的消息,但不是立即,仅在一定时间后。

有什么想法可以让我的 MDB 离线一段时间吗?

4

2 回答 2

0

大多数 JBoss 版本都发布了一个管理 MBean,允许您停止在 MDB 上的交付。但是,如果您使用 EJB3,它们会自动启动,因此如果在 MDB 的停电期间启动,您将需要注册一个启动类以在启动时停止启动 MDB。一旦过了这个问题,您就可以安排一个简单的石英作业来根据您的交付窗口启动和停止 MDB。

于 2012-08-14T20:00:27.847 回答
0

好吧,看起来没有办法以通用方式暂停 MDB。就像大多数人会回答的那样,最好的解决方案是使用DLQ(或DMQ)。

现在,如果我想在消息上引入计时器,我将生产者的生存时间设置为我希望消息等待的时间。然后我将它发送到一个普通队列,比如说没有消费者的等待队列。过期后,消息将发送到默认目标(对于 Glassfish MQ, mq.sys.dmq,请确保创建一个 jms 资源,并将mq.sys.dmq作为imqDestinationName)。我有一个 MDB 监听错误队列并负责再次发送消息。现在,如果我想“关闭”一个队列一段时间,当消息到达队列时,我会检查当前时间是否允许。只需将生存时间设置为下一个开放时间之前的时间量并将其发送到 waitingQueue。

我从一开始就没有使用它的原因是我陷入了一些陷阱。以下是在使用带有 Glassfish 3.1.1 及其嵌入式 MQ 的 DMQ 时需要设置的一些有用属性。

imq.message.expiration.interval=1用于在向 DMQ 发送超时消息之前每个队列的轮询间隔。默认值为 60 秒。如果您像我一样想以很少的延迟测试您的应用程序,那么这就是您所需要的。

于 2012-08-16T07:43:07.163 回答