2017-03-07 1 views
1

spring-frameworkspring-integration 최신 버전을 사용 중이며 스프링 통합으로 POC 애플리케이션을 만들고 있지만이를 실행할 수 없습니다.스프링 통합 : 채널에 메시지를 보낼 수 없습니다.

저는 스프링 통합이 이와 같은 것을 포함하고 있습니다.

<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 자바 파일은 다음과 같습니다.

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, 사실 저는이 게시물 이후에이 답변을 참조했으며 완벽하게 작동했으며 투표로 답변을 표시했습니다. :) –

관련 문제