gpt4 book ai didi

java - Db4o 客户端似乎没有从其他客户端获取提交事件

转载 作者:行者123 更新时间:2023-12-01 15:17:06 25 4
gpt4 key购买 nike

我有一个带有 db4o 服务器的系统,该服务器有两个客户端。一个客户端托管在进程中,另一个是托管许多需要查询数据库的 servlet 的 Web 服务器。

在 Web 服务器的连接代码中,我已经注册了提交事件,并按照 db4o 文档 http://community.versant.com/documentation/reference/db4o-8.0/java/reference/Content/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”事件已成功发送,因此我知道提交不会引发异常,但其他客户端上没有显示任何内容。它继续使用旧版本的对象,并且我期望的“更新对象”消息不会显示在服务器控制台上。

知道我做错了什么吗?

最佳答案

显然,当提交来自其他 TCP 客户端时,.comfilled() 事件仅在客户端上触发。

因此,您需要将内部 .openClient()/.openSession() 客户端转换为成熟的 TCP 客户端才能查看事件。

.openClient()/.openSession() 对象容器更加轻量级,并且绕过与网络通信相关的所有代码。显然还有整个网络的事件分布。

关于java - Db4o 客户端似乎没有从其他客户端获取提交事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com