入站适配器跳过消息

时间:2014-01-28 03:52:56

标签: spring-integration

这就是我的配置的样子

<int-file:inbound-channel-adapter id="files" directory="${lz.dir.${ft}}">
    <int:poller fixed-delay="3000" max-messages-per-poll="3"  />
</int-file:inbound-channel-adapter>

<int:bridge input-channel="files" output-channel="sourceFiles" />

<int:channel id="sourceFiles">
    <int:dispatcher task-executor="executor" />
</int:channel>

<int:service-activator  input-channel="sourceFiles" 
                        ref="moveToSource" 
                        method="move" />

<int:aggregator id="filesBuffered" 
                input-channel="sourceFiles"
                output-channel="stagedFiles"
                release-strategy-expression="size() == 10" 
                correlation-strategy-expression="'mes-group'" 
                expire-groups-upon-completion="true" 
                />

<int:channel id="stagedFiles" />

<int:service-activator  input-channel="stagedFiles"
                        ref="moveToStage"   
                        method="move" />

<task:executor id="executor" pool-size="5" queue-capacity="0" rejection-policy="CALLER_RUNS" />

这个想法是每隔3秒轮询一个目录,并根据通道向调度程序发出3条消息,以允许异步执行。然后根据消息数量聚合消息,然后将消息发送到下一个服务激活器。第一个服务激活器将文件放在源目录和第二个服务激活器中,它获取聚合列表以将这些文件移动到临时目录。

似乎正在发生的事情是源文件夹跳过某些文件,但是暂存文件夹确实获取了所有文件。我的猜测是,poller将消息发送到调度程序通道,但是当它的线程池变满时,它只是忽略了文件,但不知何故聚合器仍然获取所有文件。几乎像调度程序通道跳过了它在线程池限制到达后收到的文件的第一个服务激活器步骤,但这些文件仍然传递到下一个通道,这就是它们最终如何被第二个服务激活器处理。

我想要做的是让轮询器重新发送调度程序拒绝的文件。任何想法都将不胜感激。

由于

1 个答案:

答案 0 :(得分:0)

抱歉,我不明白你的描述,但是你的配置看起来像是:

  1. sourceFiles频道是点对点频道。因此,一次只有一个订阅者可以从该频道获取消息。
  2. 但您有两个订阅者 - 服务激活器和聚合器
  3. 默认dispatcher使用RoundRobinLoadBalancingStrategy。这意味着,第一个消息将由第一个订户处理,第二个消息将由第二个订户处理,依此类推,如继电器。
  4. 因此,如果您想要顺序,则需要将聚合器订阅到moveToSource服务激活器的出站通道,并从move方法返回相同的负载。在您的情况下File
  5. 如果不是您的情况,请提供,请更正配置或解释您的用例。 现在很困惑,抱歉。

    HTH