Я понимаю, как RAP создает области, у которых есть конкретный поток для каждого клиента и так далее. Я также понимаю, как область приложения уникальна среди нескольких клиентов, однако я не знаю, как получить доступ к этой конкретной области в однопоточном режиме.
Я хотел бы иметь серверную часть (с доступом к базам данных и прочее), которая представляет собой однократное выполнение, чтобы гарантировать, что она имеет глобальные знания обо всех транзакциях и что запросы от клиентов выполняются последовательно, а не параллельно.
В настоящее время я получаю доступ к контексту приложения следующим образом из пользовательского интерфейса:
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 и инициирую запросы, выполнение все равно будет выполняться в потоке пользовательского интерфейса.
На данный момент единственный способ обеспечить последовательность — использовать 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();
}
}
}
Есть ли лучший способ не управлять синхронизацией потоков самостоятельно?
Любая помощь приветствуется
EDIT: Чтобы лучше объяснить, вот что я имею в виду. Либо я доверяю базе данных правильно обрабатывать множественные запросы, и мне приходится синхронно обрабатывать некоторые другие знания для обмена информацией между клиентами (пример A), либо я нахожу решение, в котором другой поток обрабатывает и то, и другое (пример B), знание и базу данных. Конечно, проблема здесь в том, что один клиент может блокировать другие, но это можно сделать с помощью фоновых потоков для длинных действий, большинство из них не будет проблемой. Мой первоначальный вопрос заключался в том, может быть, уже есть какой-то конкретный поток области применения, который выполняет пример B, или пример A действительно подходит?
Заключение (на данный момент)
По сути, вариант A) — правильный путь. Для доступа к базе данных потребуется пул соединений, а для общей информации — продуманная синхронизация ключевых объектов. Основное внимание должно быть уделено проектированию базы данных и синхронизации объектов, чтобы два клиента не могли одновременно записывать несовместимые данные (например, записывать противоречащие друг другу записи, которые делают результат зависимым от порядка записи).