0

2つのクライアントを持つdb4oサーバーを備えたシステムがあります。1つのクライアントは処理中にホストされ、もう1つはデータベースにクエリを実行する必要のある多数のサーブレットをホストするWebサーバーです。

Webサーバーの接続コードで、commitイベントに登録し、それを使用して、http://community.versant.com/documentation/reference/db4o-8.0/java/reference/のdb4oドキュメントで提案されているようにオブジェクトを更新します。コンテンツ/advanced_topics/callbacks/possible_usecases/committed_event_example.htm

    client = Db4oClientServer.openClient (context.getBean ("db4oClientConfiguration", ClientConfiguration.class),
        arg0.getServletContext ().getInitParameter ("databasehost"),
        Integer.parseInt (arg0.getServletContext ().getInitParameter ("databaseport")),
        arg0.getServletContext ().getInitParameter ("databaseuser"),
        arg0.getServletContext ().getInitParameter ("databasepassword"));

    System.out.println ("DB4O connection established");

    EventRegistry events = EventRegistryFactory.forObjectContainer (client);
    events.committed ().addListener (new EventListener4<CommitEventArgs> () {
        public void onEvent (Event4<CommitEventArgs> commitEvent, CommitEventArgs commitEventArgs)
        {
            for (Iterator4<?> it = commitEventArgs.updated ().iterator (); it.moveNext ();)
            {
                LazyObjectReference reference = (LazyObjectReference) it.current ();
                System.out.println ("Updated object: " + reference.getClass () + ":" + reference.getInternalID ());
                //if (trackedClasses.contains (reference.getClass ()))
                {
                    Object obj = reference.getObject ();
                    commitEventArgs.objectContainer ().ext ().refresh (obj, 1);
                    System.out.println ("  => updated (" + obj + ")");
                }
            }
        }
    });

次に、インプロセスクライアントで、次のコードが実行されます。

    try {
        PlayerCharacter pc = new PlayerCharacter (player, name);
        pc.setBio(bio);
        pc.setArchetype(archetype);
        player.getCharacters ().add (pc);
        database.store (pc);
        database.store (player.getCharacters ());
        database.store (player);
        database.commit ();
        con.sendEvent (id, "CHARACTER_CREATED".getBytes (Constants.CHARSET));
    }
    catch (Exception e) 
    {
        con.sendEvent (id, EventNames.ERROR, e.toString ());
    }

'CHARACTER_CREATED'イベントは正常に送信されるため、commitが例外をスローしていないことはわかっていますが、他のクライアントには何も表示されません。古いバージョンのオブジェクトを引き続き使用し、期待している「更新されたオブジェクト」メッセージがサーバーコンソールに表示されません。

私が間違っていることについて何か考えはありますか?

4

1 に答える 1

1

明らかに、コミットが他のTCPクライアントからのものである場合、.committed()イベントはクライアントでのみ発生します。

したがって、イベントを表示するには、内部の.openClient()/ .openSession()クライアントを本格的なTCPクライアントに切り替える必要があります。

.openClient()/ .openSession()オブジェクトコンテナははるかに軽量であり、ネットワーク通信に関連するすべてのコードをバイパスします。どうやら、ネットワーク全体のイベント配信も。

于 2012-07-14T09:41:47.157 に答える