Spring Integration Auditing

时间:2016-01-14 19:15:01

标签: spring spring-integration

首先要说Spring Integration是一些很棒的东西。向团队致敬,以获得如此坚实的框架。

这是我目前面临的挑战。我的目标是处理消息流中审计信息的横切关注点。例如,存储飞行中的当前SI Message,其Message ID,Payload中包含的所有Message以及属于{{的上下文特定“属性”例如“orderId”,“customerId”,“partId”等。

您可以想象一个可能运行6个月的同步流,其中可能需要运行报告以确定该特定服务的可用性(例如,失败的事务与成功,具有特定“属性”值的事务,处于特定状态的事务,故障转移发生等)。

如果我有以下流程:

Message

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_id,correlation_id,payload,timestamp)表和MESSAGE_ATTRIBUTE(attribute_id,message_id,name,value)表),我怎样才能确保每当Message流程中的某个通道时,我始终可以访问核心Message实例?

这个用例是我多年前用自定义集成框架处理的事情,所以我知道这是一个有效的问题。

我希望我的要求不会太过分。也许有一种简单的方法可以解决这个问题,我只是没有看到它。

1 个答案:

答案 0 :(得分:1)

你认为是什么问题并不完全清楚;您可以添加更多参数,例如......

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

......你在问题中遗漏了什么?

使用"#this"可以获得整个邮件。