覆盖@MessagingGateway中配置的errorChannel

时间:2018-05-30 17:14:14

标签: spring spring-integration integration

我已将 @MessagingGateway 配置如下,以使用错误频道,该频道按预期工作。

from Section3.Dialog import Ui_Dialog

在流程中,我将对象传递给变换器,如下所示:

第1步:

@MessagingGateway(errorChannel = "DefaultInboundErrorHandlerChannel")
public interface InboundMessagingGateway {

    @Gateway(requestChannel = "InboundEntryChannel")
    void receive(XferRes response);

}

接下来,我更新实体如下: 第2步:

@Transformer(inputChannel = "InboundEntryChannel", outputChannel = "TransmissionLogChannel")
public CassandraEntity createEntity(
        org.springframework.messaging.Message<XferRes> message) throws ParseException {
    XferRes response = message.getPayload();
    CassandraEntity entity = new CassandraEntity();
    // ... getters & setter ommitted for brevity
    return entity;
}

最后,我发帖到Kafka话题如下: 第3步:

@ServiceActivator(inputChannel = "TransmissionLogChannel", outputChannel="PublishChannel")
public XferRes updateCassandraEntity(
        org.springframework.messaging.Message<XferRes> message) {
    XferRes response = message.getPayload();
    this.cassandraServiceImpl.update(response);
    return response;
}

如果出现错误,我会将消息发布到发布错误对象以记录其中的服务:

@ServiceActivator(inputChannel = "PublishChannel")
public void publish(org.springframework.messaging.Message<XferRes> message){

        XferRes response = message.getPayload();
        publisher.post(response);       
    }

如果在更新数据库时步骤2:发生错误,那么我也想调用第3步。一个微不足道的方法是删除第2步&amp;从第1步进行更新数据库调用。

在Spring Integration中是否还有其他方法可以调用第3步,无论是否发生错误。

1 个答案:

答案 0 :(得分:1)

此技术称为PublishSubscribeChannel。由于我看到您在第二步中重用了有效负载以发送到第三步,因此它绝对是PublishSubscribeChannel及其两个连续订阅者的用例。

我的意思是您创建了一个PublishSubscribeChannel @Bean,而@ServiceActivator个人使用此频道的名称。

Reference Manual中有更多信息。请注意ignoreFailures属性:

/**
 * Specify whether failures for one or more of the handlers should be
 * ignored. By default this is <code>false</code> meaning that an Exception
 * will be thrown whenever a handler fails. To override this and suppress
 * Exceptions, set the value to <code>true</code>.
 * @param ignoreFailures true if failures should be ignored.
 */
public void setIgnoreFailures(boolean ignoreFailures) {