4

RPC に RMI を使用するマルチプロセス プロジェクトに取り組んでいます。

私たちが直面している問題は、プロセス間で受け渡さなければならないメイン オブジェクトが非常に大きく (シリアル化された場合)、コードのパフォーマンスが劇的に低下することです。

オブジェクト全体を変更するプロセスはなく、オブジェクトの小さな部分のみを変更するプロセスはないため、RMI を介して「変更」を渡すことにしました。

しかし、そのような概念を実装する適切な方法が見つかりませんでした。最初のアイデアは、メイン インスタンスのすべての変更を追跡することでした。しかし、これによると、これは簡単ではないようです。

私たちができる方法が必要です:

  • 急速に発展する
  • 速く実行する

なにか提案を?

4

4 に答える 4

0

この「メイン オブジェクト」を、リモート インターフェイスを実装するリモート オブジェクトにして、前後にシリアル化する代わりにエクスポートします。

于 2012-10-18T04:41:02.027 に答える
0

シリアル化をカスタマイズして、変更のみを送信できるようにするのが最善の方法だと思います。
private void writeObject(java.io.ObjectOutputStream stream) の private メソッドを実装し、もちろん反対側から readObject を実装することでそれを行うことができます。さて、あなたはこの関数で何をすべきですか? 変更されたすべてのメンバーのビットマップを管理し、シリアライゼーションでのみ送信することをお勧めします。変更されていないメンバーを null に変更して、シリアライゼーションでオブジェクトを送信し、そこに値を返します。反対側でビットマップを読み取ると、方法がわかります

于 2013-01-30T13:01:33.953 に答える
-1

http://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.htmlをご覧ください。

public class Test {
    PropertyChangeSupport pcs = new PropertyChangeSupport(this);
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        String oldName = this.name;
        this.name = name;
        pcs.firePropertyChange("name", oldName, name);
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        int oldAge = this.age;
        this.age = age;
        pcs.firePropertyChange("age", oldAge, age);

    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        pcs.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        pcs.removePropertyChangeListener(listener);
    }

    public Test(){

    }
    public static void main (String[] args){
        Test myTestObject = new Test();
        myTestObject.addPropertyChangeListener(new MyPropertyChangeListener());
        myTestObject.setAge(12);
        myTestObject.setName("Rick");
        myTestObject.setName("Andrew");
    }
    private static class MyPropertyChangeListener implements  PropertyChangeListener {
        @Override
        public void propertyChange(PropertyChangeEvent event) {
            String clazz = event.getSource().getClass().getName();
            System.out.println(clazz+"::"+event.getPropertyName()+" changed from "+event.getOldValue()+" to "+event.getNewValue());
        }
    }
}

これは単純な例ですが、このアプローチを使用すると、さまざまな PropertyChangeListeners を作成し、それらのメソッド propertyChange 内にさまざまなロジックを提供できます。また、すべての属性ではなく、一部の属性の変更のみを起動することもできます (oldValue を保存せず、PropertyChangeSupport の firePropertyChange メソッドを起動しません)。

もちろん、AOP を使用することもできますが、上記のようなソリューションを探している可能性があります。これが役立つことを願っています。

于 2012-10-18T08:34:20.770 に答える
-1

初めてオブジェクト全体を渡す必要があります。

オブジェクトで PropertyChangeListener を使用すると、PropertyChangeEvent が生成されます。

PropertyChangeEvent を渡すことができます。オブジェクトを識別することができる getSource() があります。これでは不十分で、IOR やその他の参照が必要な場合は、ラッパーを作成して送信してください。

-マディ

于 2012-10-17T07:12:30.900 に答える