You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Integration网关REST接口请求响应耗时日志配置方案咨询

嗨,我来帮你搞定Spring Integration网关的操作耗时日志配置!其实这个思路和你之前给kafka-outbound-channel-adapter配置自定义request-handler-advice-chain的逻辑是相通的,只是网关的配置方式需要调整一下,咱们一步步来实现:

第一步:自定义耗时统计的Advice类

首先你需要写一个继承自AbstractRequestHandlerAdvice的自定义Advice,用来拦截网关方法的调用,记录开始和结束时间并计算耗时。这个类的作用就像你给kafka adapter用的那个自定义advice一样,是切面逻辑的载体:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.integration.handler.AbstractRequestHandlerAdvice;
import org.springframework.messaging.Message;

import java.util.concurrent.TimeUnit;

public class GatewayTimingAdvice extends AbstractRequestHandlerAdvice {
    private static final Logger logger = LoggerFactory.getLogger(GatewayTimingAdvice.class);

    @Override
    protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) throws Exception {
        // 记录调用开始时间
        long startTime = System.nanoTime();
        try {
            // 执行原方法逻辑
            return callback.execute();
        } finally {
            // 计算耗时并输出日志,这里可以从消息头里获取网关方法名
            long elapsedNanos = System.nanoTime() - startTime;
            String methodName = message.getHeaders().get("spring.integration.gateway.method.name", String.class);
            logger.info("Gateway method [{}] completed in {} ms", 
                        methodName, 
                        TimeUnit.NANOSECONDS.toMillis(elapsedNanos));
            // 如果需要更详细的日志,还可以添加请求参数、请求ID等信息
        }
    }
}

第二步:配置Advice的Bean

把刚才写的自定义Advice注册成Spring Bean,这样才能在网关配置里引用它:

<bean id="gatewayTimingAdvice" class="com.test.GatewayTimingAdvice" />

第三步:给网关方法配置Advice Chain

接下来就可以把这个Advice绑定到你的网关方法上了——和kafka adapter的配置类似,只是网关的advice是配置在<int:method>标签里(单个方法生效),或者<int:gateway>标签里(所有方法默认生效):

方式1:给单个网关方法添加耗时日志

只针对evaluateTransaction方法生效,修改你的网关配置:

<int:gateway id="testServiceGateway" 
             service-interface="com.test.ws.TransactionServices" 
             default-reply-time-out="5000" 
             error-channel="txErrorChan">
    <int:method name="evaluateTransaction" 
                request-channel="tranRequestChan" 
                reply-channel="tranResponseChan" 
                reply-time-out="3000"
                advice-chain="gatewayTimingAdvice" /> <!-- 这里添加advice-chain引用 -->
</int:gateway>

方式2:给网关所有方法默认添加耗时日志

如果你的网关有多个方法,想统一都加耗时统计,可以把advice-chain升级为default-advice-chain配置在<int:gateway>标签上:

<int:gateway id="testServiceGateway" 
             service-interface="com.test.ws.TransactionServices" 
             default-reply-time-out="5000" 
             error-channel="txErrorChan"
             default-advice-chain="gatewayTimingAdvice"> <!-- 全局默认生效 -->
    <int:method name="evaluateTransaction" 
                request-channel="tranRequestChan" 
                reply-channel="tranResponseChan" 
                reply-time-out="3000" />
    <!-- 其他方法也会自动应用这个耗时统计Advice -->
</int:gateway>

额外说明

  • 这个Advice的finally块确保了即使方法调用抛出异常,耗时也会被记录下来,不会丢失日志。
  • 消息头里的spring.integration.gateway.method.name是Spring Integration自动添加的,用来标识当前调用的网关方法名,非常方便日志定位。
  • 如果你需要更复杂的日志逻辑(比如根据耗时阈值打印不同级别日志、记录请求参数等),都可以在doInvoke方法里扩展。

这样配置完成后,每次调用网关的evaluateTransaction方法时,控制台或者日志文件里就会输出该操作的耗时信息啦!

内容的提问来源于stack exchange,提问作者Teja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 06:58:10