【问题标题】:How to configure standalone HornetQ along with EAP 6.3 or Jboss 7 for durable JMS subscription?如何配置独立的 HornetQ 以及 EAP 6.3 或 Jboss 7 以实现持久的 JMS 订阅?
【发布时间】:2015-05-05 14:07:58
【问题描述】:

我想通过一个独立的 HornetQ 服务器将 JMS 消息从一台 Jboss 服务器发送到另一台服务器。 这样我可以在目标服务器崩溃的情况下稍后传递消息(提供持久订阅)。

但是,我已经在每个 Jboss 内部路由了消息。我想要一个不会与这些冲突的配置。

所需解决方案的拓扑在图表上可视化。

如何实现这个配置?

【问题讨论】:

    标签: jboss jms


    【解决方案1】:

    让我们从配置独立的 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 文件以更改这些端口。您还希望能够注册持久订阅者,因此将这两行添加到同一文件中的 &lt;security-setting match="#"&gt; 元素中:

    <permission type="createDurableQueue" roles="guest"/>
    <permission type="deleteDurableQueue" roles="guest"/>
    

    然后通过运行 %HORNETQ-HOME%\run.bat 启动独立的 HornetQ。

    首先我们将了解如何向这个新创建的主题发送消息。为此,我们需要在 Jboss Server 1 上指定一个连接工厂。在%JBOSS-HOME1%\standalone\configuration\standalone-full.xmljboss: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 连接器添加到 &lt;connectors&gt; 来创建它:

    <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 套接字绑定。让我们在&lt;socket-binding-group&gt; 子元素中创建它:

    <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>
    

    通过所有这些设置,您可以享受具有“星形”服务器拓扑的持久订阅。

    【讨论】:

    • 你能告诉java程序连接到HornetQ吗?我曾使用过 JBoss 消息传递,我们首先提到属性(Jnp url/1099,然后是 NamingContextFactory,并将属性添加到初始上下文并初始化连接工厂。但无法对默认配置执行相同操作。您能建议一下吗?
    • @zbig 你有一些在 jboss eap 6.3 或 6.4 中发送消息到队列的例子吗?谢谢。
    • @Makudex 我有一个例子。它类似于那里的许多示例。我不想扩展这个答案,因为它是关于配置的。您能否提出一个新问题,以便我为您提供示例?
    • 感谢@zbig 的回复。我只是想问一下,在哪里可以找到 jboss-eap 6.4 中发送的消息?如果有的话。
    • @Makudex 不太明白。您想查看消息日志 - 已发送哪些消息?
    猜你喜欢
    • 2016-08-15
    • 2023-03-20
    • 1970-01-01
    • 2015-09-24
    • 2017-10-08
    • 2015-08-03
    • 2015-02-19
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多