我正在尝试了解使用JDBCMessageStore时Aggregator的行为。以下是我的用例:
1)从队列中读取消息(订单详细信息)。
<?xml version="1.0" encoding="UTF-8"?>
<order xmlns="http://www.example.org/orders">
<orderItem>
<isbn>12333454443</isbn>
<quantity>4</quantity>
</orderItem>
<orderItem>
<isbn>545656777</isbn>
<quantity>50</quantity>
</orderItem>
..
..
</order>
一条订单消息将包含多个 orderItem 。
2)根据 orderItem
的计数拆分订单消息3)聚合成4个 orderItem 消息; messageCountReleaseStrategy用于threshold = 4
4)转发到聚合消息到服务激活器。
我正在观察3个表中的数据:INT_MESSAGE_GROUP,INT_MESSAGE和INT_GROUP_TO_MESSAGE,似乎数据最初插入这3个表中,当组被释放时,日期将从这些表中删除/删除。
我想在其中一个表(INT_GROUP_TO_MESSAGE)中检查数据库插入失败。为了模拟错误,我删除了表INT_GROUP_TO_MESSAGE。
运行以下测试:
1)发布1 订单消息,其中包含3 orderItem
2)消息出错 - 表不存在 - (预期INT_GROUP_TO_MESSAGE不存在)
3)我可以在2个表中找到记录
a)INT_MESSAGE_GROUP有1条记录。
b)INT_MESSAGE有23条记录。好像多次重试了消息,完成了多个条目。
4)创建表INT_GROUP_TO_MESSAGE
5)发布1 订单消息,其中包含1 orderItem
6)从队列中拾取原始消息(步骤1)和新消息(步骤5)并进行处理。
7)Aggregator发布了一组4条消息。8)但是在数据库表 - INT_MESSAGE 中仍然存在23条记录,而其他表是空的。
我在删除表时模拟了Db错误,但在生产中我们可能会遇到可能导致这些插入失败的内存,表空间问题。
我的问题是我们可以设置任何参数,以便在3个表中有事务:INT_MESSAGE_GROUP,INT_MESSAGE和INT_GROUP_TO_MESSAGE?
以下是我的配置
<int-jms:message-driven-channel-adapter id="jmsIn"
channel="mqInbound"
destination="requestQueue"
message-converter="orderMessageConverter"/>
<int:splitter input-channel="mqInbound" output-channel="item" expression="payload.orderItem"/>
<int:aggregator input-channel="item" output-channel="itemList"
ref="orderAggregator" method="sendList"
correlation-strategy="orderAggregator" correlation-strategy-method="groupOrders"
expire-groups-upon-completion="true" release-strategy="messageCountReleaseStrategy"
message-store="messageStore" discard-channel="aggregatorDiscardChannel" />
<int-jdbc:message-store id="messageStore" data-source="jdbcDatasource" table-prefix="MY_INT_"/>
<bean id="messageCountReleaseStrategy" class="org.springframework.integration.aggregator.MessageCountReleaseStrategy">
<constructor-arg index="0" value="4"/>
</bean>