我正在使用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>
如果您只有一個訂閱服務器,您是否會丟失郵件? –
我編輯了這篇文章,試圖更好地解釋; ...我失去了「分發」(消息實際上沒有發送到隊列),不在接待處。或者這是我的懷疑... – earroyoron
ops!在分配之前,我有一個帶有分辨率 - 必需= true的標題 - 值 - 路由器....也許我錯過了這個組件中的消息。在我正在閱讀的文檔中使用默認輸出通道分辨率 - 所需的應該是假的.. – earroyoron