我需要审核通过spring-integration流程的每条消息,非常基本的流程。
应用程序从int-redis:queue-inbound-channel-adapter读取并写入int-http:outbound-gateway。
输出网关有一个回复通道,以便接收http方法的响应,正是在我想要注册de审计信息的时刻,包括初始消息和http响应。
如果http方法失败,消息将转到errorHandler,我可以获取带有时间戳和有效负载的历史对象,这对于审计来说是完美的。
但是如果http方法有效(Code 200,201 ...),我会收到一条消息,其中包含带有状态代码的ResponseEntity对象,但我没有来自redis的初始有效负载。
那么,有没有办法对两条消息进行核心化(在发送http出站之前和http响应之后)以获取审计的完整信息?
提前致谢!
这里是整合流程:
<int:message-history/>
<int:channel id="responseChannel"/>
<int:channel id="responseError"/>
<int:logging-channel-adapter channel="responseChannel" level="INFO"
expression="@messageHandlerSpel.handle( #this )" id="logger"/>
<int:logging-channel-adapter channel="responseError"
level="ERROR" expression="@errorHandlerSpel.handle( #this )"
id="LogingERROR"/>
<int-redis:queue-inbound-channel-adapter id="inputRedis" connection-factory="redisCF"
channel="redisInput" queue="redis-input" serializer="" error-channel="responseError"/>
<int:channel id="redisInput" />
<int-http:outbound-gateway id="HttpOutbound" request-channel="redisInput"
url="http://{server}:{port}/{index}/{type}/{id}"
http-method="PUT" extract-request-payload="true" charset="UTF-8"
reply-channel="responseChannel" request-factory="requestFactory"/>
处理程序类:
@Component
public class MessageHandlerSpel {
public String handle(Message<byte[]> message) {
MessageHeaders msgH = message.getHeaders();
MessageHistory msgHistory =
message.getHeaders().get(MessageHistory.HEADER_NAME, MessageHistory.class);
... // Do whatever
return "";
}
答案 0 :(得分:0)
一个技巧是在执行HTTP请求之前将请求payload
存储在自定义标头中。
收到回复后,请求标头将与该回复payload
合并。因此,在下游,您将同时拥有:标头中的请求和payload
中的回复。
MessageHistory
保持不变,并且没有理由以某种方式破解那里。
另一种方法是基于<aggregator>
来关联请求和回复。但是这个是针对更复杂或分布式的场景。
通过以下方式简单复制/粘贴到标题:
<header-enricher>
<header name="requestPayload" expressio="payload"/>
</header-enricher>
应该足够了。