Spring 与 Java Dls 集成中的错误处理
ErrorHandling in Spring Integration with Java Dsl
我想知道在 SI Java Dsl 中使用 serviceActivators 处理错误的正确方法是什么。
我有这样的 Spring 集成 xml 配置:
<jms:message-driven-channel-adapter id="messageIn" auto-startup="false"
container="messageNotificationJms" channel="messageChannel"
error-channel="customErrorChannel"/>
<channel id="messageChannel"/>
<chain input-channel="messageChannel">
<!-- some logic and service-activator -->
</chain>
<channel id="customErrorChannelTpm"/>
<chain input-channel="customErrorChannel" output-channel="nullChannel">
<service-activator ref="errorService" method="stopEndpoints" />
</chain>
但是现在,我正在尝试使用 SI Java DSL 来配置此上下文,所以我创建了这样的配置
@Configuration
@EnableIntegration
public class SIConfig {
@Autowired
AbstractMessageListenerContainer messageNotificationJms;
@Autowired
ErrorService errorService;
@Bean
public MessageChannel messageChannel() {
return MessageChannels.direct("messageChannel").get();
}
@Bean
public MessageChannel customErrorChannel() {
return MessageChannels.direct("customErrorChannel").get();
}
@Bean
public JmsMessageDrivenChannelAdapter messageIn() {
return Jms.messageDriverChannelAdapter(messageNotificationJms)
.id("messageIn")
.autoStartup(false)
.outputChannel(messageChannel())
.errorChannel(customErrorChannel())
.get();
}
@Bean
public IntegrationFlow customErrorFlow() {
return IntegrationFlows.from(customErrorChannel())
//.handle () ?????????????????????????
.get();
}
@Bean
public IntegrationFlow messageFlow() {
//some logic
}
}
作为句柄方法参数,我尝试使用像这样的 lambda 表达式
.handle(message -> errorService.stopEndpoints(message))
但是由于参数类型和return类型存在编译错误。
我有一个没有编译错误的非显而易见的变体,但我不确定它能否在环境中正常工作。正确吗?:
.<ErrorMessage>handle((payload, headers) -> {
errorService.stopEndpoints(payload);
return null;
})
此外,我的 ErrorHandler class。
@Component
public class ErrorService implements ErrorHandler {
@Override
public void handleError(Throwable t) {
stopEndpoints(t);
}
public void stopEndpoints(ErrorMessage errorMessage) {
Throwable throwable = errorMessage.getPayload();
stopEndpoints(throwable);
}
private void stopEndpoints(Throwable t) {
//stoppingEndpoints
}
}
编辑:我使用 Spring Framework 4.1.6、Spring Integration 4.1.3 和 SI Java DSL 1.0.1
您可以使用 handle(String beanName, String methodName)
变体:
handle("errorService", "stopEndpoints");
或
handle("errorService", "handleError");
在第二种情况下,框架将负责解包负载。
我想知道在 SI Java Dsl 中使用 serviceActivators 处理错误的正确方法是什么。 我有这样的 Spring 集成 xml 配置:
<jms:message-driven-channel-adapter id="messageIn" auto-startup="false"
container="messageNotificationJms" channel="messageChannel"
error-channel="customErrorChannel"/>
<channel id="messageChannel"/>
<chain input-channel="messageChannel">
<!-- some logic and service-activator -->
</chain>
<channel id="customErrorChannelTpm"/>
<chain input-channel="customErrorChannel" output-channel="nullChannel">
<service-activator ref="errorService" method="stopEndpoints" />
</chain>
但是现在,我正在尝试使用 SI Java DSL 来配置此上下文,所以我创建了这样的配置
@Configuration
@EnableIntegration
public class SIConfig {
@Autowired
AbstractMessageListenerContainer messageNotificationJms;
@Autowired
ErrorService errorService;
@Bean
public MessageChannel messageChannel() {
return MessageChannels.direct("messageChannel").get();
}
@Bean
public MessageChannel customErrorChannel() {
return MessageChannels.direct("customErrorChannel").get();
}
@Bean
public JmsMessageDrivenChannelAdapter messageIn() {
return Jms.messageDriverChannelAdapter(messageNotificationJms)
.id("messageIn")
.autoStartup(false)
.outputChannel(messageChannel())
.errorChannel(customErrorChannel())
.get();
}
@Bean
public IntegrationFlow customErrorFlow() {
return IntegrationFlows.from(customErrorChannel())
//.handle () ?????????????????????????
.get();
}
@Bean
public IntegrationFlow messageFlow() {
//some logic
}
}
作为句柄方法参数,我尝试使用像这样的 lambda 表达式
.handle(message -> errorService.stopEndpoints(message))
但是由于参数类型和return类型存在编译错误。
我有一个没有编译错误的非显而易见的变体,但我不确定它能否在环境中正常工作。正确吗?:
.<ErrorMessage>handle((payload, headers) -> {
errorService.stopEndpoints(payload);
return null;
})
此外,我的 ErrorHandler class。
@Component
public class ErrorService implements ErrorHandler {
@Override
public void handleError(Throwable t) {
stopEndpoints(t);
}
public void stopEndpoints(ErrorMessage errorMessage) {
Throwable throwable = errorMessage.getPayload();
stopEndpoints(throwable);
}
private void stopEndpoints(Throwable t) {
//stoppingEndpoints
}
}
编辑:我使用 Spring Framework 4.1.6、Spring Integration 4.1.3 和 SI Java DSL 1.0.1
您可以使用 handle(String beanName, String methodName)
变体:
handle("errorService", "stopEndpoints");
或
handle("errorService", "handleError");
在第二种情况下,框架将负责解包负载。