【发布时间】:2019-04-23 11:51:56
【问题描述】:
我在 Spring Integration DSL 中实现了以下流程:
- 从 HTTP 获取提要
- 丰富 errorChannel 标头(在此处处理下游所有异常的点)。
- 将消息转换为集合
- 将集合拆分为单独的消息
- 将每条消息发送到下一个处理通道
@Bean
public IntegrationFlow inboundHttpFlow(
Puller puller,
HeaderEnricher errorHandlingChannelHeaderEnricher,
FeedTransformer feedTransformer,
MessageChannel outputFeedIntegrationChannel
) {
final Consumer<SourcePollingChannelAdapterSpec> pollingSpec = spec ->
spec
.poller(Pollers.cron(SCHEDULE_EVERY_HALF_MINUTE)
.errorChannel(INBOUND_ERROR_CHANNEL));
return IntegrationFlows
.from(puller, pollingSpec)
.enrichHeaders(errorHandlingChannelHeaderEnricher)
.transform(feedTransformer)
.split()
.channel(outputFeedIntegrationChannel)
.get();
}
我的 errorHandlingChannelHeaderEnricher 在哪里:
@Component
public class ErrorHandlingChannelHeaderEnricher implements HeaderEnricher {
@Override
public void accept(HeaderEnricherSpec spec) {
spec.header(
MessageHeaders.ERROR_CHANNEL,
INBOUND_ERROR_CHANNEL,
true
);
}
}
当 feedTransformer 在工作应用程序中抛出异常时,它会按预期设置 errorChannel。但是我不知道如何编写一个测试来测试抛出的异常是否进入标题中定义的 errorChannel ?
当我试图以给定的方式在测试中模拟它时,它不起作用,因为异常被抛出回调用者而不是 errorChannel:
// given
Throwable transformerException = new IllegalStateException();
when(feedTransformerMock.apply(any())).thenThrow(transformerException);
// when
var testFeedMessage = MessageBuilder
.withPayload(pullerResult)
.build();
inboundHttpFlow.getInputChannel().send(testFeedMessage); // excetpion returns to caller here
// then
verify(errorHandlerSpy).accept(transformerException);
异常是典型的:
org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessageHandlingException: nested exception is java.lang.IllegalStateException, failedMessage=GenericMessage [payload=test-payload, headers={errorChannel=inboundErrorChannel, id=f77a6a01-9bca-5af3-8352-7edb4c5e94b0, timestamp=1556019833867}]
, failedMessage=GenericMessage [payload=test-payload, headers={errorChannel=inboundErrorChannel, id=f77a6a01-9bca-5af3-8352-7edb4c5e94b0, timestamp=1556019833867}]
我假设由于 DirectChannel 和在这个测试示例中缺少轮询器与实际流程(使用轮询器)相比。 有什么方法可以模拟抛出异常并检查它是否真的进入了 header 中定义的 errorChannel?
【问题讨论】:
标签: spring junit error-handling spring-integration spring-integration-dsl