Синхронизация кода в контексте tomcat'а
От: teapot2  
Дата: 11.05.21 08:21
Оценка:
Друзья, подскажите такую вещь.

Есть сервер tomcat, есть хитрозаточенный сервер приложений на нем, все это legacy code. [Псевдо]параллельное исполнение кода в нем реализовано через установку атрибутов и листенеры. Есть некий метод, который выполняет подготовительную работу (загружает в БД данные из внешнего источника) и потом выставляет разные атрибуты, в результате чего запускаются разные обработчики этих данных. Как я понимаю, порядок вызова обработчиков в этом случае не гарантирован и мы можем считать, что они выполняются параллельно в разных потоках. Но теперь потребовалось внести в этот беспорядок немного синхронности. Необходимо сделать так, чтобы этот самый "головной метод" (который вызывает обработчики посредством установки атрибутов) ждал завершения отработки некоторого из вызываемых им обработчиков, затем вносил определенные изменения в данные, затем вызывал другой/другие обработчики. Примерно так:

// Код работает в контексте сервлета, активизируемого через HTTP-запрос

// Здесь мы загружаем данные из внешнего источника
...

// Вызываем обработчик-1
servletContext.setAttribute("Processor1", "1");

// А здесь надо ждать, пока листенер атрибута Processor1 не завершит работу
// Разумеется, необходимо предусмотреть таймаут
...

// Далее мы выполняем манипуляции над загруженными данными
... 

// Вызываем обработчик-2
servletContext.setAttribute("Processor2", "1");


Как нынче принято выполнять в Java подобную синхронизацию? Какие объекты Java лучше использовать?
Отредактировано 11.05.2021 8:24 teapot2 . Предыдущая версия .
Re: Синхронизация кода в контексте tomcat'а
От: · Великобритания  
Дата: 11.05.21 08:45
Оценка:
Здравствуйте, teapot2, Вы писали:

T>Как нынче принято выполнять в Java подобную синхронизацию? Какие объекты Java лучше использовать?

Может я не очень понял вопрос, но звучит так, что тебе подойдёт CompletableFuture.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Синхронизация кода в контексте tomcat'а
От: gyraboo  
Дата: 11.05.21 08:49
Оценка:
Здравствуйте, teapot2, Вы писали:

T>Есть сервер tomcat, есть хитрозаточенный сервер приложений на нем, все это legacy code. [Псевдо]параллельное исполнение кода в нем реализовано через установку атрибутов и листенеры. Есть некий метод, который выполняет подготовительную работу (загружает в БД данные из внешнего источника) и потом выставляет разные атрибуты, в результате чего запускаются разные обработчики этих данных. Как я понимаю, порядок вызова обработчиков в этом случае не гарантирован и мы можем считать, что они выполняются параллельно в разных потоках. Но теперь потребовалось внести в этот беспорядок немного синхронности. Необходимо сделать так, чтобы этот самый "головной метод" (который вызывает обработчики посредством установки атрибутов) ждал завершения отработки некоторого из вызываемых им обработчиков, затем вносил определенные изменения в данные, затем вызывал другой/другие обработчики. Примерно так:


T>
T>// Код работает в контексте сервлета, активизируемого через HTTP-запрос

T>// Здесь мы загружаем данные из внешнего источника
T>...

T>// Вызываем обработчик-1
T>servletContext.setAttribute("Processor1", "1");

T>// А здесь надо ждать, пока листенер атрибута Processor1 не завершит работу
T>// Разумеется, необходимо предусмотреть таймаут
T>...

T>// Далее мы выполняем манипуляции над загруженными данными
T>... 

T>// Вызываем обработчик-2
T>servletContext.setAttribute("Processor2", "1");
T>


T>Как нынче принято выполнять в Java подобную синхронизацию? Какие объекты Java лучше использовать?


Мы нечто подобное (т.е. когда операция размазана по нескольким классам и обработчикам) делали через ThreadLocal, он позволяет "собрать" все эти разрозненные классы и обработчики в единое целое для каждого http-запроса, т.к. каждый http-запрос выполняется в отдельном треде, то вся инфа по синхронизации операции может храниться в ThreadLocal.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.