簡體   English   中英

為什么Spring Integration故障轉移沒有顯示異常

[英]Why Spring Integration failover doesn't show exception

我對Spring Integration分派器的故障轉移有一些問題,如果我的消息處理程序失敗,應該向我顯示異常。

我有簡單的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並將消息傳遞到下一個處理程序?

這對我來說可以。

目前尚不清楚您要達到的目標。 也許您誤解了負載平衡?

默認情況下,負載平衡策略是輪詢,這意味着第一條消息將到達故障端點; 第二個將轉到良好的端點。 消息將交替顯示。

19:23:16.867 [main] DEBUG org.springframework.integration.channel.DirectChannel - preSend on channel 'org.springframework.integration.channel.DirectChannel@1794d431', 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 'org.springframework.integration.channel.DirectChannel@1794d431', 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 'org.springframework.integration.channel.DirectChannel@1794d431', message: GenericMessage [payload=bar, headers={id=90aaa16c-a8c1-9162-ba8f-532fa3201c7f, timestamp=1494199398875}]

如果您使用NONE負載平衡策略,則所有消息將轉到失敗的消息中。

19:26:38.005 [main] DEBUG org.springframework.integration.channel.DirectChannel - preSend on channel 'org.springframework.integration.channel.DirectChannel@7d9d1a19', 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 'org.springframework.integration.channel.DirectChannel@7d9d1a19', 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

如果這不是問題,那么也許您還有另一個Channel Bean,其ID的配置有所不同?

無論如何,為org.springframework.integration打開DEBUG日志將向您顯示正在發生的事情。

編輯

由於您使用的是異步網關(返回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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM