2017-03-07 16 views
1

私はspring-frameworkspring-integrationの最新バージョンを使用していますが、POCアプリケーションをSpring統合で作成していますが、これを実行できません。春の統合:チャンネルにメッセージを送信できません

私はこのようなものを抱えている春の統合があります。

<bean id="initUrlQ" class="org.apache.activemq.command.ActiveMQQueue"> 
     <constructor-arg value="initUrl.Q" /> 
    </bean> 
    <int:channel id="initChannelProducerId" /> 

    <jms:outbound-channel-adapter id="initOutboundId" channel="initChannelProducerId" connection-factory="padtoys.jms.cachedConnectionFactory" 
     destination="initUrlQ" /> 
    <int:channel id="initChannelConsumerId" /> 
    <jms:message-driven-channel-adapter id="initQListenerId" channel="initChannelConsumerId" 
     connection-factory="padtoys.jms.cachedConnectionFactory" destination="initUrlQ" 
     acknowledge="auto" concurrent-consumers="1" max-concurrent-consumers="1" /> 

    <int:service-activator method="testSA" ref="testBean" input-channel="initChannelConsumerId" output-channel="nullChannel"/> 

そして、私のtestBean javaファイルはこのように見えます。

public class TestBean implements ApplicationContextAware { 

    private ApplicationContext applicationContext; 

    @PostConstruct 
    public void afterInit(){ 
     System.err.println("after init..!"); 
     DirectChannel inChannel = applicationContext.getBean("initChannelProducerId", DirectChannel.class); 
     System.err.println("channel::" + inChannel); 
     inChannel.send(createMessage("This is test url!!", 0)); 
    } 

    @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     this.applicationContext = applicationContext; 
    } 

    @ServiceActivator 
    public String testSA(){ 
     System.err.println("inside service activator!!!"); 
     return "this is test"; 
    } 

    private Message<String> createMessage(final String url, final int depth) { 
     return MessageBuilder.withPayload(StringUtils.EMPTY) 
       .setHeader(MESSAGE_HEADERS.URL, url) 
       .setHeader(MESSAGE_HEADERS.DEPTH, depth).build(); 
    } 
} 

そして、私はこのようなアプリケーションを開始しています。

@SuppressWarnings("resource") public static void main(String[] args) { 
     LOG.info("Trigerring process!"); 
     new ClassPathXmlApplicationContext("/application-context.xml"); 
    } 

私は春のコンテキストXMLにtestBeanpadtoys.jms.cachedConnectionFactoryを宣言したことをご検討ください。

問題:

私はエラーの下になって、アプリケーションを起動し

Caused by: org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'org[email protected]5a1198c7.initChannelProducerId'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers 
     at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77) 
     at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423) 
     at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373) 
     at com.dodax.pad.ext.toys.crawler.scanner.TestBean.afterInit(TestBean.java:25) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:497) 
     at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366) 
     at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:311) 
     at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:134) 
     ... 30 more 
Caused by: org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers 
     at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:138) 
     at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:105) 
     at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73) 

注:私はこのラインで右チャンネル名を取得しています

System.err.println("channel::" + inChannel);が、メッセージをチャネルに送信しようとすると問題が発生します。

答えて

1

@PostConstructメソッドではメッセージング(send())を実行しないでください。アプリケーションコンテキストのライフサイクルが早すぎます。コンテキストはまだメッセージングを実行する準備ができていません。

起動時にメッセージングを実行する適切な場所については、this answerを参照してください。

+0

ありがとう@Gary、実際に私はこのポストの後にその答えを参照していたし、それは完璧に働いて、私も投票でその答えをマーク:) –

関連する問題