2013-03-07 24 views
0

我正在使用Glassfish 3.1.2,并设置了一个节点和两个实例的集群。Glassfish - 如何将JMS消息广播到群集中的所有实例?

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

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

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

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

的功能(该功能默认启用)功能说,与同一个客户端ID集群中的bean是共享,并有效地仅一个订阅。

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

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

回答

0

我不确定为什么要完全禁用此功能。在您提供的链接中,它明确指出您可以根据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)

+0

谢谢,但我不知道怎么去访问MDB的底层连接,也没怎么设置的ActivationSpec属性(可以这样使用注释做了什么?)我BTW现在的做法它的作用是使用下面的注解:@ActivationConfigProperty(propertyName =“clientID”,propertyValue =“$ {com.sun.aas.instanceName}”)这似乎为每个实例设置了不同的客户端ID。 – Darren 2013-03-08 14:29:02

相关问题