我有一些客户端既是ActiveMQ消息代理上单个主题的消费者,也是订阅者。所有客户端共享相同的代码,实际上它们使用完全相同的企业应用程序,包括:(1)生成消息的EJB,以及(2)消费消息的MDB。
问题基本上是如果我有客户端A,B和C,并且如果A发出消息,则A,B,C将全部接收消息。我不希望A收到自己的消息。
所以我玩了各种解决方案,我提出的最好的解决方案是在传出消息上设置字符串属性,例如的源= myVeryOwnID 即可。然后在MDB中,我设置了一个消息选择器,如 source<> 'myVeryOwnID'
不幸的是,这是一个糟糕的解决方案,因为我必须在源代码中设置此ID(在我的情况下,在注释中)。这意味着在部署新客户端时,我不能简单地将.EAR文件提供给某人,而是必须使用唯一的“source”属性进行专门的重新编译。
理想情况下,我想使用MAC地址作为ID,或者使用Glassfish中的ID设置(我正在使用GFv3)。
任何解决方案或想法都将受到高度赞赏!
答案 0 :(得分:2)
使用消息中的“source”消息属性和消息选择器是恕我直言的方法。现在,如果您不想在MDB中进行硬编码(在注释中),请使用deployment descriptor并在打包时设置消息选择器。
答案 1 :(得分:1)
ActiveMQ包含一个方法参数来解决这种情况。 ActiveMQSession.createConsumer()
方法和ActiveMQSession. createDurableSubscriber()
方法都提供了一个接受名为noLocal
的参数的变体。将noLocal
参数设置为true以避免接收在同一连接上本地发布的消息。
布鲁斯
答案 2 :(得分:0)
普通的旧System.GetProperty()和-D选项怎么样?您可以将唯一的应用程序ID设置为系统属性:
-Dmyapp.id=A
例如,在Tomcat中,您可以通过JAVA_OPTS变量传递系统属性:
export JAVA_OPTS='-Dmyapp.id=A'
然后你可以在应用程序中阅读它:
String appId = System.getProperty("myapp.id")
您只需为每个应用程序服务器设置系统变量即可。