• 9.1.4. 取消异步调用

    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);