【发布时间】:2015-05-05 14:07:58
【问题描述】:
我想通过一个独立的 HornetQ 服务器将 JMS 消息从一台 Jboss 服务器发送到另一台服务器。 这样我可以在目标服务器崩溃的情况下稍后传递消息(提供持久订阅)。
但是,我已经在每个 Jboss 内部路由了消息。我想要一个不会与这些冲突的配置。
所需解决方案的拓扑在图表上可视化。
如何实现这个配置?
【问题讨论】:
我想通过一个独立的 HornetQ 服务器将 JMS 消息从一台 Jboss 服务器发送到另一台服务器。 这样我可以在目标服务器崩溃的情况下稍后传递消息(提供持久订阅)。
但是,我已经在每个 Jboss 内部路由了消息。我想要一个不会与这些冲突的配置。
所需解决方案的拓扑在图表上可视化。
如何实现这个配置?
【问题讨论】:
让我们从配置独立的 HornetQ 开始。您从他们的download page 下载独立服务器。
接下来,您必须配置主题。请将您的主题添加到%HORNETQ-HOME%\config\stand-alone\non-clustered\hornetq-jms.xml 文件中:
<topic name="Topic1">
<entry name="java:/topic/Topic1"/>
</topic>
您可能想先在一台机器上测试配置,所以我建议将 HornetQ 侦听消息的端口从 5455 更改为 5456。
请编辑%HORNETQ-HOME%\config\stand-alone\non-clustered\hornetq-configuration.xml 文件以更改这些端口。您还希望能够注册持久订阅者,因此将这两行添加到同一文件中的 <security-setting match="#"> 元素中:
<permission type="createDurableQueue" roles="guest"/>
<permission type="deleteDurableQueue" roles="guest"/>
然后通过运行 %HORNETQ-HOME%\run.bat 启动独立的 HornetQ。
首先我们将了解如何向这个新创建的主题发送消息。为此,我们需要在 Jboss Server 1 上指定一个连接工厂。在%JBOSS-HOME1%\standalone\configuration\standalone-full.xml的jboss:domain:messaging子系统中,请添加新的池化连接工厂:
<pooled-connection-factory name="StandaloneHornetQConnectionFactory">
<transaction mode="xa"/>
<connectors>
<connector-ref connector-name="standalone-hornetq-connector"/>
</connectors>
<entries>
<entry name="java:jboss/exported/jms/StandaloneHornetQConnectionFactory"/>
</entries>
</pooled-connection-factory>
从现在开始,当您想向主题 1 发送消息时,您必须使用此连接工厂。这通常通过依赖注入来完成:
@Resource(lookup = "java:jboss/exported/jms/StandaloneHornetQConnectionFactory")
private ConnectionFactory connectionFactory;
正如您在上面看到的,我们引用了standalone-hornetq-connector,但还没有。让我们通过将另一个 netty 连接器添加到 <connectors> 来创建它:
<connectors>
<netty-connector name="standalone-hornetq-connector" socket-binding="standalone-hornetq-socket"/>
<netty-connector name="netty" socket-binding="messaging"/>
<netty-connector name="netty-throughput" socket-binding="messaging-throughput">
<param key="batch-delay" value="50"/>
</netty-connector>
<in-vm-connector name="in-vm" server-id="0"/>
</connectors>
如您所见,我们需要standalone-hornetq-socket 套接字绑定。让我们在<socket-binding-group> 子元素中创建它:
<outbound-socket-binding name="standalone-hornetq-socket">
<remote-destination host="localhost" port="5446"/>
</outbound-socket-binding>
如您所见,这是一个出站套接字绑定,将用于向我们的 HornetQ Standalone 服务器发送消息,该服务器正在侦听 5446 端口。此配置足以在 Jboss Server 1 上通过 Standalone HornetQ 服务器向 Jboss Server 2 发送消息。
为了能够在 Jboss Server 2 上接收消息,我们必须再次在%JBOSS-HOME1%\standalone\configuration\standalone-full.xml 中重复上述配置。不过这次我们将 Jboss Server 2 的端口偏移了port-offset:3,以便能够在同一台机器上工作:
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:3}">
如果您将服务器放在不同的机器中,则不需要此步骤(如果您这样做,请相应地更改localhost ;))。
现在我们可以创建 MDB,它将成为 主题 1 的持久订阅者。
@MessageDriven(name = "MyDurableSubscriber", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/topic/Topic1"),
@ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),
@ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "Topic1Subscription"),
@ActivationConfigProperty(propertyName = "clientId", propertyValue = "MySubscriber"),
})
@ResourceAdapter("StandaloneHornetQConnectionFactory")
public class MyDurableSubscriber implements MessageListener {
@Override
public void onMessage(Message message) {
// ...
}
}
@ResourceAdapter("StandaloneHornetQConnectionFactory") 行是最重要的,因为默认情况下所有 MDB 都使用hornetq-ra 资源适配器进行订阅(本地订阅)。 ResourceAdapter 注释来自 org.jboss.ejb3.annotation 包
你可以通过 maven 依赖使这个类对你可用:
<dependency>
<groupId>org.jboss.ejb3</groupId>
<artifactId>jboss-ejb3-ext-api</artifactId>
<version>2.1.0</version>
<scope>provided</scope>
</dependency>
通过所有这些设置,您可以享受具有“星形”服务器拓扑的持久订阅。
【讨论】: