代码之家  ›  专栏  ›  技术社区  ›  geowa4

异步Java RMI

  •  4
  • geowa4  · 技术社区  · 15 年前

    最近我需要使用RMI,我已经足够了解我需要做什么了,但是有一件事让我很感兴趣,因为我重新讨论这个话题。是否可以对服务器上的同一个服务进行异步RMI调用?

    假设我在客户机上有N个线程和一个服务器端对象——调用它S.S有一个方法,我想从我的客户机端线程调用它,但是我不希望它阻塞,因为它没有共享资源需要担心。

    有什么想法吗?或者这是一种更好的方法吗?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Robin    15 年前

    这样做应该没有问题。从服务的角度来看,它相当于多个客户机同时调用同一个服务。

    任何服务器端对象都应该被写入以保证并发访问的安全。

        2
  •  1
  •   rfders    15 年前

    可能您应该使用类似于jms队列的东西来在J2EE体系结构上进行异步调用。在这些情况下,它工作得很好。

        3
  •  1
  •   Nikita Koksharov    8 年前

    使用 Redisson 框架远程服务可以在客户端redisson实例的同一节点上注册,甚至可以在与客户端redisson实例共享的同一JVM上注册。

    让我们假设 YourServiceImpl 包含远程调用和实现所需的方法 YourService 接口。

    应通过远程服务对象在Redisson中注册YoursServiceImpl:

    YourService yourService = new YourServiceImpl();
    
    RRemoteService remoteService = redisson.getRemoteService();
    remoteService.register(YourService.class, yourService);
    

    远程调用可以异步方式进行,并标记单独的接口 具有 @RRemoteAsync 注释。方法签名应与远程接口中的相同方法匹配。 每个方法都应该返回 org.redisson.core.RFuture 对象。它延伸 java.util.concurrent.Future java.util.concurrent.CompletionStage 接口和 几乎没有什么有用的方法。

    public interface YourService {
    
        Long someMethod1(Long param1, String param2);
    
        void someMethod2(MyObject param);
    
        MyObject someMethod3();
    
    }
    
    // async interface for YourService
    @RRemoteAsync(YourService.class)
    public interface YourServiceAsync {
    
        RFuture<Long> someMethod1(Long param1, String param2);
    
        RFuture<Void> someMethod2(MyObject param);
    
    }
    

    要远程调用方法,请使用 YourServiceAsync 接口:

    RRemoteService remoteService = redisson.getRemoteService();
    YourServiceAsync asyncService = remoteService.get(YourServiceAsync.class);
    
    RFuture<Long> res = asyncService.someMethod1(12L, "param");
    res.thenApply(r -> {
        ...
    });
    

    更多文档是 here