2017-05-07 43 views
0

我有一些Spring集成调度程序的故障转移问题,应该显示我异常如果我的消息处理程序失败。为什么Spring集成故障转移不会显示异常

我有简单的Spring集成方面:

<int:gateway default-request-channel="inboundChannel" 
      service-interface="com.some.gateway.PrinterGateway"/> 

    <int:channel id="inboundChannel"> 
     <int:dispatcher failover="false"/> 
    </int:channel> 

    <!--first Message Handler (broken)-->  
    <bean id="printService" class="com.some.service.PrinterService"/> 

    <int:service-activator input-channel="inboundChannel" 
          method="print" 
          ref="printService"/> 

    <!--second Message Handler--> 
    <bean id="uppercasePrintService" 
      class="com.some.service.UppercasePrinterService"/> 

    <int:service-activator input-channel="inboundChannel" 
          method="printUppercase" 
          ref="uppercasePrintService"/> 

而且我破碎的消息处理类:

public class PrinterService { 

    public void print(Message<String> message) { 
     throw new RuntimeException("This is error"); 
    } 
} 
  1. 你能解释我为什么我的故障切换不工作?
  2. 为什么RuntimeException被跳过并且消息被传递到下一个处理程序?

回答

1

对我来说工作正常。

目前还不清楚你试图达到的目标;也许你误解了负载平衡?

默认情况下,负载均衡策略是循环法,这意味着第一条消息将发送到发生故障的端点;第二个将转到良好的终点。 消息将会交替。

19:23:16.867 [main] DEBUG org.springframework.integration.channel.DirectChannel - preSend on channel '[email protected]', message: GenericMessage [payload=foo, headers={id=9c3b1493-0a9a-e324-6da3-262079677ed0, timestamp=1494199396867}] 
org.springframework.messaging.MessageDeliveryException: failed to send Message to channel 'null'; nested exception is java.lang.RuntimeException: foo, failedMessage=GenericMessage [payload=foo, headers={id=9c3b1493-0a9a-e324-6da3-262079677ed0, timestamp=1494199396867}] 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:449) 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373) 
    at com.example.So43836561Application.main(So43836561Application.java:16) 
Caused by: java.lang.RuntimeException: foo 
    at com.example.So43836561Application.lambda$0(So43836561Application.java:13) 
    at com.example.So43836561Application$$Lambda$1/1121454968.handleMessage(Unknown Source) 
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:160) 
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121) 
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89) 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423) 
    ... 2 more 
19:23:18.875 [main] DEBUG org.springframework.integration.channel.DirectChannel - preSend on channel '[email protected]', message: GenericMessage [payload=bar, headers={id=90aaa16c-a8c1-9162-ba8f-532fa3201c7f, timestamp=1494199398875}] 
Second Service: GenericMessage [payload=bar, headers={id=90aaa16c-a8c1-9162-ba8f-532fa3201c7f, timestamp=1494199398875}] 
19:23:18.876 [main] DEBUG org.springframework.integration.channel.DirectChannel - postSend (sent=true) on channel '[email protected]', message: GenericMessage [payload=bar, headers={id=90aaa16c-a8c1-9162-ba8f-532fa3201c7f, timestamp=1494199398875}] 

如果您使用无负载平衡策略,则所有消息都将发送到失败的消息。

19:26:38.005 [main] DEBUG org.springframework.integration.channel.DirectChannel - preSend on channel '[email protected]', message: GenericMessage [payload=foo, headers={id=6a69efe9-dbbd-c79b-41a9-6964fd4c8ccc, timestamp=1494199598004}] 
org.springframework.messaging.MessageDeliveryException: failed to send Message to channel 'null'; nested exception is java.lang.RuntimeException: foo, failedMessage=GenericMessage [payload=foo, headers={id=6a69efe9-dbbd-c79b-41a9-6964fd4c8ccc, timestamp=1494199598004}] 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:449) 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373) 
    at com.example.So43836561Application.main(So43836561Application.java:16) 
