我正在使用Spring Integration(4.1)配置从数据库中检索作为批处理的消息而不是服务。我知道我每天都会处理十几条消息,因此我需要每天运行一次。
我的jdbc:inbound-channel-adapter配置为检索max-rows-per-poll =“1”。我希望在没有更多消息时以某种方式收到通知,以便我可以退出批处理,但是我有找到“插件”的问题。我尝试使用一个拦截器记住最后一条消息通过+一个计划任务,检索该时间戳并检查它是否超过配置的超时,但感觉非常麻烦并尝试使用AOP,这感觉是一个更好的解决方案。
我想拦截对AbstractPollingEndpoint.doPoll()的调用,当没有消息但我无法找到方法时,我会返回false:我尝试了继承AbstractRequestHandlerAdvice但是在应用时不起作用在轮询器上(它在日志中告诉我)。现在我正在尝试实现MethodInterceptor并配置如下,我看到我可以拦截对“call”方法的调用,但我不确定它是正确的方法
<int:poller default="true" trigger="periodicTriggerWithInitialDelay">
<int:advice-chain>
<bean class="com.myBatch.NoMoreMessageNotifierAdvice" />
<ref bean="txAdvice"/>
</int:advice-chain>
</int:poller>
有没有更简单的方法来做到这一点?正如http://forum.spring.io/forum/spring-projects/integration/127410-poller-with-advice-chain所述,主要的困难在于,在这个阶段,我们没有信息可以继续。
由于
文森特
答案 0 :(得分:0)
看起来我实际上非常接近答案..因为我可以访问调用方法的结果,所以我需要做的就是抛出异常,如果result为false,以及来自问题的XML配置:
public class NoMoreMessageNotifierAdvice实现了MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Object result=invocation.proceed();
if(result instanceof Boolean){
boolean hasPolledAMessage=(Boolean)result;
if(hasPolledAMessage){
return true;
}
else{
throw new StopBatchException("no message was received on latest poll -> throwing exception to exit");
}
}
return result;
}
}
答案 1 :(得分:0)
即将发布的4.2版本(我们刚刚发布the first milestone)支持conditional pollers。