Spring integration 入站适配器上没有errorChannel的异常行为
我有Spring integration 入站适配器上没有errorChannel的异常行为,spring-integration,Spring Integration,我有intaws:sqs消息驱动通道适配器,如果我在其上设置errorChannel,则下游异常会转到那里 但是,如果我没有设置错误通道,则不会记录异常。它不会转到预期的errorChannel。有没有一种方法至少可以记录这些异常?是否有一个默认的errorlogger,可以简单地记录这些错误 更新 根据注释发布XML和DSLconfig。通过在ServiceObject上为@NotBlank字段设置null,在持久性层模拟错误 ReThrow维修激活器: @组件 公开课改课{ public
intaws:sqs消息驱动通道适配器
,如果我在其上设置errorChannel
,则下游异常会转到那里
但是,如果我没有设置错误通道
,则不会记录异常。它不会转到预期的errorChannel。有没有一种方法至少可以记录这些异常?是否有一个默认的errorlogger
,可以简单地记录这些错误
更新
根据注释发布XML
和DSL
config。通过在ServiceObject
上为@NotBlank
字段设置null
,在持久性层模拟错误
ReThrow
维修激活器:
@组件
公开课改课{
public void rethrow(异常)引发异常{
抛出异常;
}
}
相同的DSL配置为:
@配置
公共类集成配置{
@豆子
公共消息生产者createSqsMessageDrivenChannelAdapter(
AmazonSQSAsync AmazonSQSAsync,
MessageChannel服务频道,
MessageChannel errorChannel,
@值(“${app.queue name}”)字符串队列名称){
SqsMessageDrivenChannelAdapter适配器=
新的SqsMessageDrivenChannelAdapter(amazonSQSAsync,queueName);
adapter.setVisibilityTimeout(5);
adapter.setWaitTimeOut(20);
adapter.setAutoStart(真);
adapter.setMaxNumberOfMessages(10);
adapter.setOutputChannel(服务通道);
adapter.setErrorChannel(errorChannel);
setMessageDeletionPolicy(SqsMessageDeletionPolicy.NO_REDRIVE);
返回适配器;
}
@豆子
公共集成流消息处理流(
MessageChannel服务频道,EntityManagerFactory EntityManagerFactory){
返回IntegrationFlows.from(serviceChannel)
.transform(Transformers.fromJson(ServiceObject.class))
.处理(
Jpa.outboundAdapter(entityManagerFactory)
.entityClass(ServiceObject.class)
.persistMode(persistMode.PERSIST),
e->e.transactional())
.get();
}
@豆子
公共集成流错误处理流(MessageChannel errorChannel){
返回IntegrationFlows.from(errorChannel)
.处理(
m->{
抛出(RuntimeException)m.getPayload();
})
.get();
}
@豆子
公共消息频道服务频道(){
return MessageChannels.publishSubscribe().get();
}
}
SqsMessageDrivenChannelAdapter
完全基于Spring Cloud AWS提供的SimpleMessageListenerContainerFactory
,它只是委托给我们提供的侦听器。从代码来看,没有任何错误处理。因此,目前处理此问题的最佳方法是显式设置一个error channel=“errorChannel”
,并通过订阅该全局errorChannel
的默认记录器进行记录
是:默认情况下,它不会转到
错误频道。我不确定我们的文件中是否有这样的官方声明。可能最好将其视为“默认无错误通道”,因此由底层协议客户机来处理抛出的错误。因为那里没有人,所以除非显式地设置错误通道,否则我们没有选择。当我将erroChannel
添加到int aws:sqs消息驱动通道适配器
时,消息现在被认为已成功处理,即异常
不会被抛出回调用方(SimpleMessageListenerContainerFactory
),因此,redrive
不会被触发,消息永远不会到达DLQ
。我想要实现的是通过errorChannel
记录日志,并且仍然向调用者抛出异常,因此,redrive
会被触发。我该如何实现?或者我需要改变方法吗?这可能无法使用NO\R实现EDRIVE
,因为它既需要路由到errorChannel
,也需要返回到调用者
。那么,只需为该errorChannel
创建一个服务激活器,它将获得一个异常
作为重新抛出的参数。这样,错误将被记录并返回到侦听器容器中r redrive.Channel“auditlog.errorChannel”有2个订阅服务器但是,日志适配器
从未被调用,因为我认为它们是在发送方的
线程上被调用的,rethrow
订阅服务器首先执行的。如果没有rethrow
进入错误频道,我怎么能让两个订阅服务器彼此独立呢rChannel
只需添加一个taskExecutor
即可解决此问题,然后rethrow
将转到errorChannel
(由于aysnc),从而在errorChannel
上造成无限循环。正确,它无法从新线程中重试。为什么要向该通道添加一个执行器?只需添加order=“100”
根据标准错误通道发送到您的rethrow service activator