我想知道如何在Spring Integration Java DSL中仅限制调用者处理执行程序通道的错误。
e.g。
在我的用例中,我有一个ExecutorChannel
(大小为100来限制输入)以便调用者发送事件,轮询器将轮询队列并发送到ExecutorChannel
进行异步处理(假设处理是CPU密集型的,我们将任务执行程序的池大小限制为2)。异步处理的结果将发送回调用者。此外,如果异步处理存在异常抛出。原始调用者将处理异常,而不是让全局错误处理程序来处理它。
我不知道如何指定一个通道,只有调用者才能看到<h2 id="score"><span id="pl1">0</span>-<span id="pl2">0</span></h2>
<div id="left">
<label for="rock">Rock</label><br>
<input type="radio" name="q" class="q" id="rock"></input><br>
<label for="paper">Paper</label><br>
<input type="radio" name="q" class="q" id="paper"></input><br>
<label for="scissors">Scissors</label><br>
<input type="radio" name="q" class="q" id="scissors"></input><br>
<button id="confirm" class="button" onClick="playBot()" style="margin-bottom: 10px;">Confirm</button>
</div><p id="result"></p>
抛出的错误,并在Spring Integration Java DSL中以私有方式处理它。
答案 0 :(得分:0)
为此,您必须为某些errorChannel
指定MessageChannel
标题,这与您的来电者完全相同。
ExecutorChannel
基于MessagePublishingErrorHandler
,其代码如下:
private MessageChannel resolveErrorChannel(Throwable t) {
Message<?> failedMessage = (t instanceof MessagingException) ?
((MessagingException) t).getFailedMessage() : null;
if (this.defaultErrorChannel == null && this.channelResolver != null) {
this.defaultErrorChannel = this.channelResolver.resolveDestination(
IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME);
}
if (failedMessage == null || failedMessage.getHeaders().getErrorChannel() == null) {
return this.defaultErrorChannel;
}
Object errorChannelHeader = failedMessage.getHeaders().getErrorChannel();
if (errorChannelHeader instanceof MessageChannel) {
return (MessageChannel) errorChannelHeader;
}
Assert.isInstanceOf(String.class, errorChannelHeader,
"Unsupported error channel header type. Expected MessageChannel or String, but actual type is [" +
errorChannelHeader.getClass() + "]");
return this.channelResolver.resolveDestination((String) errorChannelHeader);
}
注意failedMessage.getHeaders().getErrorChannel()
的部分。
适合您的现成解决方案是@MessagingGateway
errorChannel
选项。这个使用完全相同的errorChannel
标头技术,并且只在@MessagingGateway
的范围内处理或重新抛出异常。