2016-12-20 10 views
1

私はバネ統合とMQTTのサポートを使用しています。私は春の統合ドキュメントを見て、簡単なテストケースはMQTTトピックにメッセージを公開することです。春のドキュメントは次の場所にあります。http://docs.spring.io/spring-integration/reference/html/mqtt.html#_configuring_with_java_configuration_15Spring統合Dispatcherにチャネルのサブスクライバがありません

私はこれらのバージョンを使用しています:

  • 春4.3.4
  • 春の統合4.3.5

私はこの簡単な構成クラスを構築しました:

@Configuration 
@IntegrationComponentScan 
public class CommunicationServerApplication 
{ 
    @Bean 
    public MqttPahoClientFactory mqttClientFactory() 
    { 
     DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); 
     factory.setServerURIs(mqttServerUris); 
     if (StringUtils.hasText(mqttUsername) && StringUtils.hasText(mqttPassword)) 
     { 

      factory.setUserName(mqttUsername); 
      factory.setPassword(mqttPassword); 
     } 
     factory.setConnectionTimeout(mqttConnectionTimeout); 
     factory.setKeepAliveInterval(mqttKeepAliveInterval); 
     factory.setPersistence(new MqttDefaultFilePersistence(mqttPersistenceFileDirectory)); 
     return factory; 
    } 

    @Bean 
    @ServiceActivator(inputChannel = "mqttOutboundChannel", autoStartup="true") 
    public MessageHandler mqttOutbound() 
    { 
     String clientId = mqttClientId; 
     if(!StringUtils.hasText(clientId)) 
     { 
      clientId = UUID.randomUUID().toString(); 
     } 
     MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId, mqttClientFactory()); 
     messageHandler.setAsync(true); 
     messageHandler.setDefaultTopic(mqttTopic); 
     if(mqttQos >= 0 && mqttQos <=2) 
     { 

      messageHandler.setDefaultQos(mqttQos); 
     } 
     return messageHandler; 
    } 

    @Bean 
    public MessageChannel mqttOutboundChannel() 
    { 
     DirectChannel dc = new DirectChannel(); 
     return dc; 
    } 

    @MessagingGateway(defaultRequestChannel = "mqttOutboundChannel") 
    public interface MqttMsgproducer 
    { 

     void sendToMqtt(String data); 
    } 
} 

次に、この簡単なテストケースを使用しました。

@ContextConfiguration(value ={ "classpath:app-ctx.xml"}) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class SimpleMqttTestSuite 
{ 
    private static final Logger logger = LoggerFactory.getLogger(SimpleMqttTestSuite.class.getName()); 
    @Autowired 
    private MqttMsgproducer sender; 
    @Test 
    public void startServerTest() 
    { 
     try 
     { 
      sender.sendToMqtt("Hello"); 
     } 
     catch (Exception e) 
     { 
      logger.error("Error", e); 
     } 
    } 
} 

マイアプリ-ctx.xmlは次のとおりです。

簡単なテストを実行
<?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:context="http://www.springframework.org/schema/context" 
    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
    http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm.xsd 
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

    <context:component-scan base-package="it.olegna.test.integration" /> 
    <context:property-placeholder location="classpath:configuration.properties" 
     order="0" ignore-resource-not-found="true" ignore-unresolvable="true" />  
</beans> 

、私はこのエラーを抱えている:

