Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Какие API классы или pattern-ы лучше использовать? / 25 сообщений из 52, страница 1 из 3
26.01.2012, 18:04:35
    #37633582
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
Привет,

Вопрос простой и глупый, но не хочется городить свои велосипеды. Задача: есть специальный файл в котором записанны данные по строчкам и для каждой строчки я должен выполнить определённые действия. В данной случае одно из действий это отправка запросов на сервер (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 для этого или как вообще люди делают?
...
Рейтинг: 0 / 0
26.01.2012, 18:08:23
    #37633594
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
wait/notify тут не место - слишком низкоуровневые концепции. Далете пул потоков, сабмитите в них таски и все. Если надо как-то хитро ждать ответа от HLR (кстати, что это?), то смотрите в сторону высокоуровневых вещей из java.util.concurrent - Barrier, Latch, Semaphore.
...
Рейтинг: 0 / 0
26.01.2012, 18:13:46
    #37633607
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
svenomто смотрите в сторону высокоуровневых вещей
+1. Или даже JMS
...
Рейтинг: 0 / 0
26.01.2012, 18:14:20
    #37633608
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
svenom,

Дело в том, что потоки уже созданы, то есть я посылаю request к HLR уже в существующем потоке, который должен остановиться и ждать, пока на его запрос не прийдет ответ от сервера.

На сколько я знаю эти классы Barrier, Latch, Semaphore, они работаю следующим образом: у нас есть N операций и мы ставим "стену" и "стена" будет сдерживать потоки, пока они все не отработают. В моем же случае, как только notification web-service получил ответ от HLR он должен уведомить ждущий поток о результате и поток должен продолжить работу.

HLR содержит данные о SIM-картах оператора мобильной связи
...
Рейтинг: 0 / 0
26.01.2012, 18:16:02
    #37633619
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
_chaos_через некоторое время, HLR вызывает мой notification web-service, в который передает данный об успешности/не успешности request
В response?
...
Рейтинг: 0 / 0
26.01.2012, 18:16:09
    #37633621
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
Blazkowiczsvenomто смотрите в сторону высокоуровневых вещей
+1. Или даже JMS

Слишком мальнькая проблема, что бы для нее городить JMS, нужно что-то попроще...
...
Рейтинг: 0 / 0
26.01.2012, 18:17:26
    #37633627
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
_chaos_С ходу напрашивается решение: каждый поток, который отправляет request к HLR, добавляет себя в очередь ожидания, после добавления в очередь ожидания, становится в ожидание и ждет ответа от сервера.
Ну, вообще клиенты по-умолчанию использую блокирующий IO и каждый поток засыпает, пока не придет ответ. Никаких дополнительных телодвижений для этого не нужно.
...
Рейтинг: 0 / 0
26.01.2012, 18:17:31
    #37633628
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
Blazkowicz_chaos_через некоторое время, HLR вызывает мой notification web-service, в который передает данный об успешности/не успешности request
В response?

Именно, там есть id моего request и по нему я могу определить какому потоку отдать результат.
...
Рейтинг: 0 / 0
26.01.2012, 18:18:17
    #37633634
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
_chaos_На сколько я знаю эти классы Barrier, Latch, Semaphore, они работаю следующим образом: у нас есть N операций и мы ставим "стену" и "стена" будет сдерживать потоки, пока они все не отработаютЭто неверно. Вы описали работу Barrier, Latch и Semaphore это совершенно другие вещи.

_chaos_В моем же случае, как только notification web-service получил ответ от HLR он должен уведомить ждущий поток о результате и поток должен продолжить работу.Ну ок, тогда начните с того, что определитесь, как вы будете идентифицировать тот поток, который надо "разбудить". Ну то есть вот у меня стоит в ожидании 10 потоков, вот пришел ответ от HLR. Как вы определяете, какой поток разбудить?
Тут отлично впишется класс CountdownLatch.
...
Рейтинг: 0 / 0
26.01.2012, 18:19:10
    #37633641
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
Blazkowicz_chaos_С ходу напрашивается решение: каждый поток, который отправляет request к HLR, добавляет себя в очередь ожидания, после добавления в очередь ожидания, становится в ожидание и ждет ответа от сервера.
Ну, вообще клиенты по-умолчанию использую блокирующий IO и каждый поток засыпает, пока не придет ответ. Никаких дополнительных телодвижений для этого не нужно.

В том то и дело, что web-service работает как отправил и забудь (асинхронно). А результат прийдет в notification web-service.
...
Рейтинг: 0 / 0
26.01.2012, 18:22:54
    #37633654
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
_chaos_Именно, там есть id моего request и по нему я могу определить какому потоку отдать результат.Ну отлично, тогда делаете так.
1. Создаете Runnable, которому передаете некий ваш идентификатор и новый инстанс CountdownLatch:
Код: java
1.
2.
Latch latch = new CountdownLatch(1);
ConcreteRunnable task = new ConcreteRunnable(id, latch);


2. Далее кладете идентификатор и latch в мапу:
latchMap.put(id, latch);
3. В теле вашего Runnable:
Код: java
1.
2.
3.
4.
5.
public void run() {
    doSomething();
    latch.await();
    doSOmethingElse();
}


4. При получении ответа от HLR:
Код: java
1.
2.
3.
id = // как-то получили id
Latch latch = latchMap.get(id);
latch.count();


Все.
...
Рейтинг: 0 / 0
26.01.2012, 18:27:11
    #37633661
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
svenom_chaos_На сколько я знаю эти классы Barrier, Latch, Semaphore, они работаю следующим образом: у нас есть N операций и мы ставим "стену" и "стена" будет сдерживать потоки, пока они все не отработаютЭто неверно. Вы описали работу Barrier, Latch и Semaphore это совершенно другие вещи.


Насколько я знаю, Barrier и Latch не особо отличаются по семантики, разница лишь в нескольких фичесах, например, в Barrier можно установить barrierAction, который будет вызван когда все потоки будут завершены, а также, например, можно сделать reset count-а. Про Semaphore ничего не могу сказать.
...
Рейтинг: 0 / 0
26.01.2012, 18:29:51
    #37633671
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
авторBarrier и Latch не особо отличаются по семантики, разница лишь в нескольких фичесах, например, в Barrier можно установить barrierAction, который будет вызван когда все потоки будут завершены,Неверно, задачи принципиально разные. Цель барьера - обеспечить одновременный старт нескольких потоков, когда каждый из них придет достигнет определенной точки своего выполнения. Цель латча - обеспечить старт потока(потоков), после того, как другие потоки совершили некие действия. Сементика абсолютно разная.
...
Рейтинг: 0 / 0
26.01.2012, 18:33:01
    #37633680
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
svenom_chaos_Именно, там есть id моего request и по нему я могу определить какому потоку отдать результат.Ну отлично, тогда делаете так.
1. Создаете Runnable, которому передаете некий ваш идентификатор и новый инстанс CountdownLatch:
Код: java
1.
2.
Latch latch = new CountdownLatch(1);
ConcreteRunnable task = new ConcreteRunnable(id, latch);


2. Далее кладете идентификатор и latch в мапу:
latchMap.put(id, latch);
3. В теле вашего Runnable:
Код: java
1.
2.
3.
4.
5.
public void run() {
    doSomething();
    latch.await();
    doSOmethingElse();
}


4. При получении ответа от HLR:
Код: java
1.
2.
3.
id = // как-то получили id
Latch latch = latchMap.get(id);
latch.count();


Все.

Я не хочу лезть в создание котока, потому что во-первых: он создается в ядре "системы" и не очень то и хотелось навешивать на него ещё какие-то долнительные обьекты, во-вторых: я не знаю о id в то время когда создаю поток.

Я вот не пойму, почему если сделать что-то похожее, но организовать всё через обычный монитор, то есть создать object и использовать его notify/wait. Чем это хуже чем дополнительный обьект CountDownLatch?
...
Рейтинг: 0 / 0
26.01.2012, 18:36:13
    #37633687
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
_chaos_ Я не хочу лезть в создание котока, потому что во-первых: он создается в ядре "системы" и не очень то и хотелось навешивать на него ещё какие-то долнительные обьекты, во-вторых: я не знаю о id в то время когда создаю поток.Так как вы все-таки собираетесь сопоставлять реквесты и респонсы?
Ну хотите - создайте внутри потока латч и положите его в какую-нибудь расшаренную мапу.

_chaos_ Я вот не пойму, почему если сделать что-то похожее, но организовать всё через обычный монитор, то есть создать object и использовать его notify/wait. Чем это хуже чем дополнительный обьект CountDownLatch? Ок, тогда вот вам вопрос - чего будет ждать поток? Как обычно wait() используется? Вот так:
while (condition) {
monitor.wait();
}
Что у вас будет монитором? Что у вас будет condition?
...
Рейтинг: 0 / 0
26.01.2012, 18:36:24
    #37633688
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
svenomавторBarrier и Latch не особо отличаются по семантики, разница лишь в нескольких фичесах, например, в Barrier можно установить barrierAction, который будет вызван когда все потоки будут завершены,Неверно, задачи принципиально разные. Цель барьера - обеспечить одновременный старт нескольких потоков, когда каждый из них придет достигнет определенной точки своего выполнения. Цель латча - обеспечить старт потока(потоков), после того, как другие потоки совершили некие действия. Сементика абсолютно разная.

Да точно-точно правы, немного подзабыл :).
...
Рейтинг: 0 / 0
26.01.2012, 18:38:17
    #37633693
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
...
Рейтинг: 0 / 0
26.01.2012, 18:48:10
    #37633712
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
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
}
...
Рейтинг: 0 / 0
26.01.2012, 18:54:36
    #37633727
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
_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.
...
Рейтинг: 0 / 0
26.01.2012, 18:55:56
    #37633728
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
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, может подойдет.
...
Рейтинг: 0 / 0
26.01.2012, 18:57:18
    #37633732
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
_chaos_Думаю так и сделаю, только вот ещё посмотрю с Exchanger, может подойдет.
Логика та же самая, только проще значние передавать.
...
Рейтинг: 0 / 0
26.01.2012, 19:01:34
    #37633739
