首页 文章

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

提问于
浏览
15

我遇到以下设置问题:

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 回答

  • 15

    尝试额外的acitivation配置属性:

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

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

  • 0

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

相关问题