|
|
|
Java global events
|
|||
|---|---|---|---|
|
#18+
Доброго всем дня, Кратко расскажу про ситуацию. Мы используем в проекте стандартные JavaEE Events и Observers (CDI) - схема как обычно, кто-то бросает event, и методы observers ловят этот event - управляется контейнером. Но дело в том, что эти event'ы не глобальные. Т.е. все функционирует только в рамках конкретной http сессии. Например у нас есть event ConfigurationChangedEvent. Подразумевается, что он выбрасывается при изменении конфигурации пользователем администратором. И подразумевалось, что этот event будет пойман всеми авторизованными пользователями (сессиями) и каждая сессия перезагрузит у себя конфигурацию. Но в итоге работает не так, в результате только одна сессия будет оповещена - та, которая этот event и бросила. Мне понятно почему так происходит, и даже понятно, как обойти. Но вопрос у меня таков - посоветует ли кто-нибудь что-нибудь реализованное в этой области? Может в Spring? Нужно именно чтобы можно было оповещать всех пользователей из одного места. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 13:57:39 |
|
||
|
Java global events
|
|||
|---|---|---|---|
|
#18+
ApplicationScoped/SessionScoped ? Возможно событие создаётся в неком SessionScoped бине? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:06:27 |
|
||
|
Java global events
|
|||
|---|---|---|---|
|
#18+
BlazkowiczApplicationScoped/SessionScoped ? Возможно событие создаётся в неком SessionScoped бине? Не важно, в каком бине создается событие и в каком ловится. Это может быть ApplicationScoped, SessionScoped, хоть RequestScoped. Поймано оно будет всеми зарегистрированными слушателями но только в этой же сессии. А хотелось бы оповещать все сессии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:14:14 |
|
||
|
Java global events
|
|||
|---|---|---|---|
|
#18+
Всё. Понял. Там ведь не может быть никакого глобального события, так как эти события всех обрабатываются синхронно, то есть в потоке текущего Request. Даже не Session scope выходит. http://blog.akquinet.de/2012/02/28/extending-cdi-observer-pattern-to-support-global-events/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:22:31 |
|
||
|
Java global events
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Да, все верно) Я уже читал эту статью, но что-то мне не очень по душе такой кустарный подход. И еще, я тут подумал, если у меня будет 5000 открытых сессий, это получается надо каждую информировать - не слишком ли большая нагрузка? Сдается мне что не зря CDI не поддерживают глобальные event'ы... Хотелось бы какое-нибудь готовое решение. В Spring есть что-нибудь подходящее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:27:31 |
|
||
|
Java global events
|
|||
|---|---|---|---|
|
#18+
Зачем вам Spring если у вас всё завязано на CDI? Можно через JMS сделать. Но в любом случае, если нужно обновлять именно HttpSession, то их нужно руками регистрировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:30:24 |
|
||
|
Java global events
|
|||
|---|---|---|---|
|
#18+
rabiterДа, все верно) Я уже читал эту статью, но что-то мне не очень по душе такой кустарный подход. И еще, я тут подумал, если у меня будет 5000 открытых сессий, это получается надо каждую информировать - не слишком ли большая нагрузка? Не понятно что вкладывается в понятие "информировать сессию". Обновить какой-то атрибут в 5К HttpSession по-моему фигня, если единоразово. А вот послать при этом что-то всем клинтам, уже отдельная песня. rabiterСдается мне что не зря CDI не поддерживают глобальные event'ы... Потому что CDI события синхронны. Вот тут ещё описаны альтернативные решения http://piotrnowicki.com/2013/05/asynchronous-cdi-events/ rabiterХотелось бы какое-нибудь готовое решение. В Spring есть что-нибудь подходящее? Сложно сказать, не понимая что именно требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:33:24 |
|
||
|
Java global events
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Через JMS слишком большой геморрой. Наверное придется самому сделать что-нибудь вроде того, как предложено в статье. Спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:34:04 |
|
||
|
Java global events
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНе понятно что вкладывается в понятие "информировать сессию". Обновить какой-то атрибут в 5К HttpSession по-моему фигня, если единоразово. Я имел ввиду информировать сессию сугубо на сервере. Например: одна сессия бросает event, который ловят 4 слушателя. Т.е. в каждой сессии 4 слушателя должны будут получить этот event. Я просто немного задумался о масштабе действий по одному чиху: в случае 5К сессий получается что 4*5000 слушателей будут информированы. Хотя, если события будут бросаться не часто, то все будет ок. Спасибо за ссылку на "Asynchronous CDI Events" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:46:23 |
|
||
|
Java global events
|
|||
|---|---|---|---|
|
#18+
rabiterЯ имел ввиду информировать сессию сугубо на сервере. Нельзя "информировать сессию". Сессия на сервере это некоторое состояние связанное с id сессии. Это состояние можно изменить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:47:36 |
|
||
|
Java global events
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrabiterЯ имел ввиду информировать сессию сугубо на сервере. Нельзя "информировать сессию". Сессия на сервере это некоторое состояние связанное с id сессии. Это состояние можно изменить. Ок, согласен, я несколько неточно выразился. Но я думал что смысл будет ясен. Собственно, моя проблема в точности описана в ссылке, что вы прислали http://blog.akquinet.de/2012/02/28/extending-cdi-observer-pattern-to-support-global-events/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2013, 14:56:23 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=194&tid=2127970]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 382ms |

| 0 / 0 |
