重载MessageHistory对象以审计purpouses

时间:2016-04-14 18:00:38

标签: spring-integration

我需要审核通过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 "";
}

1 个答案:

答案 0 :(得分:0)

一个技巧是在执行HTTP请求之前将请求payload存储在自定义标头中。

收到回复后,请求标头将与该回复payload合并。因此,在下游,您将同时拥有:标头中的请求和payload中的回复。

MessageHistory保持不变,并且没有理由以某种方式破解那里。

另一种方法是基于<aggregator>来关联请求和回复。但是这个是针对更复杂或分布式的场景。

通过以下方式简单复制/粘贴到标题:

<header-enricher>
    <header name="requestPayload" expressio="payload"/>
</header-enricher>

应该足够了。