Прежде всего хочу сказать, что Spring Integration - это отличный материал. Шляпы для команды для такой прочной основы.Аудит аудита весны
Вот мой текущий вызов. Моя цель состоит в том, чтобы обрабатывать сквозную информацию аудита в потоке сообщений. Например, сохраните текущий SI Message
в полете, его Message
ID, все Payload
s содержатся в пределах Message
и конкретных «атрибутах», которые относятся к Message
, таких как «orderId», «customerId», «partId» и т. Д.
Вы можете представить себе синхронный поток, который может работать в течение 6 месяцев, когда могут потребоваться отчеты для определения доступности этой конкретной услуги (например, неудачные транзакции в сравнении с успешными транзакциями с конкретными значениями атрибута, транзакции с определенным статусом , сбои и т. д.).
Если у меня есть следующий поток:
gateway->channel1->object-to-json-transformer->channel2->outbound-gateway
gateway
имеет один метод, который принимает аргумент MyRequest
и возвращает тип MyResponse
. Когда поток начнется, я смогу wire-tap
channel1
и маршрутизировать все данные на этом канале в канал аудита, например, auditChannel
.
<int:channel id="auditChannel"/>
<int-jdbc:outbound-channel-adapter data-source="auditDataSource" channel="auditChannel"
query="insert into MESSAGE (PAYLOAD,CREATED_DATE) values (:payload, :createdDate)"
sql-parameter-source-factory="messageSpelSource"/>
<bean id="messageSpelSource"
class="org.springframework.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory">
<property name="parameterExpressions">
<map>
<entry key="payload" value="payload.toString()"/>
<entry key="createdDate" value="new java.util.Date()"/>
</map>
</property>
</bean>
выше подпоток (от channel1
через auditChannel
) не приводит к Message
объекта для записи payload
карт. Вместо этого тип MyRequest
. Это имеет смысл, так как я не хочу сортировать исходящий экземпляр Message
, но он все еще оставляет мне дилемму отсутствия доступа к конверту Message
для целей аудита.
Если у меня есть намерение предоставить универсальное средство аудита, которое по требованию сохраняется в общей схеме схемы интеграции (например, в таблице сообщений MESSAGE (message_id, corre_id, payload, timestamp) и MESSAGE_ATTRIBUTE (attribute_id, message_id, name, value) table), как я могу гарантировать, что у меня всегда есть доступ к ядру Message
, когда I wire-tap
канал в потоке?
Этот прецедент - это то, что мне пришлось иметь дело много лет назад с пользовательской интеграционной структурой, поэтому я знаю, что это актуальная проблема.
Надеюсь, моя просьба не слишком завышена. Возможно, есть простой способ справиться с этим, и я просто не вижу его.
Хм, я понял, что должен, вероятно, обернуть «MyRequest» объектом «Message» и передать экземпляр «Message» в качестве параметра для моего метода «gateway». Это коснулось бы того, чтобы «прокрутить» сообщение «Сообщение». Чтобы идти дальше, я предполагаю, что мне может понадобиться «фильтр» или «трансформатор» до «int-jdbc: outbound-channel-adaptor», чтобы «разбить» атрибуты полезной нагрузки на «java.util.Map» что я смогу затем продолжить как часть экземпляра «Message». Я не пробовал это, но похоже, что он должен работать. – Rai