如何让我的MDB忽略来自自己的消息?

时间:2010-02-21 11:18:13

标签: java-ee glassfish jms activemq

我有一些客户端既是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)。

任何解决方案或想法都将受到高度赞赏!

3 个答案:

答案 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")

您只需为每个应用程序服务器设置系统变量即可。