Wildfly / JBoss - STOMP协议在嵌入式Artemis代理中不工作

disbfnqx  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(166)

我们正在运行JBoss 7.4.0。我们已经运行了嵌入式Artemis代理,并且在JBoss和外部Java客户端中运行的应用程序中成功使用了它,没有出现任何问题。
我们有一个新的要求,允许另一个组将消息放入一个队列。他们使用的是使用STOMP协议的Python。我无法在JBoss嵌入式Artemis代理中实现此功能。它在Artemis独立代理中运行良好。
对于JBoss配置和设置,我添加了一个新的套接字绑定和远程接受器,如下所示:

<socket-binding name="external-messaging-stomp" port="61613"/>

...

<remote-acceptor name="stomp-acceptor" socket-binding="external-messaging-stomp">
    <param name="protocols" value="STOMP"/>
</remote-acceptor>

我在JBoss日志中得到一个关于找不到协议的错误。我做了一些研究,看起来JBoss不包括STOMP协议的JAR。我添加了一个模块(modules\system\layers\base\org\apache\activemq\artemis\protocol\stomp\main).我取出了stomp jar的redhat版本,它具有与JBoss提供的Artemis jar的其余部分相匹配的版本号和内部版本号。下面是模块.xml:

<module name="org.apache.activemq.artemis.protocol.stomp" xmlns="urn:jboss:module:1.9">
    <resources>
        <resource-root path="artemis-stomp-protocol-2.16.0.redhat-00022.jar"/>
    </resources>

    <dependencies>
        <!-- required to load ActiveMQ protocol SPI -->
        <module name="org.apache.activemq.artemis"/>
        <module name="io.netty"/>
    </dependencies>
</module>

我更新了现有的modules\system\layers\base\org\apache\activemq\artemis\main\module.xml,以包含以下内容:

<module name="org.apache.activemq.artemis.protocol.stomp" services="import" optional="true"/>

这一切看起来都很正常,因为我现在看到了来自JBoss的这些日志:

2022-08-19 13:27:07,702 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 78) AMQ221043: Protocol module found: [artemis-stomp-protocol]. Adding protocol support for: STOMP

2022-08-19 13:27:11,040 INFO  [org.apache.activemq.artemis.core.server] (ServerService Thread Pool -- 78) AMQ221020: Started NIO Acceptor at 127.0.0.1:61613 for protocols [STOMP]

下面是我的Python脚本,它只是尝试建立一个连接:

import logging
import time
import sys
import stomp

logging.basicConfig(level=logging.DEBUG)

hosts = [('127.0.0.1', 61613)]

print("Creating connection")
conn = stomp.Connection(host_and_ports=hosts)

print("Connecting")
conn.connect('myUserId', 'myPassword', wait=True)

这个脚本只是永远挂起连接。调试日志显示它发送

DEBUG:stomp.py:Sending frame: [b'STOMP', b'\n', b'accept-version:1.2\n', b'host:127.0.0.1\n', b'login:myUserId\n', b'passcode:myPassword\n', b'\n', b'\x00']

JBoss端没有任何日志记录。我为Artemis设置了TRACE日志记录,但没有看到任何与连接或握手相关的内容。我使用Wireshark嗅探了流量。我可以看到Python脚本发送了连接帧。我看到了来自端口61613的TCP ACK,所以我知道JBoss / Artemis收到了它。JBoss / Artemis根本不会发回任何内容,连接将永远保持打开和连接。
正如我所提到的,我使用相同的端口号设置了独立的Artemis,一切都工作正常。我嗅探了该流量,最初看起来都是一样的。但对于独立的Artemis,在连接帧数据包的ACK之后,Artemis发送回一个STOMP帧,表明它已连接。
这几天我一直在为这个问题绞尽脑汁。所以如果有人有什么想法,我很乐意听听。
谢谢!陶德

wwtsj6pe

wwtsj6pe1#

多亏了ehsavoie,我才能让这个工作。他指出,JBoss EAP删除了STOMP支持,但Wildfly有它。我看了Wildfly版本(23.0.0),这是我们的JBoss EAP版本的基础(7.4.0).我在为STOMP协议设置模块时犯了一个错误.在module.xml中,我遗漏了JBoss日志记录的依赖项.添加了该依赖项后,一切正常。
因此,对于任何试图让STOMP在JBoss EAP中工作的人来说,这些步骤将是...
1.查看Artemis模块中的jar,并获取版本号和内部版本号。
1.从Red Hat Maven存储库中获取正确版本和内部版本的artemis-stomp-protocol.jar
1.通过将jar复制到一个新目录(modules\system\layers\base\org\apache\activemq\artemis\protocol\stomp\main)并创建module.xml,为STOMP创建一个新模块,如下所示。
1.更新artemis的main module.xml(modules\system\layers\base\org\apache\activemq\artemis\main\module.xml),以包含可选的STOMP模块,如下所示。
1.在您的配置中创建套接字绑定和远程接受器。
这是针对EAP 7.4.0的。如果您运行的是不同的版本,请使用适当的module.xml作为模板。更好的是,下载相应版本的Wildfly并查看它是如何设置的。以下是我为STOMP模块最终创建的module.xml:

<module name="org.apache.activemq.artemis.protocol.stomp" xmlns="urn:jboss:module:1.9">
    <resources>
        <resource-root path="artemis-stomp-protocol-2.16.0.redhat-00022.jar"/>
    </resources>

    <dependencies>
        <!-- required to load ActiveMQ protocol SPI -->
        <module name="org.apache.activemq.artemis"/>
        <module name="org.jboss.logging"/>
        <module name="io.netty"/>
    </dependencies>
</module>

下面是您需要添加到现有artemismodule.xml中的代码行:

<dependencies>
        …
        <module name="org.apache.activemq.artemis.protocol.stomp" services="import" optional="true"/>
        …
    </dependencies>

以下是对JBoss配置(stanalone.xml等)的更改,以便为端口# 61613添加套接字绑定:

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        …
        <socket-binding name="external-messaging-stomp" port="61613"/>
        …
    </socket-binding-group>

最后是配置为使用STOMP并侦听端口61613的远程接受器:

<subsystem xmlns="urn:jboss:domain:messaging-activemq:13.0">
            <server name="default">
                …
                <remote-acceptor name="stomp-acceptor" socket-binding="external-messaging-stomp">
                    <param name="protocols" value="STOMP"/>
                </remote-acceptor>
                …
            </server>
        </subsystem>

相关问题