我正在编写一个生产者以使用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>
答案 0 :(得分:1)
AWS Kinesis Binder中的PutRecord(s)
请求完全基于AmazonKinesisAsync
,并且发送到AWS的确是 async 。因此,我们不能在那里使用内置的RetryTemplate
功能。但是同时,该异步操作的错误会发送到特定于目的地的errorChannel
:https://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。
渠道名称基于目的地和消费者组,加上后缀errors
:https://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);
}