重试使用Spring Cloud Stream库将消息推送到Kinesis

时间:2018-12-02 14:22:40

标签: amazon-kinesis spring-cloud-stream

我正在编写一个生产者以使用Spring云流库将消息推送到Kinesis流。我能够成功地将数据推送到kinesis,但在kinesis方面却失败,吞吐量超出了异常。有没有办法重试推送这些消息再次出现,确切地知道哪个消息失败了?另外,我不想使用KPL或KCL。

我尝试了答案中建议的解决方案,这是我的配置:

spring.cloud.stream.bindings.input.producer.errorChannelEnabled:真实的spring.cloud.stream.bindings.input.producer.error.destination: myFooDestination.myGroup.errors

这是正确的方法吗,然后如何在Spring Integration中将“ spring.cloud.stream.bindings.input.producer.error.destination:myFooDestination.myGroup.errors”映射到“错误通道”属性配置如下?

<int-http:inbound-channel-adapter id="abcErrorChannel"
                                      channel="defChannel"
                                      **error-channel="errorChannel**"
                                  </int-http:inbound-channel-adapter>

2 个答案:

答案 0 :(得分:1)

AWS Kinesis Binder中的PutRecord(s)请求完全基于AmazonKinesisAsync,并且发送到AWS的确是 async 。因此,我们不能在那里使用内置的RetryTemplate功能。但是同时,该异步操作的错误会发送到特定于目的地的errorChannelhttps://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_producer_properties

  

errorChannelEnabled

When set to true, if the binder supports asynchroous send results, send failures are sent to an error channel for the destination. See “[binder-error-channels]” for more information.
     

默认值:false。

渠道名称基于目的地和消费者组,加上后缀errorshttps://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#spring-cloud-stream-overview-error-handling

  

此外,如果您绑定到现有目的地,例如:

spring.cloud.stream.bindings.input.destination=myFooDestination
spring.cloud.stream.bindings.input.group=myGroup
     

完整目标名称为myFooDestination.myGroup,然后专用错误通道名称为myFooDestination.myGroup.errors

答案 1 :(得分:0)

客户群体仅适用于消费者。在生产者方面,没有这样的组概念。为了绑定到生产者端的错误通道,使用下面的属性和下面的代码来绑定到错误通道。

spring.cloud.stream.bindings.output.destination=kinesis-stream
spring.cloud.stream.bindings.output.producer.errorChannelEnabled=true

@ServiceActivator(inputChannel = "kinesis-stream.errors")
public void receiveProduceError(Message receiveMsg) {
    System.err.println("receive error msg: " + receiveMsg);
}