2014-07-03 45 views
0

我正在使用s.i提供的兩個組件。有一個工作分配系統使用redis的隊列出站適配器丟失消息來分發任務

消息(任務)被髮送到這個名爲distribution的通道;分佈具有相關聯的通知系統,所以我可以參見通過JConsole的或任務控制的線抽頭當消息經過分佈:

<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:我有絲抽頭,以確保有關該錯誤是在distribuion組件

修訂

也許這配置可以幫助嗎? (還沒有進行測試,將更新當我做了) 的想法是有多個線程要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> 
+0

如果您只有一個訂閱服務器,您是否會丟失郵件? –

+0

我編輯了這篇文章,試圖更好地解釋; ...我失去了「分發」(消息實際上沒有發送到隊列),不在接待處。或者這是我的懷疑... – earroyoron

+0

ops!在分配之前,我有一個帶有分辨率 - 必需= true的標題 - 值 - 路由器....也許我錯過了這個組件中的消息。在我正在閱讀的文檔中使用默認輸出通道分辨率 - 所需的應該是假的.. – earroyoron

回答

0

爲了完成這個問題,我將我的評論移到這裏作爲答案。

由於<task:executor/>配置具有非常低的併發性(2)和AbortPolicy作爲默認配置,因此針對Redis執行的任務由於rejection而丟失。

只需要依靠單線程DirectChannel或確保任務執行程序的足夠大的線程池並將策略配置爲CallerRunsPolicy即可。

+0

非常感謝Artem,它運行良好, – earroyoron

相關問題