我正在使用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>
答案 0 :(得分:0)
为了完成这个问题,我在这里将我的评论作为答案。
由于<task:executor/>
配置具有非常低的并发性(2)并且AbortPolicy
为默认值,因此rejection
已经丢失了针对Redis执行的任务。
需要依赖单线程DirectChannel
或确保任务执行程序有足够大的线程池,并将策略配置为CallerRunsPolicy
。