【问题标题】:Eclipse RAP Multi-client but single server threadEclipse RAP 多客户端但单服务器线程
【发布时间】: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


    【解决方案1】:

    首先,在第一个 sn-p 中创建MyServer 的方式不是线程安全的。您可能会创建多个 MyServer 实例。

    你需要同步MyServer的创建,比如这样:

    synchronized( MyServer.class ) {
      MyServer myServer = (MyServer) appContext.getAttribute("myServer");
      if (myServer == null){
        myServer = new MyServer();
        appContext.setAttribute("myServer", myServer);
      }
    }
    

    有关其他可能的解决方案,另请参阅此帖子 How to implement thread-safe lazy initialization?

    此外,您的代码正在客户端线程(即 UI 线程)上调用 doSomething(),这将导致每个客户端等待其他客户端的待处理请求得到处理。客户端 UI 将变得无响应。

    要解决此问题,您的代码应从后台线程调用doSomething()(或任何其他长时间运行的操作)(另请参阅 Threads in RAP)

    当后台线程完成后,您应该使用Server Push 来更新 UI。

    【讨论】:

    • 感谢您的回复。是的,你是对的,我对 myserver 的调用是不安全的,我只是写这个来测试一个概念,这不是一种正常的方法:) 无论如何,我看到了很多关于如何从背景,但我不知道如何从 UI 执行后台操作。
    • 见服务器推送一章的示例代码,都在里面
    • 啊,是的,好吧,我监督了“线程 bgThread = new Thread(bgRunnable);”线。所以,基本上为了获得我的单线程服务器,我只需要在客户端之间共享这个特定的线程,你认为正确吗?感谢您的帮助!
    • PS:或者更容易使 MyServer Runnable 并且我在服务器启动时启动 bgThread。
    • 服务器不需要线程。每个调用服务器的客户端都应该在一个额外的线程中这样做,以保持 UI 响应。您的示例甚至可以在没有线程的情况下工作。但是,它将阻止每个客户端的 UI,直到对 server.doSomething() 的调用返回。
    猜你喜欢
    • 2014-12-21
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2019-05-17
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多