在Aggregator中使用JDBCMessageStore

时间:2016-08-01 21:16:20

标签: spring-integration aggregator aggregators

我正在尝试了解使用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>

0 个答案:

没有答案