3

我有几个客户端,它们既是 ActiveMQ 消息代理上单个主题的消费者又是订阅者。所有客户端共享相同的代码,它们实际上使用完全相同的企业应用程序,包括:(1) 生成消息的 EJB,以及 (2) 使用消息的 MDB。

问题基本上是如果我有客户端A,B和C,并且如果A发出消息,那么A,B,C都会收到消息。我不希望 A 收到自己的消息。

所以我尝试了各种解决方案,我想出的最好的一个是在传出消息上设置一个字符串属性,例如source=myVeryOwnID。然后在 MDB 中,我设置了一个消息选择器,例如source <> 'myVeryOwnID'

不幸的是,这是一个糟糕的解决方案,因为我必须在源代码中设置这个 ID(在我的例子中,在注释中)。这意味着在部署新客户端时,我不能简单地将 .EAR 文件提供给某人,而是必须使用唯一的“源”属性专门重新编译。

理想情况下,我想使用 MAC 地址作为 ID,或者可能是 Glassfish 中设置的 ID(我使用的是 GFv3)。

任何解决方案或想法将不胜感激!

4

3 回答 3

2

在消息中使用“源”消息属性和消息选择器是恕我直言的方法。现在,如果您不想在 MDB 中硬编码(在注释中),那么使用部署描述符并在打包时设置消息选择器。

于 2010-02-22T08:38:03.293 回答
1

ActiveMQ 包含一个方法参数来准确解决这种情况。ActiveMQSession.createConsumer()方法和方法都ActiveMQSession. createDurableSubscriber()提供了一个变量,它接受一个名为 的参数noLocal。将noLocal参数设置为 true 以避免接收在同一连接上本地发布的消息。

布鲁斯

于 2010-03-03T16:50:16.420 回答
0

What about the plain old System.GetProperty() and -D option? You can set the unique application ID as the system property:

-Dmyapp.id=A

For example in Tomcat you can pass system property via the JAVA_OPTS variable:

export JAVA_OPTS='-Dmyapp.id=A'

Then you can read it in the application:

String appId = System.getProperty("myapp.id")

All you have to do it to set system variable for each of your application server.

于 2010-02-28T12:16:07.597 回答