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