如何限制侦听Jboss JMS队列的MDB实例的数量

时间:2011-02-11 20:11:11

标签: jboss jms ejb-3.0 message-driven-bean jboss-4.2.x

我遇到以下设置问题:

Java应用程序将电子邮件msg发送到JMS队列,然后侦听队列的MDB使用onMessage方法获取电子邮件msg,它在Gmail SMTP上打开连接,将电子邮件发送到SMTP并关闭连接。对JMS队列中的所有消息执行此操作。

当我在队列中同时拥有最多5条消息时,它工作得很好。 5个不同的MDB实例同时拾取所有邮件,因此我有5个并发连接到Gmail SMTP服务器。但是当JMS队列中有更多消息时,我从Gmail SMTP服务器收到连接错误。首先正确发送了5条消息,但没有其他消息发送,因此其他消息丢失了,因为它们不再在队列中。

所以我的问题是,是否可以限制将侦听JMS队列的MDB实例的数量?如果我最多有5个MDB,那么即使队列中有1000条消息,也只需要更长的时间来清空队列,但至少我不会丢失任何消息。

非常感谢任何其他解决此问题的建议。

这是Jboss版本:

  

[服务器]版本ID:JBoss [Trinity] 4.2.3.GA(build:SVNTag = JBoss_4_2_3_GA date = 200807181417)

,MDB的配置如下:

@MessageDriven(activationConfig = {   
  @ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Queue" ),   
  @ActivationConfigProperty( propertyName = "destination", propertyValue = "queue/emailQueue")  
})

你需要更多吗?

由于

编辑2011-02-14
也许我想错误地限制MDB实例的数量。我看到了一个关于JMS线程数量的配置。如果我限制将发布到MDB的线程数,也许它会解决我的问题?在再次发布消息之前,JMS是否会等到MDB可用?这样做会有副作用吗?你虽然请。 由于
结束编辑

2 个答案:

答案 0 :(得分:15)

尝试其他激活配置属性:

@ActivationConfigProperty( propertyName = "maxSession", propertyValue = "someNumber")

其中someNumber是您想要的最大实例数。

答案 1 :(得分:0)

如果JBoss 4有一个限制无状态会话bean实例的选项,一个选项可能是将消息处理代码移动到这个bean,并将传入的JMS消息传递给它。 (IIRC bean中的任何失败都会导致JMS消息未被确认,因此它会自动重试。)