为LoggingHandler

时间:2016-05-24 15:42:04

标签: spring-integration spring-xd

我正在为springxd模块编写自己的单元测试(但是,我不打算使用xd.testxd.dirt)。

这是一个处理器模块,我为测试所做的是:

配置上下文:

ctx = new ClassPathXmlApplicationContext("config/spring-module.xml");

获取input DirectChannlsend(Message)

input = ctx.getBean("input", DirectChannel.class);

input.send(msg);

但对于DirectChannel,我必须提供subscriber,因此我决定将LoggingHandler Bean写入ouput {{1这就是:

DirectChannel

但我的问题是:我需要@Bean public LoggingHandler outputLogging(){ LoggingHandler lh = new LoggingHandler("INFO"); lh.setLoggerName("output-logging"); lh.setShouldLogFullMessage(true); return lh; } 成为loggingHandler频道的订阅者。所以我必须以output的方式配置它。我得到了一个解决方案:

output

但是仍然存在@Bean @ServiceActivator(inputChannel = "output") public LoggingHandler outputLogging(){ LoggingHandler lh = new LoggingHandler("INFO"); lh.setLoggerName("output-logging"); lh.setShouldLogFullMessage(true); return lh; }

Exception

所以,我的问题是:

我是否需要使用org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'org.springframework.context.support.ClassPathXmlApplicationContext@76b0bfab.output'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:81) at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:442) at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:392) at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115) at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45) at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105) at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutput(AbstractMessageProducingHandler.java:231) at org.springframework.integration.handler.AbstractMessageProducingHandler.produceOutput(AbstractMessageProducingHandler.java:154) at org.springframework.integration.handler.AbstractMessageProducingHandler.sendOutputs(AbstractMessageProducingHandler.java:102) at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:105) at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:147) at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:120) at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77) at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:442) at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:392) at com.example.test.TestAll.allTest(TestAll.java:58) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Caused by: org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:153) at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:120) at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77) ... 42 more xml配置模块,我不能同时使用它们?

如果可以的话,有没有使用annotation的解决方案,它看起来像是:

@ServiceActivator(inputChannel = "output")

实际上我不需要服务激活器。

谢谢!

[更新]

<int:service-activator input-channel="input" method="trans" output-channel="output">
    <bean class="com.example.LoggingHandler" init-method="init" destroy-method="destroy">
...
    </bean>
</int:service-activator>

1 个答案:

答案 0 :(得分:2)

由于它是测试用例,我认为你只是导入真正的模块配置并提供一些测试工具以使其工作并完成任务。

我甚至认为你使用@ServiceActivator配置正确。

只有@EnableIntegration@Configuration一起遗漏的问题。

另一方面,我最好在@BridgeFrom("output") QueueChannel@Bean处理assert处理器导致测试结束。 但无论如何你还需要@EnableIntegration

<强>更新

行。感谢您提供更新的代码。现在我明白了。您的TestAll @Configuration课程未在ApplicationContext注册的问题。因此,没有人会处理@EnableIntegration并注册您的LoggingHandler @Bean等等。

试试这个:

@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext
public class TestAll {

    @Autowired
    @Qualifier("input")
    private MessageChannel inputChannel;

    @Autowired
    private PollableChannel resultChannel;

    @Test
    public void allTest(){
        Message<?> msg = composeMsg();
        input.send(msg);
        Message<?> result = resultChannel.receive(10000);
        assertNotNull(result);
        // Other asserts
    }

    @Configuration
    @EnableIntegration
    @ImportResource("classpath:config/spring-module.xml")
    public static class ContextConfiguration {

        @BridgeFrom("output")
        public PollableChannel resultChannel() {
             return new QueueChannel();
        }
    }

}