我需要在运行时拦截所有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"));
}
}
}
答案 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<?>)
。这样的MessageHistory
是List<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
实现的可能的公共属性。