接收MQTT消息时丢失连接

时间:2014-03-21 13:44:20

标签: spring-integration mqtt

我正在尝试使用Spring Integration接收MQTT消息并在自定义代码中处理它们。由于其他依赖关系,我必须使用spring-integration-mqtt.1.0.0.M1

对于测试,我使用这个代理:tcp://broker.mqttdashboard.com:1883它有一个很好的发送消息接口。

当我的应用程序收到消息时,我在控制台中收到以下日志:

DEBUG 17:46:16 org.springframework.integration.channel.DirectChannel : preSend on     channel 'startCase', message: [Payload=hellas][Headers={timestamp=1395420376914,     id=5adcb1cf-094e-c593-60d1-9b12f82736b6, mqtt_qos=1, mqtt_topic=edw1, mqtt_retained=false,     mqtt_duplicate=false}]
DEBUG 17:46:16 org.springframework.integration.channel.DirectChannel : preSend on channel 'logger', message: [Payload=hellas][Headers={timestamp=1395420376914, id=5adcb1cf-094e-c593-60d1-9b12f82736b6, mqtt_qos=1, mqtt_topic=edw1, mqtt_retained=false, mqtt_duplicate=false}]
DEBUG 17:46:16 org.springframework.integration.handler.LoggingHandler : org.springframework.integration.handler.LoggingHandler#0 received message: [Payload=hellas][Headers={timestamp=1395420376914, id=5adcb1cf-094e-c593-60d1-9b12f82736b6, mqtt_qos=1, mqtt_topic=edw1, mqtt_retained=false, mqtt_duplicate=false}]
DEBUG 17:46:16 org.springframework.integration.handler.LoggingHandler : hellas
DEBUG 17:46:16 org.springframework.integration.channel.DirectChannel : postSend (sent=true) on channel 'logger', message: [Payload=hellas][Headers={timestamp=1395420376914, id=5adcb1cf-094e-c593-60d1-9b12f82736b6, mqtt_qos=1, mqtt_topic=edw1, mqtt_retained=false, mqtt_duplicate=false}]
DEBUG 17:46:16 org.springframework.integration.handler.ServiceActivatingHandler : ServiceActivator for [org.springframework.integration.handler.MethodInvokingMessageProcessor@25669ccf] received message: [Payload=hellas][Headers={timestamp=1395420376914, id=5adcb1cf-094e-c593-60d1-9b12f82736b6, mqtt_qos=1, mqtt_topic=edw1, mqtt_retained=false, mqtt_duplicate=false}]
ERROR 17:46:16 org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter : Lost connection:MqttException; retrying...
DEBUG 17:46:16 org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter : Attempting reconnect
DEBUG 17:46:17 org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter : Connected and subscribed to [Ljava.lang.String;@7fd6b8ce

没有别的。因此,由于第一行,我认为,消息是以某种方式收到的'hellas'是我发送的消息的有效载荷的内容。

这是我的弹簧集成配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:int="http://www.springframework.org/schema/integration"
   xmlns:int-mqtt="http://www.springframework.org/schema/integration/mqtt"
   xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/integration/mqtt http://www.springframework.org/schema/integration/mqtt/spring-integration-mqtt.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    ">

<import resource="customer-propertyPlaceholder-config.xml" />


<bean id="clientFactory"
      class="org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory">
    <property name="userName" value="${mqtt.username}"/>
    <property name="password" value="${mqtt.password}"/>
</bean>

<!-- intercept and log every message -->
<int:logging-channel-adapter id="logger" level="ERROR"/>
<int:wire-tap channel="logger"/>

<int-mqtt:message-driven-channel-adapter id="startCaseAdapter"
                                         client-id="${mqtt.clientId}"
                                         url="${mqtt.url}"
                                         topics="${mqtt.topic}"
                                         channel="startCase" auto-startup="true" />
<int:channel id="startCase" />


<int:service-activator id="startCaseService" input-channel="startCase" ref="mqttCaseService" method="startCase" />

<bean id="mqttCaseService" class="foo.bar.customer.mqtt.MqttCaseService" />

所以我希望在收到消息后,会调用MqttCaseService#startCase。但这种情况从未发生过,这种方法开头的断点永远不会被触及。

看过DEBUG输出后,添加我想要呼叫的服务可能会有所帮助。

public interface MqttCaseService {

public void startCase(MqttMessage message);

}

2 个答案:

答案 0 :(得分:1)

我在spring-integration-mqtt-4.3.8.RELEASE遇到了这个问题。每次收到消息时,我都会收到错误消息:

org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter
: Lost connection:MqttException; retrying...`

启用调试帮助通过向我显示一个异常和堆栈跟踪来追踪实际问题,而这些异常和堆栈跟踪并未由我自己的代码处理。我的消息处理程序试图解析消息的内容并抛出一个我没有捕获的异常 - 然后异常被传递到spring mqtt库中,这会杀死连接并再次打开它。

真正讨厌的事情是,每次重新连接时,我都会重复收到相同的消息(保留值为true)。

处理我自己代码中的所有异常修复了问题。

答案 1 :(得分:0)

我刚刚对该经纪人进行了测试,没有任何问题。但我使用的是最新版本(4.0.0.M3) - mqtt模块已移至Spring Integration proper

鉴于您正在获取日志消息,这意味着适配器将消息正常,因此我猜您正在获取某种调用服务激活器的异常。 DEBUG日志记录应该可以帮助您跟踪它。

但是,当我强制出错时,我会收到与您相同的消息并且没有堆栈跟踪,因此这是一个错误 - 我们应该记录异常;我打开了JIRA issue

1.0.0候选版本(1.0.0.RC1或Spring Integration 3.0.x和2.2.x)和4.0.0.BUILD-SNAPSHOT(4.0.0)中提供了修复程序(未记录错误) .M4即将到期。

您应该能够通过在MesageProducerSupport.sendMessage()的catch子句中放置断点来查找异常。