Уведомление RMI от сервера клиенту при обновлении - PullRequest
3 голосов
/ 09 марта 2012

Я пишу фиктивное приложение для доставки. Клиент отправляет продукт, а сервер сохраняет все отправленные продукты.

Теперь сервер - потому что он просто виртуальный - обновляет состояние продукта каждую минуту (ОТПРАВИТЬ -> ПРИНЯТО -> ОТПРАВЛЕНО -> ПОЛУЧЕНО), теперь я хочу, чтобы сервер обновил соответствующий клиент, когда он обновил состояние .

Большая часть информации RMI, о которой я говорю, говорит только о клиенте -> сервере ... Но мне нужен мой сервер, чтобы вызвать моего клиента для этого ..

Надеюсь, вы, ребята, можете помочь!

Ответы [ 3 ]

6 голосов
/ 09 марта 2012

Связь между сервером и клиентом является чем-то вроде минного поля во всех технологиях удаленного взаимодействия, включая RMI. Вероятно, поэтому вы изо всех сил пытаетесь найти много документации по этому вопросу. Для фиктивной программы в контролируемой среде будет работать следующий подход, и это самый простой путь. Обратите внимание, что вся обработка ошибок была опущена.

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

interface ClientRemote extends Remote {
    public void doSomething() throws RemoteException;
}

interface ServerRemote extends Remote {
    public void registerClient(ClientRemote client) throws RemoteException;
}

class Client implements ClientRemote {
    public Client() throws RemoteException {
        UnicastRemoteObject.exportObject(this, 0);
    }

    @Override
    public void doSomething() throws RemoteException {
        System.out.println("Server invoked doSomething()");
    }
}

class Server implements ServerRemote {
    private volatile ClientRemote client;

    public Server() throws RemoteException {
        UnicastRemoteObject.exportObject(this, 0);
    }

    @Override
    public void registerClient(ClientRemote client) throws RemoteException {
        this.client = client;
    }

    public void doSomethingOnClient() throws RemoteException {
        client.doSomething();
    }
}

Использование: Создайте объект Server на сервере, добавьте его в реестр RMI и найдите его на клиенте.

Существуют и другие технологии, упрощающие уведомления клиентов, для этого обычно используется Java Message Service (JMS).

0 голосов
/ 09 марта 2012

Клиент может зарегистрироваться с помощью обратного вызова.

http://docs.oracle.com/cd/E13211_01/wle/rmi/callbak.htm

0 голосов
/ 09 марта 2012

Ваш клиент может очень часто запрашивать сервер и обновлять себя, или вы можете запрограммировать свой клиент, поскольку он является сервером RMI, и сервер отслеживает клиента, который подключен к нему, и перезванивает клиента, используя rmi, когда значения сервера изменились. Вы можете посмотреть Протокол SNMP поддерживает обратные вызовы ( snmp traps )

...