Spring DSL:向JMS队列发送错误消息。获取错误'单向'MessageHandler'并且不适合配置'outputChannel''

时间:2016-01-21 16:44:08

标签: java spring spring-integration

我必须在流程定义中遗漏一些非常基本的东西。得到此错误

@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;

@Bean
public Queue errorQueue() {
    return new ActiveMQQueue(fatalQueue);
}
@Bean
public DirectChannel errorChannel() {
    return new DirectChannel();
}
@Bean
public IntegrationFlow handleErrors() {
    return IntegrationFlows
            .from(errorChannel())
            .handle(x -> System.out.println("error handling invoked.x="+x))
            .handle(Jms.outboundAdapter(jmsMessagingTemplate.getConnectionFactory()).destination(fatalQueue))
            .get();
}

我的理论是,由于适配器是单向组件,因此在流程的句柄步骤中不会生成输出。这就是导致运行时错误的原因。但是,不确定如何定义这个简单的流程。

代码:

Caused by: org.springframework.beans.factory.BeanCreationException: The 'currentComponent' (MessageReceiver$$Lambda$1/1495414981@76c52298) is a one-way 'MessageHandler' and it isn't appropriate to configure 'outputChannel'. This is the end of the integration flow.
  at org.springframework.integration.dsl.IntegrationFlowDefinition.registerOutputChannelIfCan(IntegrationFlowDefinition.java:2630) ~[spring-integration-java-dsl-1.1.0.RELEASE.jar:na]
  at org.springframework.integration.dsl.IntegrationFlowDefinition.register(IntegrationFlowDefinition.java:2554) ~[spring-integration-java-dsl-1.1.0.RELEASE.jar:na]
  at org.springframework.integration.dsl.IntegrationFlowDefinition.handle(IntegrationFlowDefinition.java:1136) ~[spring-integration-java-dsl-1.1.0.RELEASE.jar:na]
  at org.springframework.integration.dsl.IntegrationFlowDefinition.handle(IntegrationFlowDefinition.java:1116) ~[spring-integration-java-dsl-1.1.0.RELEASE.jar:na]
  at org.springframework.integration.dsl.IntegrationFlowDefinition.handle(IntegrationFlowDefinition.java:863) ~[spring-integration-java-dsl-1.1.0.RELEASE.jar:na]

然后,堆栈跟踪说:

NuGet.config

1 个答案:

答案 0 :(得分:4)

您的问题在这里:

.handle(x -> System.out.println("error handling invoked.x="+x))

StackTrace正好谈到了这一点。

这并不奇怪。你的Lambda就像这样的impl:

.handle(new MessageHandler() {

        public void handleMessage(Message<?> message) throws MessagingException {
               System.out.println("error handling invoked.x="+x);
        }
})

注意void返回类型。所以,下游没有任何东西可以通过。

要修复它,你应该做类似的事情:

.handle((p, h) -> {
        System.out.println("error handling invoked.x=" + new MutableMessage(p, h));
        return p;
 })

它是GenericHandler实施的地方。

你的.handle(Jms.outboundAdapter())在这里很好。这真的是流程的终结。