Асинхронный Java RMI - PullRequest
       17

Асинхронный Java RMI

4 голосов
/ 14 декабря 2009

В последнее время мне нужно было использовать RMI, и я знаю достаточно для того, что мне нужно сделать, но одна вещь меня заинтриговала, когда я снова захожу в эту тему. Можно ли сделать асинхронные вызовы RMI для одной и той же службы на сервере?

Допустим, у меня есть n потоков на клиенте и один объект на стороне сервера - назовите его S. S имеет единственный метод, который я хочу вызвать из моих потоков на стороне клиента, но я не хочу, чтобы он блок, так как у него нет общего ресурса, о котором можно беспокоиться.

Есть идеи? Или это то, что лучше оставить другим методам?

Ответы [ 3 ]

4 голосов
/ 14 декабря 2009

Не должно быть никаких проблем с этим. Это эквивалентно тому, что несколько клиентов одновременно обращаются к одной и той же службе с точки зрения службы.

Любой объект на стороне сервера должен быть написан, чтобы быть безопасным для одновременного доступа.

1 голос
/ 04 июня 2016

Использование Redisson Framework Удаленная служба инфраструктуры может быть зарегистрирована на одном узле с экземпляром Redisson на стороне клиента и даже на той же JVM, совместно используемой с экземпляром Redisson на стороне клиента.

Предположим, YourServiceImpl содержит метод, который вам нужен для удаленного вызова, и реализует YourService интерфейс.

YourServiceImpl должен быть зарегистрирован в Redisson через объект RemoteService:

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 -> {
    ...
});

Больше документации здесь

1 голос
/ 14 декабря 2009

Вероятно, вам следует работать с чем-то вроде очереди JMS для асинхронных вызовов в архитектуре J2EE. Это прекрасно работает в этих случаях.

...