Caused by: java.lang.RuntimeException: foo 
    at com.example.So43836561Application.lambda$0(So43836561Application.java:13) 
    at com.example.So43836561Application$$Lambda$1/2009787198.handleMessage(Unknown Source) 
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:160) 
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121) 
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89) 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423) 
    ... 2 more 
19:26:40.009 [main] DEBUG org.springframework.integration.channel.DirectChannel - preSend on channel '[email protected]', message: GenericMessage [payload=bar, headers={id=9428a10e-3a17-79d5-e4bd-731fc88ef0fe, timestamp=1494199600008}] 
Exception in thread "main" org.springframework.messaging.MessageDeliveryException: failed to send Message to channel 'null'; nested exception is java.lang.RuntimeException: foo, failedMessage=GenericMessage [payload=bar, headers={id=9428a10e-3a17-79d5-e4bd-731fc88ef0fe, timestamp=1494199600008}] 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:449) 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373) 
    at com.example.So43836561Application.main(So43836561Application.java:22) 
Caused by: java.lang.RuntimeException: foo 
    at com.example.So43836561Application.lambda$0(So43836561Application.java:13) 
    at com.example.So43836561Application$$Lambda$1/2009787198.handleMessage(Unknown Source) 
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:160) 
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121) 
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89) 
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423) 
    ... 2 more 

如果这不是问题,也许你有第二个通道bean,具有相同的id配置不同?

无论如何,开启DEBUG日志记录org.springframework.integration会告诉你发生了什么事情。

编辑

由于您使用的是异步网关(返回Future<?>),你需要检查结果得到的异常...

@Override 
public void run(ApplicationArguments applicationArguments) throws Exception { 
    List<Future<Message<String>>> futures = new ArrayList<>(); 
    for (int i = 0; i < 10; i++) { 
     Message<String> message = MessageBuilder.withPayload("Some payload that created for message id: " + i) 
       .build(); 
     log.info("Sending message " + i); 
     futures.add(gateway.print(message)); 
    } 
    futures.forEach(f -> { 
     try { 
      System.out.println(f.get()); 
     } 
     catch (ExecutionException e) { 
      System.out.println(e.getCause().getMessage()); 
     } 
     catch (InterruptedException e) { 
      Thread.currentThread().interrupt(); 
     } 
    }); 
} 

public String printUppercase(Message<String> message) { 
    log.info(message.getPayload().toUpperCase()); 
    return message.getPayload().toUpperCase(); 
} 

结果:

This is error 
GenericMessage [payload=SOME PAYLOAD THAT CREATED FOR MESSAGE ID: 1, headers={id=229ad2ee-f424-61da-a9bc-a631de9bd5d0, timestamp=1494360966556}] 
GenericMessage [payload=SOME PAYLOAD THAT CREATED FOR MESSAGE ID: 2, headers={id=7e2c45c4-2c7b-f3f3-243d-56d9de33375f, timestamp=1494360966556}] 
This is error 
This is error 
This is error 
GenericMessage [payload=SOME PAYLOAD THAT CREATED FOR MESSAGE ID: 6, headers={id=79f4ef60-9dea-60f3-3972-a9eefde67ebf, timestamp=1494360966556}] 
GenericMessage [payload=SOME PAYLOAD THAT CREATED FOR MESSAGE ID: 7, headers={id=626d1347-e5bd-ec4c-b153-71174cc7f18d, timestamp=1494360966556}] 
This is error 
+0

禁用我的'故障转移'后,我没有这个堆栈跟踪。我想显示你附加的这个跟踪,但负载平衡行为看起来像启用'failover'。 –

+0

我不明白你在说什么。正如我所说,你提供的信息是不可能的;画面中必须有其他东西。如果你可以在某个地方(github或类似的地方)发布一个展示你所看到的行为的完整例子,那么某个人将能够弄清楚你做错了什么。 –

+0

当然可以。这里https://github.com/MrNikita/spring-integration-in-practice –