Использование JDBCMessageStore в Агрегаторе
Я пытаюсь понять поведение Агрегатора при использовании JDBCMessageStore. Ниже приведен мой пример использования:
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) Разделить сообщение заказа на основе количества элементов заказа
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 заказанными элементами
2) Получено сообщение об ошибке - таблица не существует - (ожидается, что INT_GROUP_TO_MESSAGE не существует)
3) я мог найти записи в 2 таблицах
а) INT_MESSAGE_GROUP было 1 запись.
б) INT_MESSAGE было 23 записи. Похоже, что сообщение было повторено несколько раз, было сделано несколько записей.
4) Создал таблицу INT_GROUP_TO_MESSAGE
5) Размещено 1 заказное сообщение с 1 заказным товаром
6) Исходное сообщение (шаг 1) вместе с новым (шаг 5) было взято из очереди и обработано.
7) Агрегатор выпустил группу из 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>