2016-01-14 7 views
2

Прежде всего хочу сказать, что 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-tapchannel1 и маршрутизировать все данные на этом канале в канал аудита, например, 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 канал в потоке?

Этот прецедент - это то, что мне пришлось иметь дело много лет назад с пользовательской интеграционной структурой, поэтому я знаю, что это актуальная проблема.

Надеюсь, моя просьба не слишком завышена. Возможно, есть простой способ справиться с этим, и я просто не вижу его.

+0

Хм, я понял, что должен, вероятно, обернуть «MyRequest» объектом «Message» и передать экземпляр «Message» в качестве параметра для моего метода «gateway». Это коснулось бы того, чтобы «прокрутить» сообщение «Сообщение». Чтобы идти дальше, я предполагаю, что мне может понадобиться «фильтр» или «трансформатор» до «int-jdbc: outbound-channel-adaptor», чтобы «разбить» атрибуты полезной нагрузки на «java.util.Map» что я смогу затем продолжить как часть экземпляра «Message». Я не пробовал это, но похоже, что он должен работать. – Rai

ответ

1

Не совсем понятно, что вы считаете проблемой; вы можете добавить дополнительные параметры, такие как ...

<entry key="timestamp" value="headers['timestamp']"/> 

... что мне не хватает в вашем вопросе?

Все сообщение доступно с помощью "#this".

+0

Ах. Вау.Я должен признать, что мои знания SpEL не слишком велики. Так что похоже на SpEL, я могу получить доступ к сообщению в любой точке моей конфигурации? Кроме того, из примеров, которые я нашел из разных источников, я видел «заголовки ['id']", где я предполагал, что это идентификатор сообщения. Вместо этого следует использовать «# this.id»? – Rai

+0

Нет; 'headers ['id']' (или 'headers.id') верны (или' # this.headers ['id'] '). '# this' - это объект сообщения, который имеет два свойства' headers' и 'payload'. Обычно я предпочитаю использовать 'headers ['foo']', а не 'headers.foo', потому что последний не будет работать, если заголовок отсутствует (вы получите исключение, а не' null'). –

+0

Изначально я пытался использовать 'headers ['id']' как мой ключ для сохранения сообщения. Возможно, это не помогло мне молча из-за неправильного типа данных, когда я ожидал числовое значение. Похоже, это UUID. Что касается хранения атрибутов полезной нагрузки, таких как 'customerId', как упоминалось в OP, следует ли устанавливать их как записи заголовка в сообщении или изобретать мою собственную структуру, чтобы они сохранялись в виде пар имя/значение (например, таблица message_attribute)? Мое намерение состоит в том, чтобы иметь данные, которые могут быть запрошены с использованием SQL, если это необходимо клиенту, например, для определенного диапазона дат. – Rai

Смежные вопросы