首先要说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
实例?
这个用例是我多年前用自定义集成框架处理的事情,所以我知道这是一个有效的问题。
我希望我的要求不会太过分。也许有一种简单的方法可以解决这个问题,我只是没有看到它。
答案 0 :(得分:1)
你认为是什么问题并不完全清楚;您可以添加更多参数,例如......
<entry key="timestamp" value="headers['timestamp']"/>
......你在问题中遗漏了什么?
使用"#this"
可以获得整个邮件。