如何停止 Flux.interval()
创建的间隔流
在Reactor框架中,Flux.interval(Duration duration)
方法用于创建一个每隔指定时间发射一次信号的数据流。默认情况下,这个数据流是无限的,会持续发送新的值,直到被显式地终止。
要停止这样一个无限流,可以通过管理订阅(Subscription)来实现。以下是详细的步骤:
1. 创建并订阅间隔流
首先,创建一个Flux.interval()
,然后订阅它:
Flux<Long> interval = Flux.interval(Duration.ofSeconds(1));
interval.subscribe();
这里,Duration.ofSeconds(1)
表示每隔一秒钟发射一个新的值。
2. 捕获订阅对象
在订阅时,可以通过Reactor提供的操作符(如 doOnSubscribe()
)来捕获订阅对象:
Subscription subscription = null;
Flux<Long> interval = Flux.interval(Duration.ofSeconds(1))
.doOnSubscribe(s -> {
subscription = s;
});
interval.subscribe();
这样,在订阅时,会将Subscription
对象赋值给变量subscription
。
3. 停止间隔流
当需要停止数据流时,调用 Subscription.cancel()
方法:
if (subscription != null) {
subscription.cancel();
subscription = null; // 防止重复取消
}
这样,订阅会被终止,不再发射新的值。
完整示例代码
以下是一个完整的示例,展示了如何启动和停止一个间隔流:
import reactor.core.publisher.Flux;
import reactor.core.subscription.Subscription;
public class IntervalExample {
private Subscription subscription;
public void startInterval() {
Flux<Long> interval = Flux.interval(Duration.ofSeconds(1))
.doOnSubscribe(s -> {
this.subscription = s;
});
interval.subscribe();
}
public void stopInterval() {
if (subscription != null) {
subscription.cancel();
subscription = null;
}
}
public static void main(String[] args) throws InterruptedException {
IntervalExample example = new IntervalExample();
// 启动间隔流
example.startInterval();
System.out.println("Interval started.");
// 等待5秒后停止
Thread.sleep(5000);
example.stopInterval();
System.out.println("Interval stopped.");
}
}
运行结果
运行上述代码,你将看到如下输出:
Interval started.
[每隔一秒打印一次Long值]
Interval stopped.
在第5秒时,间隔流被停止,不再发送新的值。
注意事项
- 及时取消订阅:确保在不需要数据流时调用
cancel()
方法,以释放资源。 - 空检查:在调用
cancel()
之前,最好进行空检查,避免出现空指针异常。 - 线程安全:如果在多线程环境下操作订阅对象,请考虑使用线程安全的方式管理
Subscription
。
通过以上方法,你可以轻松地控制由Flux.interval()
创建的无限流的生命周期。