【问题标题】:Exit Spring Integration when no more messages没有更多消息时退出 Spring Integration
【发布时间】:2015-06-01 07:17:58
【问题描述】:

我正在使用 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 所述,主要困难是在这个阶段,我们没有消息可以处理。

谢谢

文森特

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    看起来我实际上非常接近答案。由于我可以访问调用方法的结果,所以我需要做的就是在结果为 false 时抛出异常,以及来自问题的 XML 配置:

    公共类 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;
    }
    

    }

    【讨论】:

      【解决方案2】:

      即将发布的 4.2 版本(我们刚刚发布了the first milestone)支持conditional pollers

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-08
        • 2019-07-02
        • 2020-04-30
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2016-01-25
        • 2016-02-17
        相关资源
        最近更新 更多