如何限制在Jboss JMS队列上监听MDB实例的数量

15
我在以下设置中遇到了问题:
一个Java应用程序向JMS队列发送电子邮件消息,然后监听队列的MDB使用onMessage方法获取电子邮件消息,它在Gmail SMTP上打开连接,将电子邮件发送到SMTP并关闭连接,在JMS队列中处理所有消息。
当我队列中最多有5条消息时,这很有效。 5个不同的MDB实例同时选择所有消息,因此我拥有5个并发连接到Gmail SMTP服务器。 但是,当JMS队列中存在更多的消息时,我会从Gmail SMTP服务器收到连接错误。前5条消息已成功发送,但其余的一组没有发送,因此其他消息因不再在队列中而丢失。
所以我的问题是,是否可以限制将侦听JMS队列的MDB实例数? 如果我最多只有5个MDB,则即使队列中有1000条消息,也只需花费更长的时间来清空队列,但至少我不会失去任何消息。
非常感谢任何解决此问题的建议。
这里是Jboss版本:
[Server] Release 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再次发布消息吗?这样做是否会有任何副作用?请发表您的想法。 谢谢
编辑结束


哪个版本的JBoss?你的MDB配置是什么样子的? - skaffman
@skaffman:Jboss版本为:[Server] Release 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") } ) 需要更多信息吗?谢谢。 - Alain
将信息添加到问题中,作为评论发布时不易阅读。 - skaffman
@skaffman:抱歉!我现在就去做。 - Alain
请参阅https://dev59.com/ZFvUa4cB1Zd3GeqPpQfQ。 - Vadzim
2个回答

16

尝试添加一个额外的激活配置属性:

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

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


我认为应该是maxSessions而不是maxSession。我已经尝试了值为1的两种情况,但它仍然同时发送了多个。 - Lo Juego
3
所有支持的激活配置属性都在这个教程中列出:http://docs.jboss.org/ejb3/docs/tutorial/mdb/mdb.html 。maxSession是正确的属性名称。 - Brent Worden
我可以在WebLogic上应用类似的属性吗? - Chen Sheng-Lun
我猜WebLogic提供了类似的东西,但我怀疑属性名称不同。maxSession是JBoss对JCA规范属性的扩展。 - Brent Worden

1
如果JBoss 4有限制无状态会话bean实例的选项,那么一种选择是将消息处理代码移动到此bean中,并将传入的JMS消息传递给它。(如果我没记错,bean中的任何故障也会导致JMS消息未被确认,因此它会自动重试)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接