【问题标题】:How to limit the number of MDB instances listening to a Jboss JMS queue如何限制监听 Jboss JMS 队列的 MDB 实例的数量
【发布时间】:2013-01-29 23:52:01
【问题描述】:

以下设置有问题:

Java 应用程序将电子邮件消息发送到 JMS 队列,然后侦听队列的 MDB 使用 onMessage 方法获取电子邮件消息,它打开 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(内部版本:SVNTag=JBoss_4_2_3_GA 日期=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 可用后再发布 msg 吗?这样做有什么副作用吗?你虽然请。 谢谢
结束编辑

【问题讨论】:

  • JBoss 的哪个版本?您的 MDB 配置是什么样的?
  • @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") } ) 你需要更多吗?谢谢
  • 将信息添加到问题中,作为评论发布时不可读。
  • @skaffman:对不起!我现在就去做。

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


【解决方案1】:

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

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

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

【讨论】:

  • 我认为应该是 maxSessions 而不是 maxSession。我已经尝试了值 1 和它同时发送多个。
  • @LoJuego 本教程列出了所有支持的激活配置属性:docs.jboss.org/ejb3/docs/tutorial/mdb/mdb.html。 maxSession 是正确的属性名称。
  • 我可以在 WebLogic 上应用类似的属性吗?
  • 我猜 WebLogic 提供了类似的东西,但我怀疑属性名称是否相同。 maxSession 是对 JCA 规范属性的 JBoss 扩展。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 1970-01-01
    • 2012-01-03
    • 2020-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2012-02-03
    相关资源
    最近更新 更多