drsm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
каков смысл в связи какого-то конкретного потока (worker) с состоянием обработки какого-то конкретного запроса (state)?
я бы сделал мультиплексор, раз уж сплошная асинхронщина.
...
Рейтинг: 0 / 0
26.01.2012, 19:02:48
    #37633741
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
drsmя бы сделал мультиплексор, раз уж сплошная асинхронщина.
Ну, хочется человеку stackatrace внятный поиметь, наверное. Других объяснений нет.
...
Рейтинг: 0 / 0
26.01.2012, 19:07:57
    #37633752
OOsalivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
_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.
	final ConcurrentMap<Integer, Boolean> semaphoreMap;
	final Object lock = new Object();
			
	//Методи имплементирующий логику потоков
	public void threadLogic (Integer threadId) throws InterruptedException {	
		//sendRequestLogic
		
		semaphoreMap.put(threadId, Boolean.TRUE);		
		synchronized (lock) {
			while(semaphoreMap.get(threadId).booleanValue()) {
				lock.wait();
			}
		}
		
		//afterResponceLogic()
	}
	
	//слушаем ответы от вебсервиса и устанавливаем дфлаг в фалсе 
	///для того потока для которого пришел ответ
	public void webServiceRequestListener() {
		Integer Id = getThreadID();  
		semaphoreMap.put(id, Boolean.FALSE);
		lock.notifyAll();		
	}
...
Рейтинг: 0 / 0
26.01.2012, 19:08:30
    #37633753
_chaos_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие API классы или pattern-ы лучше использовать?
drsmкаков смысл в связи какого-то конкретного потока (worker) с состоянием обработки какого-то конкретного запроса (state)?
я бы сделал мультиплексор, раз уж сплошная асинхронщина.

Смысл есть, по результатам работы каждого потока в БД ложатся данные, пока я не получу ответ от HLR я не могу положить эти данные, потому что результат работы это не только отправка запроса в HLR, а ещё кучу других задач. Частично положить или заниматься post-обработкой я тоже не могу, точнее могу, но на данный момент уже есть кое-какая архитектура и процесс как должно быть, а переделывать сильно, под одну не типичную, для этой задачи, ситуацию - нет желания и возможностей.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Какие API классы или pattern-ы лучше использовать? / 25 сообщений из 52, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]