0

我正在尝试让 Wildfly 18 服务器的 Apache Artemis 中的 MQTT 接受器运行。

服务器正在运行,我什至可以将消息发送到定义的主题(尽管必须定义)。

最初我必须将权限添加create-durable-queue="true"到安全性,否则,一旦我尝试订阅该主题,服务器就会终止通信。

也就是说,我试图弄清楚如何在 JMS 端创建一个带有通配符的主题订阅,但我既找不到当前文档,也找不到任何其他相关信息。

为用例提供一些背景信息:

我想使用 Wildfly 18 的内置 Artemis 服务器,并且有一堆设备可以发布到类似/device/reader/SOMEID/temperature 和类似的主题。

在我的 EJB 中,我想订阅该主题/device/#并获取该主题和所有子主题的所有消息。

我怎样才能做到这一点?

此外,当我在配置中的条目是

<jms-topic name="TestTopic" entries="java:/jms/topic/TestTopic" />

为什么是 MQTT 主题jms/topic/TestTopic呢?我不喜欢在那里使用前缀。

4

1 回答 1

2

服务器正在运行,我什至可以将消息发送到定义的主题(尽管必须定义)。

如果您使用trueauto-create-addresses address-setting是主题(即地址),则应该在您向其发送消息或在其上创建订阅时自动为您创建主题。

最初我必须将权限 create-durable-queue="true" 添加到安全性,否则,一旦我尝试订阅该主题,服务器就会终止通信。

这是预期的,因为create-durable-queue默认情况下未设置权限。

如果您希望 JMS 主题订阅者将所有消息发送到特定地址集,则只需jms-topic在服务器配置或代码中的定义中指定所需的通配符地址。您可以在此处找到有关 ActiveMQ Artemis 的有关此主题的最新文档以及此处使用它的示例。

为什么 MQTT 主题然后是 jms/topic/TestTopic?我不喜欢在那里使用前缀。

不幸的是,由于历史向后兼容性问题,Wildfly 中的前缀不是可选的。此外,虽然嵌入式 ActiveMQ Artemis 实例在技术上可以为非 JMS 客户端提供服务,但嵌入式代理实际上只是作为 Java EE 要求的 JMS 实现。如果您独立运行 ActiveMQ Artemis,您将拥有更大的灵活性(即不使用上述前缀的能力)。

于 2019-10-28T14:34:25.320 回答