Spring集成:如何拦截所有spring集成组件并获取属性值以记录

时间:2018-07-24 12:51:41

标签: spring-integration

我需要在运行时拦截所有Spring Integration组件,并且应该能够获取属性值以记录有意义的消息。 例如:

<int-http:outbound-gateway url="someURL" http-method="GET"
                           request-channel="channel1"
                           expected-response-type="com.example.Test"
                           message-converters="customMessageConverters">
    <int-http:uri-variable name="testId" expression="headers.testId"/>
</int-http:outbound-gateway>

在上面的示例中,我需要拦截int-http:outbound-gateway并捕获url,request-channel和Expected-response-type的值。我们需要对所有http出站网关执行此操作。

类似地,对于所有其他组件,例如int-http:inbound-gateway,int-http:inbound-channel-adapter,int:transformer,int:header-enricher,int:chain,int:router等,

我尝试创建一个实现BeanPostProcessor的自定义类-postProcessAfterInitialization方法。检查Bean名称是否与组件匹配,并尝试检索所有详细信息,但是会创建Bean,并在服务器启动本身时调用此方法。我的要求是在用户导航以及调用任何特定路线时捕获流量。另外,除了以下内容之外,我无法找到所有组件的Java类名称。仍在寻找其余的。 用于int-http:inbound-gateway的org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway,用于int-http:outbound-gateway的org.springframework.integration.http.outbound.AbstractHttpRequestExecutingMessageHandler

更新: 我已经尝试了以下内容,但是在日志中看不到任何有关消息历史记录的额外输出。上面的代码中缺少什么吗?

<int:message-history />
<int:logging-channel-adapter id="logging"
    log-full-message="true" logger-name="message.history" level="DEBUG"/>
    <int:wire-tap pattern="*" order="3" channel="logging" /> 

<int:message-history /> 
    <int:logging-channel-adapter id="logger"
    log-full-message="true" logger-name="message.history" level="DEBUG"/>
<int:channel id="wiretapChannel">
    <int:interceptors>
        <int:wire-tap channel="logger"/>
    </int:interceptors>
</int:channel>  

此外,我试图将LogMessage插入到窃听中,以便从MessageHistory数据执行一些其他任务。但是控件没有输入handleMessage方法。请帮忙。

<bean id="logMessage" class="com.logging.LogMessage"/> 
<int:service-activator input-channel="wiretapChannel" ref="logMessage" method="handleMessage"></int:service-activator>

public class LogMessage {
public void handleMessage(org.springframework.messaging.Message<?> message) throws MessagingException {
MessageHistory history = MessageHistory.read(message);
for (int i = 0; i < history.size(); i++) {
    Properties properties = history.get(i);
    getLogger().info("history: " + properties.get("name"));
}    
}
}

1 个答案:

答案 0 :(得分:0)

嗯,这不是那么标准的任务,特别是对于您要打印的阅读属性。其中更多是基于SpEL表达式,而实际值取决于请求消息。

虽然有一个组件与您想要的组件非常接近。它称为Message History

您所需要的只是<int:message-history/>-所有Spring Integration组件都会被跟踪并将它们存储到MessageHistory.HEADER_NAME中,以显示集成流程中消息的整个路径。

此外,我通常也使用类似这样的东西:

<wire-tap channel="logger"/>

<logging-channel-adapter id="logger" log-full-message="true" logger-name="message.history"/>

拦截应用程序中的所有频道并使用其消息历史记录消息。

您可以为全局<service-activator>创建自己的POJO订户(<wire-tap>),并执行一些智能逻辑以从消息MessageHistory中提取MessageHistory.read(Message<?>)。这样的MessageHistoryList<Properties>,实际上,您可以在Properties类中投射MessageHistory.Entry并遍历其属性:

    public String getName() {
        return this.getProperty(NAME_PROPERTY);
    }

    public String getType() {
        return this.getProperty(TYPE_PROPERTY);
    }

    public String getTimestamp() {
        return this.getProperty(TIMESTAMP_PROPERTY);
    }

使用name,您可以转到BeanFactory来获取真实的组件实例,并且已经在这里尝试提取所需的属性以达到您的目的,但同样:并非所有的属性都将可用只是因为...

您还可以向Integration Graph咨询IntegrationNode实现的可能的公共属性。