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

Spring中DirectChannel的getTimeSinceLastSend()方法被移除后如何替代?

替代DirectChannel.getTimeSinceLastSend()的方案

Spring 5.3及后续版本移除了DirectChannel等通道的统计类方法,包括getTimeSinceLastSend(),可以通过以下两种方式实现替代:

一、自定义拦截器实现统计

通过ChannelInterceptor拦截消息发送动作,自行维护最后发送时间:

  • 编写自定义拦截器:
public class SendTimeTrackerInterceptor implements ChannelInterceptor {
    private volatile long lastSendTimestamp = System.currentTimeMillis();

    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        this.lastSendTimestamp = System.currentTimeMillis();
        return message;
    }

    public long getTimeSinceLastSend() {
        return System.currentTimeMillis() - this.lastSendTimestamp;
    }
}
  • 将拦截器注册到DirectChannel:
DirectChannel directChannel = new DirectChannel();
SendTimeTrackerInterceptor tracker = new SendTimeTrackerInterceptor();
directChannel.addInterceptor(tracker);

// 调用tracker.getTimeSinceLastSend()即可获取上次发送至今的时间差

二、使用Micrometer集成监控(推荐)

Spring Integration与Micrometer深度整合,可自动收集通道的各类发送指标,也能自定义指标记录最后发送时间:

  1. 引入Micrometer依赖后,框架会自动生成spring_integration_channel_send_*系列指标,包含发送时间戳等维度,可通过监控平台查询计算时间差。
  2. 自定义指标示例:
public class MicrometerSendTimeInterceptor implements ChannelInterceptor {
    private final Gauge lastSendTimeGauge;

    public MicrometerSendTimeInterceptor(MeterRegistry meterRegistry) {
        this.lastSendTimeGauge = Gauge.builder("direct.channel.last.send.timestamp", () -> System.currentTimeMillis())
                .tag("channel", "your-channel-name")
                .register(meterRegistry);
    }

    @Override
    public Message<?> preSend(Message<?> message, MessageChannel channel) {
        lastSendTimeGauge.set(System.currentTimeMillis());
        return message;
    }
}

注册该拦截器到目标通道后,即可通过Micrometer的指标体系获取并计算时间差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:36:07