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深度整合,可自动收集通道的各类发送指标,也能自定义指标记录最后发送时间:
- 引入Micrometer依赖后,框架会自动生成
spring_integration_channel_send_*系列指标,包含发送时间戳等维度,可通过监控平台查询计算时间差。 - 自定义指标示例:
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
相关产品推荐
相关产品推荐

