bagaimana cara menggunakan di RMI (Kode sisi klien) suatu peristiwa yang ditentukan dalam kode sisi server?

Di RMI (kode sisi klien), bagaimana saya bisa menggunakan peristiwa yang ditentukan dalam kode sisi server?

Misalnya, kode sisi server berikut mendefinisikan acara PropertyChangeSupport.

Bagaimana cara menerapkannya di sisi klien?

package rmiservice.services.calculator;

import java.beans.PropertyChangeSupport;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.LinkedList;
import java.util.Queue;

public class CalculatorService extends UnicastRemoteObject implements ICalculator {
private Queue<Integer> numbers = new LinkedList<Integer>();
private Integer result;
***private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);***


public CalculatorService() throws RemoteException {
    super();

}


public void start() throws Exception {
    java.rmi.registry.LocateRegistry.createRegistry(1099);
    Naming.bind("CalculatorService", this);
    System.out.println("Calculator Service is Run  . . .");
}

public void stop() throws Exception {

    Naming.unbind("CalculatorService");
    UnicastRemoteObject.unexportObject(this, true);

    System.out.println("Calculator Service is Stop . . .");

}

//-------------------------------------------------------------------
//------------------------------ Implements ICalculator -------------

public void addNumber(Integer number) throws Exception {
    numbers.add(number);
}

public Integer getResult() throws Exception {
    return this.result;
}

public void setResult(Integer result) throws Exception {
    Integer oldResult = this.getResult();
    this.result = result;
    ***propertyChangeSupport.firePropertyChange("result", oldResult, result);***
}

public void calculate(Operation operation) throws Exception {
    Integer _result = 0;

    if (numbers.size() < 2)
        return;

    switch (operation) {
        case Add: {
            _result = 0;
            while (numbers.size() > 0) {
                _result += numbers.poll();
            }
            break;
        }

        case Substract: {
            _result = numbers.poll();
            while (numbers.size() > 0) {
                _result -= numbers.poll();
            }
            break;
        }

    }

    this.setResult(_result);

}
//-------------------------------------------------------------------

}


person user2049371    schedule 12.02.2013    source sumber
comment
Jika nilai properti diubah di sisi server, bagaimana klien dapat diberitahu tentang perubahan tersebut?   -  person user2049371    schedule 12.02.2013
comment
Coba cari panggilan balik RMI   -  person MadProgrammer    schedule 12.02.2013
comment
Anda tidak ingin melakukan ini. Biaya overhead sangat besar. Anda perlu membuat metode jarak jauh Anda lebih rumit, agar layak dieksekusi ketika mempertimbangkan overhead dan penundaan jaringan.   -  person user207421    schedule 11.09.2014


Jawaban (3)


RMI tidak mendukung Notifikasi. Tapi, Anda bisa menggunakan JMX Beans dengan dukungan Event yang dapat digunakan melalui RMI.

Antarmuka MBean Anda harus memperluas NotificationEmitter untuk melakukan hal ini .

person R Kaja Mohideen    schedule 12.02.2013
comment
Jika nilai properti diubah di sisi server, bagaimana klien dapat diberitahu tentang perubahan tersebut? - person user2049371; 12.02.2013
comment
Seperti yang saya sebutkan, Anda harus menggunakan Notifikasi. Anda dapat membaca lebih lanjut tentang ini dari Situs Oracle - docs.Oracle.com/ javase/tutorial/jmx/notifs/index.html - person R Kaja Mohideen; 12.02.2013

Jangan gunakan colSums atau terapkan pada data.frame juga.
person julien.giband    schedule 10.04.2014
comment
Tidak harus berupa subkelas UnicastRemoteObject. Itu dapat diekspor secara manual. - person user207421; 12.09.2014
comment
Saya benar-benar tidak mendapatkan suara negatifnya: ini adalah solusi yang benar-benar berfungsi, dijelaskan secara rinci, dan tidak ada penjelasan mengapa ini buruk! - person julien.giband; 15.03.2016

Saya mungkin salah memahami pertanyaannya.

Namun sejauh yang saya tahu RMI tidak melibatkan diri dalam pengikatan acara yang Anda tanyakan.

Klien pada dasarnya akan mencari objek yang terdaftar di RMI Registry dan memanggil metode di dalamnya.

Anda harus menerapkan kode penanganan acara sendiri.

Jika Anda bertanya bagaimana cara memanggil metode objek terikat RMI, Anda dapat menemukannya di

http://en.wikipedia.org/wiki/Java_remote_method_invocation

person Thihara    schedule 12.02.2013
comment
Jika nilai properti diubah di sisi server, bagaimana klien dapat diberitahu tentang perubahan tersebut? - person user2049371; 12.02.2013
comment
Satu-satunya pilihan jika Anda hanya menggunakan RMI adalah terus melakukan polling, atau memiliki Registri RMI lain di klien... Tapi itu berantakan... - person Thihara; 12.02.2013
comment
Dia tidak memerlukan Registry di klien. Klien dapat mendaftarkan panggilan balik ke server. - person user207421; 13.02.2013
comment
Hanya dengan RMI? Bisakah mengarahkan saya ke sumber tentang itu?? Saya tidak tahu bahwa itu mungkin.... - person Thihara; 13.02.2013
comment
Sudahlah googling dan ketemu.. docs.oracle.com/cd /E13211_01/wle/rmi/callbak.htm - person Thihara; 13.02.2013