我正在使用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,但我不确定是否可以在运行时更改...
答案 0 :(得分: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)