|
|
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
Привет, Вопрос простой и глупый, но не хочется городить свои велосипеды. Задача: есть специальный файл в котором записанны данные по строчкам и для каждой строчки я должен выполнить определённые действия. В данной случае одно из действий это отправка запросов на сервер (HLR) через web-service (request) и потом, через некоторое время, HLR вызывает мой notification web-service, в который передает данный об успешности/не успешности request. То есть если схематично: line1 -> thread1 -> request1 -> ждем ответа HLR -> response1 -> продолжаем работу дальше line2 -> thread2 -> request2 -> ждем ответа HLR -> response2 -> продолжаем работу дальше line3 -> thread3 -> request3 -> ждем ответа HLR -> response3 -> продолжаем работу дальше line4 -> thread4 -> request4 -> ждем ответа HLR -> response4 -> продолжаем работу дальше Дальше у меня есть веб-сервис, в который будут приходить responses от HLR и мне нужно уведомлять потоки, которые ждут ответы от HLR о результате. С ходу напрашивается решение: каждый поток, который отправляет request к HLR, добавляет себя в очередь ожидания, после добавления в очередь ожидания, становится в ожидание и ждет ответа от сервера. Думаю, что такое решение можно сделать с помощью списока мониторов и использования методов wait (какое-то время, что бы бесконечно не ждать сервер)/notify. Может знает кто-то стандартные API для этого или как вообще люди делают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:04:35 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
wait/notify тут не место - слишком низкоуровневые концепции. Далете пул потоков, сабмитите в них таски и все. Если надо как-то хитро ждать ответа от HLR (кстати, что это?), то смотрите в сторону высокоуровневых вещей из java.util.concurrent - Barrier, Latch, Semaphore. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:08:23 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
svenomто смотрите в сторону высокоуровневых вещей +1. Или даже JMS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:13:46 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
svenom, Дело в том, что потоки уже созданы, то есть я посылаю request к HLR уже в существующем потоке, который должен остановиться и ждать, пока на его запрос не прийдет ответ от сервера. На сколько я знаю эти классы Barrier, Latch, Semaphore, они работаю следующим образом: у нас есть N операций и мы ставим "стену" и "стена" будет сдерживать потоки, пока они все не отработают. В моем же случае, как только notification web-service получил ответ от HLR он должен уведомить ждущий поток о результате и поток должен продолжить работу. HLR содержит данные о SIM-картах оператора мобильной связи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:14:20 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
_chaos_через некоторое время, HLR вызывает мой notification web-service, в который передает данный об успешности/не успешности request В response? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:16:02 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczsvenomто смотрите в сторону высокоуровневых вещей +1. Или даже JMS Слишком мальнькая проблема, что бы для нее городить JMS, нужно что-то попроще... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:16:09 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
_chaos_С ходу напрашивается решение: каждый поток, который отправляет request к HLR, добавляет себя в очередь ожидания, после добавления в очередь ожидания, становится в ожидание и ждет ответа от сервера. Ну, вообще клиенты по-умолчанию использую блокирующий IO и каждый поток засыпает, пока не придет ответ. Никаких дополнительных телодвижений для этого не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:17:26 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz_chaos_через некоторое время, HLR вызывает мой notification web-service, в который передает данный об успешности/не успешности request В response? Именно, там есть id моего request и по нему я могу определить какому потоку отдать результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:17:31 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
_chaos_На сколько я знаю эти классы Barrier, Latch, Semaphore, они работаю следующим образом: у нас есть N операций и мы ставим "стену" и "стена" будет сдерживать потоки, пока они все не отработаютЭто неверно. Вы описали работу Barrier, Latch и Semaphore это совершенно другие вещи. _chaos_В моем же случае, как только notification web-service получил ответ от HLR он должен уведомить ждущий поток о результате и поток должен продолжить работу.Ну ок, тогда начните с того, что определитесь, как вы будете идентифицировать тот поток, который надо "разбудить". Ну то есть вот у меня стоит в ожидании 10 потоков, вот пришел ответ от HLR. Как вы определяете, какой поток разбудить? Тут отлично впишется класс CountdownLatch. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:18:17 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz_chaos_С ходу напрашивается решение: каждый поток, который отправляет request к HLR, добавляет себя в очередь ожидания, после добавления в очередь ожидания, становится в ожидание и ждет ответа от сервера. Ну, вообще клиенты по-умолчанию использую блокирующий IO и каждый поток засыпает, пока не придет ответ. Никаких дополнительных телодвижений для этого не нужно. В том то и дело, что web-service работает как отправил и забудь (асинхронно). А результат прийдет в notification web-service. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:19:10 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
_chaos_Именно, там есть id моего request и по нему я могу определить какому потоку отдать результат.Ну отлично, тогда делаете так. 1. Создаете Runnable, которому передаете некий ваш идентификатор и новый инстанс CountdownLatch: Код: java 1. 2. 2. Далее кладете идентификатор и latch в мапу: latchMap.put(id, latch); 3. В теле вашего Runnable: Код: java 1. 2. 3. 4. 5. 4. При получении ответа от HLR: Код: java 1. 2. 3. Все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:22:54 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
svenom_chaos_На сколько я знаю эти классы Barrier, Latch, Semaphore, они работаю следующим образом: у нас есть N операций и мы ставим "стену" и "стена" будет сдерживать потоки, пока они все не отработаютЭто неверно. Вы описали работу Barrier, Latch и Semaphore это совершенно другие вещи. Насколько я знаю, Barrier и Latch не особо отличаются по семантики, разница лишь в нескольких фичесах, например, в Barrier можно установить barrierAction, который будет вызван когда все потоки будут завершены, а также, например, можно сделать reset count-а. Про Semaphore ничего не могу сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:27:11 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
авторBarrier и Latch не особо отличаются по семантики, разница лишь в нескольких фичесах, например, в Barrier можно установить barrierAction, который будет вызван когда все потоки будут завершены,Неверно, задачи принципиально разные. Цель барьера - обеспечить одновременный старт нескольких потоков, когда каждый из них придет достигнет определенной точки своего выполнения. Цель латча - обеспечить старт потока(потоков), после того, как другие потоки совершили некие действия. Сементика абсолютно разная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:29:51 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
svenom_chaos_Именно, там есть id моего request и по нему я могу определить какому потоку отдать результат.Ну отлично, тогда делаете так. 1. Создаете Runnable, которому передаете некий ваш идентификатор и новый инстанс CountdownLatch: Код: java 1. 2. 2. Далее кладете идентификатор и latch в мапу: latchMap.put(id, latch); 3. В теле вашего Runnable: Код: java 1. 2. 3. 4. 5. 4. При получении ответа от HLR: Код: java 1. 2. 3. Все. Я не хочу лезть в создание котока, потому что во-первых: он создается в ядре "системы" и не очень то и хотелось навешивать на него ещё какие-то долнительные обьекты, во-вторых: я не знаю о id в то время когда создаю поток. Я вот не пойму, почему если сделать что-то похожее, но организовать всё через обычный монитор, то есть создать object и использовать его notify/wait. Чем это хуже чем дополнительный обьект CountDownLatch? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:33:01 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
_chaos_ Я не хочу лезть в создание котока, потому что во-первых: он создается в ядре "системы" и не очень то и хотелось навешивать на него ещё какие-то долнительные обьекты, во-вторых: я не знаю о id в то время когда создаю поток.Так как вы все-таки собираетесь сопоставлять реквесты и респонсы? Ну хотите - создайте внутри потока латч и положите его в какую-нибудь расшаренную мапу. _chaos_ Я вот не пойму, почему если сделать что-то похожее, но организовать всё через обычный монитор, то есть создать object и использовать его notify/wait. Чем это хуже чем дополнительный обьект CountDownLatch? Ок, тогда вот вам вопрос - чего будет ждать поток? Как обычно wait() используется? Вот так: while (condition) { monitor.wait(); } Что у вас будет монитором? Что у вас будет condition? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:36:13 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
svenomавторBarrier и Latch не особо отличаются по семантики, разница лишь в нескольких фичесах, например, в Barrier можно установить barrierAction, который будет вызван когда все потоки будут завершены,Неверно, задачи принципиально разные. Цель барьера - обеспечить одновременный старт нескольких потоков, когда каждый из них придет достигнет определенной точки своего выполнения. Цель латча - обеспечить старт потока(потоков), после того, как другие потоки совершили некие действия. Сементика абсолютно разная. Да точно-точно правы, немного подзабыл :). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:36:24 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:38:17 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
svenom_chaos_ Я не хочу лезть в создание котока, потому что во-первых: он создается в ядре "системы" и не очень то и хотелось навешивать на него ещё какие-то долнительные обьекты, во-вторых: я не знаю о id в то время когда создаю поток.Так как вы все-таки собираетесь сопоставлять реквесты и респонсы? Ну хотите - создайте внутри потока латч и положите его в какую-нибудь расшаренную мапу. Можно и так. _chaos_ Я вот не пойму, почему если сделать что-то похожее, но организовать всё через обычный монитор, то есть создать object и использовать его notify/wait. Чем это хуже чем дополнительный обьект CountDownLatch? Ок, тогда вот вам вопрос - чего будет ждать поток? Как обычно wait() используется? Вот так: while (condition) { monitor.wait(); } Что у вас будет монитором? Что у вас будет condition?[/quot] [/quot] Ну... Допустим, у нас есть, скажем, HLRHander, который отправляет запрос к HLR и должен ждать. Дальше у нас есть, скажем, HLRNotificationPool, в который HLRHandler ложит себя и id request-а, скажем, так HLRNotificationPool.wait(this, id). HLRNotificationPool.wait(this, id) { obj = создаем обьект obj.wait() - на данный момент мы все ещё находимся в потоке HLRHandler ложим obj и HLRHandler в map } Сюда приходят ответы от HLR: HLRNotificationPool.responseHandler(id) { ищем по id наш obj и делаем obj.notify } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:48:10 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
_chaos_Ну... Допустим, у нас есть, скажем, HLRHander, который отправляет запрос к HLR и должен ждать. Дальше у нас есть, скажем, HLRNotificationPool, в который HLRHandler ложит себя и id request-а, скажем, так HLRNotificationPool.wait(this, id). HLRNotificationPool.wait(this, id) { obj = создаем обьект obj.wait() - на данный момент мы все ещё находимся в потоке HLRHandler ложим obj и HLRHandler в map } Сюда приходят ответы от HLR: HLRNotificationPool.responseHandler(id) { ищем по id наш obj и делаем obj.notify } Ну вы сделали ровно то же, что предложил и я. Только вместо CountDownLatch у вас wait/notify. В вашем случае никакой принципиальной разницы, что использовать нет, так как CountDownLatch(1) по своей сути как раз вырождается в wait/notify. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:54:36 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
svenom_chaos_Ну... Допустим, у нас есть, скажем, HLRHander, который отправляет запрос к HLR и должен ждать. Дальше у нас есть, скажем, HLRNotificationPool, в который HLRHandler ложит себя и id request-а, скажем, так HLRNotificationPool.wait(this, id). HLRNotificationPool.wait(this, id) { obj = создаем обьект obj.wait() - на данный момент мы все ещё находимся в потоке HLRHandler ложим obj и HLRHandler в map } Сюда приходят ответы от HLR: HLRNotificationPool.responseHandler(id) { ищем по id наш obj и делаем obj.notify } Ну вы сделали ровно то же, что предложил и я. Только вместо CountDownLatch у вас wait/notify. В вашем случае никакой принципиальной разницы, что использовать нет, так как CountDownLatch(1) по своей сути как раз вырождается в wait/notify. Да, Вы правы. Думаю так и сделаю, только вот ещё посмотрю с Exchanger, может подойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:55:56 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
_chaos_Думаю так и сделаю, только вот ещё посмотрю с Exchanger, может подойдет. Логика та же самая, только проще значние передавать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 18:57:18 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
каков смысл в связи какого-то конкретного потока (worker) с состоянием обработки какого-то конкретного запроса (state)? я бы сделал мультиплексор, раз уж сплошная асинхронщина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 19:01:34 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
drsmя бы сделал мультиплексор, раз уж сплошная асинхронщина. Ну, хочется человеку stackatrace внятный поиметь, наверное. Других объяснений нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 19:02:48 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
_chaos_, По моему данная задача лучше решается с помощью классического wait/notify Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 19:07:57 |
|
||
|
Какие API классы или pattern-ы лучше использовать?
|
|||
|---|---|---|---|
|
#18+
drsmкаков смысл в связи какого-то конкретного потока (worker) с состоянием обработки какого-то конкретного запроса (state)? я бы сделал мультиплексор, раз уж сплошная асинхронщина. Смысл есть, по результатам работы каждого потока в БД ложатся данные, пока я не получу ответ от HLR я не могу положить эти данные, потому что результат работы это не только отправка запроса в HLR, а ещё кучу других задач. Частично положить или заниматься post-обработкой я тоже не могу, точнее могу, но на данный момент уже есть кое-какая архитектура и процесс как должно быть, а переделывать сильно, под одну не типичную, для этой задачи, ситуацию - нет желания и возможностей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2012, 19:08:30 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37633727&tid=2132685]: |
0ms |
get settings: |
17ms |
get forum list: |
21ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
54ms |
get topic data: |
18ms |
get forum data: |
4ms |
get page messages: |
87ms |
get tp. blocked users: |
2ms |
| others: | 363ms |
| total: | 576ms |

| 0 / 0 |
