- 9.1.4. 取消异步调用
9.1.4. 取消异步调用
通过调用Future.cancel()方法可以非常方便的取消一个异步调用。分布式远程服务允许在三个阶段中任何一个阶段取消异步调用:
- 远程调用请求在列队中排队阶段
- 远程调用请求已经被分布式远程服务接受,还未发送应答回执,执行尚未开始。
- 远程调用请求已经在执行阶段
想要正确的处理第三个阶段,在服务端代码里应该检查Thread.currentThread().isInterrupted()的返回状态。范例如下:
// 远程接口public interface MyRemoteInterface {Long myBusyMethod(Long param1, String param2);}// 匹配远程接口的异步接口@RRemoteAsync(MyRemoteInterface.class)public interface MyRemoteInterfaceAsync {RFuture<Long> myBusyMethod(Long param1, String param2);}// 远程接口的实现public class MyRemoteServiceImpl implements MyRemoteInterface {public Long myBusyMethod(Long param1, String param2) {for (long i = 0; i < Long.MAX_VALUE; i++) {iterations.incrementAndGet();if (Thread.currentThread().isInterrupted()) {System.out.println("interrupted! " + i);return;}}}}RRemoteService remoteService = redisson.getRemoteService();ExecutorService executor = Executors.newFixedThreadPool(5);// 注册远程服务的服务端的同时,通过单独指定的ExecutorService来配置执行线程池MyRemoteInterface serviceImpl = new MyRemoteServiceImpl();remoteService.register(MyRemoteInterface.class, serviceImpl, 5, executor);// 异步调用方法MyRemoteInterfaceAsync asyncService = remoteService.get(MyRemoteInterfaceAsync.class);RFuture<Long> future = asyncService.myBusyMethod(1L, "someparam");// 取消异步调用future.cancel(true);
