|
|
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
Доброго дня! Вот же а... Хочу в асинхронном методе Stateless бина проверять, был ли прерван поток. Для этого как и написано в спеке, использую sessionContext.wasCancelCalled(). Работает в асинхронном методе нормально. Но стоит мне в асинхронный метод заинжектить другой бин и попробовать в этом бине проверить wasCancelCalled, как он бросает исключение: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Т.е. я хочу чтобы у меня контейнер создал отдельный поток для выполнения, в этот поток я могу заинжектить обычный stateless бин, он так же будет выполняться в этом новом созданном потоке (ну логично, да?). Но я не смогу проверить, был ли прерван поток. А вся нагрузка, основной цикл вычислений, у меня как раз находится в этом бине, который я инжектю в асинхронный метод. Вот же подстава. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 14:55:12 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
Почему бы явно значение не передавать, если оно вам необходимо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:10:47 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
BlazkowiczПочему бы явно значение не передавать, если оно вам необходимо? Прошу прощения, какое значение? Я не понял. Проблема в том, что я хочу в асинхронный метод заинжектить другой бин и вызвать метод на этом бине. Метод вызовется, но проверить в нем sessionContext.wasCancelCalled() не получится, а мне очень хочется это сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:18:11 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
rabiter, public void doSomeActivitiesInAnotherService(boolean canceled) { ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:22:03 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
Blazkowiczrabiter, public void doSomeActivitiesInAnotherService(boolean canceled) { Так нет же. SessionContext.wasCancelCalled() это метод с помощью которого можно проверить была ли прервана таска или нет. Прерывается таска вызовом Future.cancel(true). Метод doSomeActivitiesInAnotherService может выполнятся минут 30, и на 15-й минуте быть прерванным. И предполагается что я там периодически буду опрашивать wasCancelCalled чтобы выявить факт отмены задания. Это что-то вроде Thread.interrupted(). Смысл такой: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Но проблема в том, что я не могу вызвать sessionContext.wasCancelCalled в этом методе. Потому что я этот метод вызвал через прокси AnotherService. И видимо контейнер считает что я изменил контекст выполнения или что-то в этом роде. При попытке ругается java.lang.IllegalStateException: Must be invoked from an async method. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:34:50 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
Я не могу понять откуда есть такая уверенность что у двух разных stateless бинов SessionContext как-то вообще связан? Так как это всё локально, ну передайте ссылку на локальный интефейс параметром: public void doSomeActivitiesInAnotherService(TheService initiator) и сделайте метод для обращения к его SessionContext-у. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 15:42:39 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЯ не могу понять откуда есть такая уверенность что у двух разных stateless бинов SessionContext как-то вообще связан? Так как это всё локально, ну передайте ссылку на локальный интефейс параметром: public void doSomeActivitiesInAnotherService(TheService initiator) и сделайте метод для обращения к его SessionContext-у. Точно, вы абсолютно правы. Такая уверенность ошибочна, SessionContext у разных бинов, конечно же разный. Но и вариант что вы предложили тоже не работает. Если я передаю ссылку на TheService initianor, потом получаю его sessionContext, то это уже не sessionContext бина TheService, это будет уже SessionContext бина AnotherService. При вызове на нем wasCancelCalled валится все то же исключение. Я так это понимаю: sessionContext - прокси, и контейнер во время выполнения определяет к какому именно sessionContext обращаться. Таким финтом с передачей sessionContext или TheService initial входным параметром его не проймешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:07:27 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТак как это всё локально, ну передайте ссылку на локальный интефейс параметром: public void doSomeActivitiesInAnotherService(TheService initiator) Вы ведь имеете ввиду передавать ссылку как this? Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:09:54 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
Что мешает просто создать именованный поток, потом при необходимости найти его по имени и проверить состояние? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:11:35 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
ivanraЧто мешает просто создать именованный поток, потом при необходимости найти его по имени и проверить состояние? Просто Thread через new? Ну я же должен работать согласно спеке. Надо чтобы все потоки создавал EJB контейнер, так как у него есть для них пул и все такое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:14:56 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
rabiterНо и вариант что вы предложили тоже не работает. Если я передаю ссылку на TheService initianor, потом получаю его sessionContext, то это уже не sessionContext бина TheService, это будет уже SessionContext бина AnotherService. При вызове на нем wasCancelCalled валится все то же исключение. Я так это понимаю: sessionContext - прокси, и контейнер во время выполнения определяет к какому именно sessionContext обращаться. Таким финтом с передачей sessionContext или TheService initial входным параметром его не проймешь. Это какая-то не правдоподобная фигня. Даже если sessionContext это прокси, то вызов всё равно находится в том же потоке что и sessionContext.wasCancelCalled(); // ok Это должна быть какая-то совершенно не вероятная магия, чтобы sessionContext внутри TheService поменялся на другой, в том же потоке. Покажите код, что получилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:18:40 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrabiterНо и вариант что вы предложили тоже не работает. Если я передаю ссылку на TheService initianor, потом получаю его sessionContext, то это уже не sessionContext бина TheService, это будет уже SessionContext бина AnotherService. При вызове на нем wasCancelCalled валится все то же исключение. Я так это понимаю: sessionContext - прокси, и контейнер во время выполнения определяет к какому именно sessionContext обращаться. Таким финтом с передачей sessionContext или TheService initial входным параметром его не проймешь. Это какая-то не правдоподобная фигня. Даже если sessionContext это прокси, то вызов всё равно находится в том же потоке что и sessionContext.wasCancelCalled(); // ok Это должна быть какая-то совершенно не вероятная магия, чтобы sessionContext внутри TheService поменялся на другой, в том же потоке. Покажите код, что получилось. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:23:45 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
А вызов anotherService.doSomeActivitiesInAnotherService(); точно через локальный интерфейс идёт? или через remote? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:30:43 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
Это какая-то не правдоподобная фигня. Даже если sessionContext это прокси, то вызов всё равно находится в том же потоке что и sessionContext.wasCancelCalled(); // ok Это должна быть какая-то совершенно не вероятная магия, чтобы sessionContext внутри TheService поменялся на другой, в том же потоке. Поток хоть и тот же, но контекст-то уже другой, контекст-то уже принадлежит AnotherBean. И, похоже что когда я вызываю метод wasCancelCalled на бине TheService (который я передал как this), контекст все равно принадлежит AnotherBean. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:32:09 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
BlazkowiczА вызов anotherService.doSomeActivitiesInAnotherService(); точно через локальный интерфейс идёт? или через remote? Точно через локальный. Т.е. я использую EJB 3.1 и вообще не указываю интерфейс. В этом случае если я не ошибаюсь, он считается локальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:35:10 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
rabiterПоток хоть и тот же, но контекст-то уже другой, контекст-то уже принадлежит AnotherBean. И, похоже что когда я вызываю метод wasCancelCalled на бине TheService (который я передал как this), контекст все равно принадлежит AnotherBean. А что за сервер? В исходники хочется посмотреть. Это какая мистика, как в том же потоке, контейнер вообще может узнать что рантайм уже в другом бине? callerClass что ли проверяет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:35:27 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrabiterПоток хоть и тот же, но контекст-то уже другой, контекст-то уже принадлежит AnotherBean. И, похоже что когда я вызываю метод wasCancelCalled на бине TheService (который я передал как this), контекст все равно принадлежит AnotherBean. А что за сервер? В исходники хочется посмотреть. Ну вот, сейчас мы сойдемся на том что гласфиш шляпа и на этом опять все обсуждения закончатся)) BlazkowiczЭто какая мистика, как в том же потоке, контейнер вообще может узнать что рантайм уже в другом бине? callerClass что ли проверяет? Все выполняется в одном потоке. Контекста два. Один TheService, второй AnotherBean. Изначально мы находимся в методе TheService#doAsync - первый контекст. Потом мы через прокси AnotherBean вызываем метод AnotherBean#doSomeActivitiesInAnotherService - тут контейнер переключает нас на второй контекст. И наконец, мы через прокси (я же передал this, а по сути это ссылка на прокси TheService) переходим в метод TheService#wasCancelCalled() - тут контейнер почему-то не переключает нас обратно на первый контекст а оставляет во втором... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:44:31 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
rabiterНу вот, сейчас мы сойдемся на том что гласфиш шляпа и на этом опять все обсуждения закончатся)) А я уже посмотрел. Но на поверхности ответа не увидел. Глубже копать пока некогда. rabiterВсе выполняется в одном потоке. Контекста два. Один TheService, второй AnotherBean. Изначально мы находимся в методе TheService#doAsync - первый контекст. Потом мы через прокси AnotherBean вызываем метод AnotherBean#doSomeActivitiesInAnotherService - тут контейнер переключает нас на второй контекст. И наконец, мы через прокси (я же передал this, а по сути это ссылка на прокси TheService) переходим в метод TheService#wasCancelCalled() - тут контейнер почему-то не переключает нас обратно на первый контекст а оставляет во втором... Люблю EJB, всё таким очевидным образом работает. :) А если не в лоб, а по лбу? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:49:45 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrabiterНу вот, сейчас мы сойдемся на том что гласфиш шляпа и на этом опять все обсуждения закончатся)) А я уже посмотрел. Но на поверхности ответа не увидел. Глубже копать пока некогда. rabiterВсе выполняется в одном потоке. Контекста два. Один TheService, второй AnotherBean. Изначально мы находимся в методе TheService#doAsync - первый контекст. Потом мы через прокси AnotherBean вызываем метод AnotherBean#doSomeActivitiesInAnotherService - тут контейнер переключает нас на второй контекст. И наконец, мы через прокси (я же передал this, а по сути это ссылка на прокси TheService) переходим в метод TheService#wasCancelCalled() - тут контейнер почему-то не переключает нас обратно на первый контекст а оставляет во втором... Люблю EJB, всё таким очевидным образом работает. :) А если не в лоб, а по лбу? Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Эх, думал уже об этом. Сразу скажу, что вылетает то же самое исключение. Но это вроде и понятно. Мы разве не создадим третий контекст выполнения когда заинжектим TheService initiator и вызываем на нем wasCancelCalled() ? Как бы суметь вернуться именно к первому контексту. Вообщем я буду дальше смотреть, если найду решение, напишу тут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:58:16 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
rabiterКак бы суметь вернуться именно к первому контексту. Вообщем я буду дальше смотреть, если найду решение, напишу тут. Я бы исходники GlassFish подебажил и посмотрел как он находит Future в InvocationContext. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 16:59:38 |
|
||
|
Асинхронные методы в EJB и проверка прерывания потока
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrabiterКак бы суметь вернуться именно к первому контексту. Вообщем я буду дальше смотреть, если найду решение, напишу тут. Я бы исходники GlassFish подебажил и посмотрел как он находит Future в InvocationContext. Спасибо за совет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2013, 17:06:22 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38138272&tid=2130045]: |
0ms |
get settings: |
19ms |
get forum list: |
28ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
67ms |
get topic data: |
20ms |
get forum data: |
4ms |
get page messages: |
92ms |
get tp. blocked users: |
3ms |
| others: | 319ms |
| total: | 566ms |

| 0 / 0 |
