Glassfish -如何向集群中的所有实例广播JMS消息



我使用的是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,但我不确定是否可以在运行时更改…

我不知道为什么要完全禁用这个功能。在您提供的链接中,它清楚地说明了您要根据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(以)

最新更新