9.1.4. 取消异步调用

通过调用Future.cancel()方法可以非常方便的取消一个异步调用。分布式远程服务允许在三个阶段中任何一个阶段取消异步调用:

  1. 远程调用请求在列队中排队阶段
  2. 远程调用请求已经被分布式远程服务接受,还未发送应答回执,执行尚未开始。
  3. 远程调用请求已经在执行阶段

想要正确的处理第三个阶段,在服务端代码里应该检查Thread.currentThread().isInterrupted()的返回状态。范例如下:

  1. // 远程接口
  2. public interface MyRemoteInterface {
  3. Long myBusyMethod(Long param1, String param2);
  4. }
  5. // 匹配远程接口的异步接口
  6. @RRemoteAsync(MyRemoteInterface.class)
  7. public interface MyRemoteInterfaceAsync {
  8. RFuture<Long> myBusyMethod(Long param1, String param2);
  9. }
  10. // 远程接口的实现
  11. public class MyRemoteServiceImpl implements MyRemoteInterface {
  12. public Long myBusyMethod(Long param1, String param2) {
  13. for (long i = 0; i < Long.MAX_VALUE; i++) {
  14. iterations.incrementAndGet();
  15. if (Thread.currentThread().isInterrupted()) {
  16. System.out.println("interrupted! " + i);
  17. return;
  18. }
  19. }
  20. }
  21. }
  22. RRemoteService remoteService = redisson.getRemoteService();
  23. ExecutorService executor = Executors.newFixedThreadPool(5);
  24. // 注册远程服务的服务端的同时,通过单独指定的ExecutorService来配置执行线程池
  25. MyRemoteInterface serviceImpl = new MyRemoteServiceImpl();
  26. remoteService.register(MyRemoteInterface.class, serviceImpl, 5, executor);
  27. // 异步调用方法
  28. MyRemoteInterfaceAsync asyncService = remoteService.get(MyRemoteInterfaceAsync.class);
  29. RFuture<Long> future = asyncService.myBusyMethod(1L, "someparam");
  30. // 取消异步调用
  31. future.cancel(true);