【问题标题】:Glassfish - How to broadcast JMS message to all instances in a cluster?Glassfish - 如何向集群中的所有实例广播 JMS 消息?
【发布时间】:2013-02-23 02:15:12
【问题描述】:

我使用的是 Glassfish 3.1.2,并设置了一个包含一个节点和两个实例的集群。

我的应用程序中有一个消息驱动 bean,它订阅了我部署到集群的主题。

当我向主题发布消息时,我希望两个实例都接收消息。

但是,在实践中,我发现只有一个实例接收到消息。

我相信我遇到了一个名为“共享订阅”的功能 http://docs.oracle.com/cd/E18930_01/html/821-2438/gjzpg.html#MQAGgjzpg

该功能(默认启用)表示集群中具有相同客户端 ID 的 bean 是共享的,并且实际上只是一个订阅。

它说默认情况下,MDB 的客户端 ID 是它的名称,这意味着我的两个实例都使用相同的客户端 ID。

所以除了完全禁用此功能之外,我想知道是否可以设置一个 MDB 以便每个实例使用不同的客户端 ID 订阅?这似乎有点棘手,因为两个实例都使用相同的 WAR 文件。我认为您可以在注释中设置客户端 ID,但我不确定是否可以在运行时更改...

【问题讨论】:

    标签: glassfish ejb jms cluster-computing message-driven-bean


    【解决方案1】:

    我不确定您为什么要完全禁用此功能。在您提供的链接中,它清楚地表明您根据 ActivationSpec/MDB 进行配置。据我了解,它只会影响您手头的MDB。

    对于 MDB,将 ActivationSpec 属性 useSharedSubscriptionInClusteredContainer 设置为 false。准确地做到这一点 与其他 ActivationSpec 属性一样,使用 MDB 本身或部署描述符中的注释 ejb-jar.xml 或 glassfish-ejb-jar.xml。

    但您当然可以在运行时动态设置连接上的客户端 ID。请注意,您可能需要自己处理 JMS 连接,而不是依赖容器管理的功能。

    http://docs.oracle.com/javaee/6/api/javax/jms/Connection.html#setClientID(java.lang.String)

    【讨论】:

    • 谢谢,但我不确定如何访问 MDB 的底层连接,也不确定如何设置 ActivationSpec 属性(可以使用注释来完成吗?)顺便说一下我现在的方法确实有效的是使用以下注释:@ActivationConfigProperty(propertyName = "clientID", propertyValue="${com.sun.aas.instanceName}") 这似乎为每个实例设置了不同的客户端 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2016-05-11
    • 2020-12-09
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多