使用redis的队列出站适配器丢失消息以分发任务

时间:2014-07-03 15:26:48

标签: redis spring-integration

我正在使用s.i提供的两个组件。有一个有效的分配系统

消息(任务)被发送到这个名为distribution的通道;分发有一个与通知系统相关联的分路器,所以当消息通过分发时我可以看到víajconsole或任务控制:

  <int:channel id="distribution">
        <int:interceptors>
            <int:wire-tap channel="distributionPublish"/>
        </int:interceptors>
    </int:channel>

然后我使用redis作为队列系统:

  <redis:queue-outbound-channel-adapter
            id="toRedis" channel="distribution" queue="Qname"
            auto-startup="true" extract-payload="false"  />


    <!-- a Queue Inbound Channel Adapter is available to 'right pop' messages
        from a Redis List. -->
    <redis:queue-inbound-channel-adapter
            id="fromRedis" channel="execution" queue="Qname"
        receive-timeout="1000" recovery-interval="1000" expect-message="true"
            auto-startup="true"/>

使用以下配置和2台服务器,每台服务器占50%的消息;主要是一个服务器具有Web服务接口并将消息放入输入队列,然后所有订阅和阻止的服务器都获取消息(任务)

但是当我加速系统时,会丢失信息。我不知道为什么,我不知道我能做什么。我已经增加了redis池值并继续这个问题,

我做错了什么,或者如何在分发组件中实现“重试”?

PD:我有线控以确定错误在分发组件

已更新

也许这个配置有帮助吗? (仍未测试,我会更新时更新) 我们的想法是让几个线程进入redis

  <int:channel id="distribution">
        <int:dispatcher task-executor="DistributionTaskExecutor"/>
        <int:interceptors>
            <int:wire-tap channel="distributionPublish"/>
        </int:interceptors>
    </int:channel>
    <!-- to handle high demanding we use several threads to go to redis -->
    <task:executor id="DistributionTaskExecutor" pool-size="2" />

    <redis:queue-outbound-channel-adapter
            id="toRedis" channel="distribution" queue="${instance}"
            auto-startup="true" extract-payload="false"  />

更新:

最后,我正在使用此配置,似乎运行良好或。至少,更好:

 <int:channel id="distribution">
        <int:queue capacity="50"/>
    </int:channel>

    <task:executor id='distributionExecutor' pool-size='25' queue-capacity='25' rejection-policy="CALLER_RUNS"/>

    <redis:queue-outbound-channel-adapter
            id="toRedis" channel="distribution" queue="${instance}"
            auto-startup="true" extract-payload="false">
        <int:poller task-executor='distributionExecutor' fixed-delay='500'>
        </int:poller>
    </redis:queue-outbound-channel-adapter>

1 个答案:

答案 0 :(得分:0)

为了完成这个问题,我在这里将我的评论作为答案。

由于<task:executor/>配置具有非常低的并发性(2)并且AbortPolicy为默认值,因此rejection已经丢失了针对Redis执行的任务。

需要依赖单线程DirectChannel或确保任务执行程序有足够大的线程池,并将策略配置为CallerRunsPolicy