【发布时间】:2016-02-19 18:19:20
【问题描述】:
我了解 RAP 如何为每个客户端创建具有特定线程的范围,等等。我也了解应用程序范围在多个客户端中是如何独一无二的,但是我不知道如何以单线程方式访问该特定范围。
我希望有一个服务器端(可以访问数据库和资料),它是一次执行,以确保它对所有事务具有全局知识,并且来自客户端的请求按顺序执行而不是并行执行。
目前我正在从 UI 访问应用程序上下文,如下所示:
synchronized( MyServer.class ) {
ApplicationContext appContext = RWT.getApplicationContext();
MyServer myServer = (MyServer) appContext.getAttribute("myServer");
if (myServer == null){
myServer = new MyServer();
appContext.setAttribute("myServer", myServer);
}
myServer.doSomething(RWTUtils.getSessionID());
}
即使我在那里访问 myServer 对象并触发请求,执行仍将在 UI 线程中运行。
目前确保序列的唯一方法是在我的服务器上使用 synchronized,如下所示
public class MyServer {
String text = "";
public void doSomething(String string) {
try {
synchronized (this) {
System.out.println("doSomething - start :" + string);
text += "[" + string + "]";
System.out.println("text: " + (text));
Thread.sleep(10000);
System.out.println("text: " + (text));
System.out.println("doSomething - stop :" + string);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
有没有更好的方法不必自己管理线程同步?
欢迎任何帮助
编辑: 为了更好地解释我自己,这就是我的意思。要么我相信数据库能够正确处理多个请求,并且我还必须以同步方式处理一些其他知识以在客户端之间共享信息(示例 A),或者我找到另一个线程同时处理两者(示例 B)的解决方案,知识和数据库。当然,这里的问题是一个客户端可能会阻塞其他客户端,但这可以通过后台线程进行长时间操作,大多数都没有问题。我最初的问题是,是否可能已经有一些特定的应用程序范围的线程可以执行示例 B 或者示例 A 实际上是要走的路?
结论(到目前为止)
基本上,选项 A) 是要走的路。对于数据库访问,它需要连接池,对于共享信息,它需要对关键对象进行周到的同步。主要注意数据库设计和对象同步,以确保两个客户端不能同时写入不兼容的数据(例如,写入相互矛盾的条目,使结果依赖于写入顺序)。
【问题讨论】:
标签: thread-synchronization eclipse-rap