覆盖在@MessagingGateway中配置的errorChannel?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (57)

我已经配置了@MessagingGateway,如下所示使用错误通道,该通道按预期工作。

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

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

}

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

步骤1:

@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;
}

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

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

最后,我发布卡夫卡话题如下: 第3步:

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

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

如果发生错误,我会将消息发布到发布错误对象以记录摄入的服务:

@ServiceActivator(inputChannel="defaultInboundErrorHandlerChannel")
public void handleInvalidRequest(org.springframework.messaging.Message<MessageHandlingException> message) throws ParseException {
    XferRes originalRequest = (XferRes) message.getPayload().getFailedMessage().getPayload();
    this.postToErrorBoard(originalRequest)
}

如果在步骤2发生错误在更新数据库时,我也想调用步骤3。一个简单的方法是删除步骤2并进行调用以更新步骤1中的数据库。

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

提问于
用户回答回答于

这种技术被称为PublishSubscribeChannel。既然我看到你在第二步重用了一个有效载荷来发送到第三步,那么PublishSubscribeChannel对于它的两个连续订阅者肯定是一个用例。

我的意思是你创建一个PublishSubscribeChannel @Bean,这些@ServiceActivator是使用这个频道的名称。

/**
 * 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) {

扫码关注云+社区

领取腾讯云代金券