ActiveMQ作为MQTT代理,无需客户端即可直接从中读取消息

问题描述

所以我将ActiveMQ用作这样的MQTT代理:

TransportConnector mqtt = new TransportConnector();
mqtt.setName(mqttbrokerConfig.getbrokerName());
URI uri = new URI("mqtt://some ip");
mqtt.setUri(uri);
final brokerService broker = new brokerService();
broker.setUseJmx(false);        // disable JMX for secure purpose
broker.setPersistent(mqttbrokerConfig.getPersistence());
broker.setAdvisorySupport(mqttbrokerConfig.getAdvisorySupport());
if(mqttbrokerConfig.getEnableLogin()) {
    SimpleAuthenticationPlugin authenticationPlugin = loadLogins();
    broker.setPlugins(new brokerPlugin[]{authenticationPlugin});
}
broker.setUseShutdownHook(true);
broker.addConnector(mqtt);

我需要从外部接受MQTT消息,从代理读取消息,然后将其发送给Kafka。 现在,我在同一JVM中创建了MQTT客户端,并通过127.0.0.1连接代理。通过内部网络仍然有一些开销,有时连接可能会丢失。

由于客户机与代理位于同一个JVM中,是否有一种方法可以直接读取MQTT消息而无需通过网络?如果ActiveMQ不支持功能,是否还有另一个支持功能的Java MQTT代理?

解决方法

我相信VM transport是您想要的。如果您的客户端使用VM传输,则应该消除通过正常网络连接而产生的任何开销。

要使用VM传输,您需要使用ActiveMQ随附的OpenWire JMS客户端。您的远程MQTT客户端可以将消息发送到嵌入式ActiveMQ代理,并且同一VM中的本地客户端可以接收这些消息。

其他协议客户端(例如MQTT,AMQP,STOMP等)将无法使用VM传输,因为它需要特定于ActiveMQ的集成。