当前位置: 首页 > 知识库问答 >
问题:

Spring Integration:如何截获所有Spring Integration组件并获取属性值到日志

周弘盛
2023-03-14

我需要在运行时拦截所有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:output-gateway并捕获url、request-channel和expected-response-type的值。我们需要为所有http出站网关这样做。

<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注入到wire-tap中,以便从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个答案

程举
2023-03-14

嗯,这不是标准的任务,尤其是对于您想要打印的阅读属性。此外,它们中的许多都是基于SpEL表达式的,实际值取决于请求消息。

虽然有一个组件是非常接近你想要得到的。它被称为消息历史。

您所需要的只是 -所有Spring集成组件都将被跟踪,并将它们存储到messagehistory.header_name中,以显示集成流上消息的整个路径。

<wire-tap channel="logger"/>

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

以截获应用程序中的所有通道并记录消息及其消息历史记录。

您可以为全局 创建自己的POJO订阅服务器( ),并执行一些智能逻辑从消息中提取MessageHistory:MessageHistory.read(Message<?>)。这样的MessageHistory是一个列表 ,实际上您可以在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);
    }

使用名称,您可以转到BeanFactory以获取真正的组件实例,并且已经在那里尝试提取您所需的属性,但同样:并非所有属性都可用,因为...

您还可以参考集成图,了解IntegrationNode实现的可能公共属性。

 类似资料:
  • 问题内容: 我尝试了很多,但是找不到解决方案。 这是我的项目结构。 我有一个updatePropertiesFile类,用于更新所有属性文件的密钥。我有大约200个属性文件。 因此,我需要的是,我需要编写一种方法来更新所有这些属性文件中的特定键。手动更改并不是那么实际。我需要编写一个执行此功能的应用程序。 我尝试使用resoucebundle机制。但是使用资源包,我们只能获得一个属性文件。我试过和

  • 问题内容: 我找不到使用Thymeleaf从URL获取属性的任何解决方案。例如,对于URL: 我需要获取“错误”属性值。如果有帮助,我也正在使用SpringMVC。 问题答案: 经过一番调查,我发现实际上是Spring EL问题。因此,使用null检查的完整答案是:

  • 我需要标签中的属性值。< br >例如。Name xmlns:xsi = " http://www . w3 . org/2001/XML inst " xsi:space schema = " Name _ 5879 . xsd "

  • 我有一个java代码可以将这些值追加到我的属性文件中 我的属性文件将有如下条目。 key1=主机、端口、orcl、用户名、密码 key2=主机、端口、orcl、用户名、密码 key3=主机、端口、orcl、用户名、密码等… 这些key1、key2和key3是连接名。 在进入属性文件之前,首先我必须检查该文件是否提供了连接名条目。我的意思是,如果用户再次使用key1或key2或key3连接名输入值,

  • 但是响应只返回用户和他们的一些属性,而不是我在门户中看到的所有属性。 进行REST调用以获取所有用户及其字段/属性的正确URI是什么?