0

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

4

1 回答 1

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)

于 2013-03-08T07:17:35.007 回答