调度MDB

时间:2012-08-14 08:11:28

标签: jms scheduler jboss-mdb

我正在寻找一种安排MDB的方法。我的要求是MDB设置为从公司提供系统。该系统每晚都会进行维护,但其他系统不了解它并可能继续尝试喂它。持续队列非常棒,我的消息可以被填充,直到系统重新联机。

我怎么能管理它?我已经遇到过这个问题:schedule a message driven bean to access a queue during certain times?但是它使用java 7,如果服务器重新启动,消息会丢失(消息从JMS队列中取出并保留在内存中直到定时器处理它)。

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

让我的MDB离线一段时间的任何想法?

2 个答案:

答案 0 :(得分:0)

大多数JBoss版本发布management MBean,允许您停止MDB上的传递。 但是,如果您正在使用EJB3,它们会自动启动,因此如果在MDB的中断期间发生启动,则需要注册启动类以在启动时停止启动MDB。一旦过了那个snafu,你可以安排一个简单的quartz job来根据你的交付窗口启动和停止MDB。

答案 1 :(得分:0)

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

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

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

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