在errorHandler中处理异常后,如何在Controller或Route中获取错误信息?
How to get the error message in Controller or Route after handling exception in errorHandler?
我必须自定义 Sftp Inbound 默认处理程序 LoggingHandler
并使用我自己的 CustomizedErrorHandler
扩展 ErrorHandler
。但是在处理异常后,我无法 return 向我的控制器发送任何消息。
我研究了几天,但没有发现可以使用 Controller
向我的 UI 显示我的自定义消息。以下是我的 CustomizedErrorHandler
、SftpInboundConfiguration
.
中的一些代码片段
SftpInboundConfiguration
public IntegrationFlow fileFlow() {
SftpInboundChannelAdapterSpec spec = Sftp
.inboundAdapter(getSftpSessionFactory())
.preserveTimestamp(true)
.remoteDirectory(getSourceLocation())
.autoCreateLocalDirectory(true)
.deleteRemoteFiles(false)
.localDirectory(new File(getDestinationLocation()));
return IntegrationFlows
.from(spec, e -> e.id(BEAN_ID)
.autoStartup(false)
.poller(sftpPoller())
)
.channel(sftpReceiverChannel())
.handle(sftpInboundMessageHandler())
.get();
}
………………
public PollerMetadata sftpPoller() {
PollerMetadata pollerMetadata = new PollerMetadata();
List<Advice> adviceChain = new ArrayList<>();
pollerMetadata.setErrorHandler(customErrorMessageHandler());
pollerMetadata.setTrigger(new PeriodicTrigger(5000));
return pollerMetadata;
}
………………
private CustomErrorMessageHandler customErrorMessageHandler() {
return new CustomErrorMessageHandler(
controlChannel(),
BEAN_ID
);
}
CustomErrorMessageHandler
public class CustomErrorMessageHandler implements ErrorHandler {
private final MessageChannel CONTROL_CHANNEL;
private final String BEAN_ID;
public CustomErrorMessageHandler(
MessageChannel controlChannel,
String beanID
) {
this.CONTROL_CHANNEL = controlChannel;
this.BEAN_ID = beanID;
}
public void handleError(@NotNull Throwable throwable) {
final Throwable rootCause = ExceptionUtils.getRootCause(throwable);
if (rootCause instanceof MessagingException) {
log.error("MessagingException : {} ", rootCause.getMessage());
} else if (rootCause instanceof SftpException) {
log.error("SftpException : {}", rootCause.getMessage());
} ... ... ...
else {
log.error("Unknown : Cause : {} , Error : {}",
rootCause, rootCause.getMessage());
}
log.info("Stopping SFTP Inbound");
boolean is_stopped = CONTROL_CHANNEL.send(
new GenericMessage<>("@" + BEAN_ID + ".stop()"));
if (is_stopped) {
log.info("SFTP Inbound Stopped.");
} else {
log.info("SFTP Inbound Stop Failed.");
}
}
}
现在我想从 if-else
语句中保存一些自定义消息并需要在 UI 中显示它。有什么方法可以保存消息并使用 Route 或 Controller
显示它?
不要自定义错误处理程序,而是使用 poller.errorChannel("myErrorChannel")
。
然后添加错误通道流量
@Bean
IntegrationFlow errors() {
return IntegrationFLows.from("myErrorChannel")
.handle(...)
...
.get();
发送给处理程序的消息是一个 ErrorMessage
,带有 MessagingException
负载,cause
和 failedMessage
是失败时的消息,并且originalMessage
这是适配器发出的原始消息。
处理异常后,您可以简单地调用控制器上的方法来告诉它状态。
我必须自定义 Sftp Inbound 默认处理程序 LoggingHandler
并使用我自己的 CustomizedErrorHandler
扩展 ErrorHandler
。但是在处理异常后,我无法 return 向我的控制器发送任何消息。
我研究了几天,但没有发现可以使用 Controller
向我的 UI 显示我的自定义消息。以下是我的 CustomizedErrorHandler
、SftpInboundConfiguration
.
SftpInboundConfiguration
public IntegrationFlow fileFlow() {
SftpInboundChannelAdapterSpec spec = Sftp
.inboundAdapter(getSftpSessionFactory())
.preserveTimestamp(true)
.remoteDirectory(getSourceLocation())
.autoCreateLocalDirectory(true)
.deleteRemoteFiles(false)
.localDirectory(new File(getDestinationLocation()));
return IntegrationFlows
.from(spec, e -> e.id(BEAN_ID)
.autoStartup(false)
.poller(sftpPoller())
)
.channel(sftpReceiverChannel())
.handle(sftpInboundMessageHandler())
.get();
}
………………
public PollerMetadata sftpPoller() {
PollerMetadata pollerMetadata = new PollerMetadata();
List<Advice> adviceChain = new ArrayList<>();
pollerMetadata.setErrorHandler(customErrorMessageHandler());
pollerMetadata.setTrigger(new PeriodicTrigger(5000));
return pollerMetadata;
}
………………
private CustomErrorMessageHandler customErrorMessageHandler() {
return new CustomErrorMessageHandler(
controlChannel(),
BEAN_ID
);
}
CustomErrorMessageHandler
public class CustomErrorMessageHandler implements ErrorHandler {
private final MessageChannel CONTROL_CHANNEL;
private final String BEAN_ID;
public CustomErrorMessageHandler(
MessageChannel controlChannel,
String beanID
) {
this.CONTROL_CHANNEL = controlChannel;
this.BEAN_ID = beanID;
}
public void handleError(@NotNull Throwable throwable) {
final Throwable rootCause = ExceptionUtils.getRootCause(throwable);
if (rootCause instanceof MessagingException) {
log.error("MessagingException : {} ", rootCause.getMessage());
} else if (rootCause instanceof SftpException) {
log.error("SftpException : {}", rootCause.getMessage());
} ... ... ...
else {
log.error("Unknown : Cause : {} , Error : {}",
rootCause, rootCause.getMessage());
}
log.info("Stopping SFTP Inbound");
boolean is_stopped = CONTROL_CHANNEL.send(
new GenericMessage<>("@" + BEAN_ID + ".stop()"));
if (is_stopped) {
log.info("SFTP Inbound Stopped.");
} else {
log.info("SFTP Inbound Stop Failed.");
}
}
}
现在我想从 if-else
语句中保存一些自定义消息并需要在 UI 中显示它。有什么方法可以保存消息并使用 Route 或 Controller
显示它?
不要自定义错误处理程序,而是使用 poller.errorChannel("myErrorChannel")
。
然后添加错误通道流量
@Bean
IntegrationFlow errors() {
return IntegrationFLows.from("myErrorChannel")
.handle(...)
...
.get();
发送给处理程序的消息是一个 ErrorMessage
,带有 MessagingException
负载,cause
和 failedMessage
是失败时的消息,并且originalMessage
这是适配器发出的原始消息。
处理异常后,您可以简单地调用控制器上的方法来告诉它状态。