2016-12-20 10:46:33,889 49967 [nioEventLoopGroup-3-1] ERROR - Errore 
org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel '[email protected]6a8155.mqttOutboundChannel'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers 
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:81) ~[spring-integration-core-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423) ~[spring-integration-core-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373) ~[spring-integration-core-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115) ~[spring-messaging-4.3.4.RELEASE.jar:4.3.4.RELEASE] 
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45) ~[spring-messaging-4.3.4.RELEASE.jar:4.3.4.RELEASE] 
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105) ~[spring-messaging-4.3.4.RELEASE.jar:4.3.4.RELEASE] 
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:143) ~[spring-messaging-4.3.4.RELEASE.jar:4.3.4.RELEASE] 
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:135) ~[spring-messaging-4.3.4.RELEASE.jar:4.3.4.RELEASE] 
    at org.springframework.integration.gateway.MessagingGatewaySupport.send(MessagingGatewaySupport.java:375) ~[spring-integration-core-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.integration.gateway.GatewayProxyFactoryBean.invokeGatewayMethod(GatewayProxyFactoryBean.java:477) ~[spring-integration-core-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.integration.gateway.GatewayProxyFactoryBean.doInvoke(GatewayProxyFactoryBean.java:429) ~[spring-integration-core-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.integration.gateway.GatewayProxyFactoryBean.invoke(GatewayProxyFactoryBean.java:420) ~[spring-integration-core-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.integration.gateway.GatewayCompletableFutureProxyFactoryBean.invoke(GatewayCompletableFutureProxyFactoryBean.java:65) ~[spring-integration-core-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.4.RELEASE.jar:4.3.4.RELEASE] 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) ~[spring-aop-4.3.4.RELEASE.jar:4.3.4.RELEASE] 

私は私は何を把握することはできません構成に欠落しています。誰も私にチップを与えることができますか?

アンジェロ

答えて

1

ありがとう、私はそれは私がチャンネルを構築しているという事実に関連していたが、今ハンドラは私がやった私のアプリケーションクラスでは

を購読されている

私の問題を解決しました次のとおりです。

@Bean 
public MessageChannel mqttOutboundChannel() 
{ 
    DirectChannel dc = new DirectChannel(); 
    dc.subscribe(mqttOutbound()); 
    return dc; 
} 

nはこのようにすることによって、チャネル

に豆mqttOutbound(メッセージハンドラ)を購読する今、私は手動で追加を参照してくださいすべての

が、私はこれが

更新後の

アンジェロ

を助けることを願って動作しますゲイリーラッセルANSWER

ゲイリー・ラッセルによって示唆されるように、私はチャンネル

に加入していませんでした

私はだから私のApplicationクラスは、現在、以下のある注釈@EnableIntegration

を追加しました:

@Configuration 
@IntegrationComponentScan 
@EnableIntegration 
public class CommunicationServerApplication 
{ 
    @Bean 
    public MqttPahoClientFactory mqttClientFactory() 
    { 
     DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); 
     factory.setServerURIs(mqttServerUris); 
     if (StringUtils.hasText(mqttUsername) && StringUtils.hasText(mqttPassword)) 
     { 

      factory.setUserName(mqttUsername); 
      factory.setPassword(mqttPassword); 
     } 
     factory.setConnectionTimeout(mqttConnectionTimeout); 
     factory.setKeepAliveInterval(mqttKeepAliveInterval); 
     factory.setPersistence(new MqttDefaultFilePersistence(mqttPersistenceFileDirectory)); 
     return factory; 
    } 

    @Bean 
    @ServiceActivator(inputChannel = "mqttOutboundChannel", autoStartup="true") 
    public MessageHandler mqttOutbound() 
    { 
     String clientId = mqttClientId; 
     if(!StringUtils.hasText(clientId)) 
     { 
      clientId = UUID.randomUUID().toString(); 
     } 
     MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId, mqttClientFactory()); 
     messageHandler.setAsync(true); 
     messageHandler.setDefaultTopic(mqttTopic); 
     if(mqttQos >= 0 && mqttQos <=2) 
     { 

      messageHandler.setDefaultQos(mqttQos); 
     } 
     return messageHandler; 
    } 

    @Bean 
    public MessageChannel mqttOutboundChannel() 
    { 
     DirectChannel dc = new DirectChannel(); 
     return dc; 
    } 

    @MessagingGateway(defaultRequestChannel = "mqttOutboundChannel") 
    public interface MqttMsgproducer 
    { 

     void sendToMqtt(String data); 
    } 
} 
3

あなたのソリューションが間違っている - あなたはチャネルBean定義の中に加入してはいけません。あなたの問題は、あなたがクラスに@EnableIntegrationが見つからないということです。

+0

私はいくつかの明確化を望んでいた:)私はあなたが示唆したように努力した –

関連する問題