powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Какие API классы или pattern-ы лучше использовать?
52 сообщений из 52, показаны все 3 страниц
Какие API классы или pattern-ы лучше использовать?
    #37633582
_chaos_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет,

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

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

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

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

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

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

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

В том то и дело, что web-service работает как отправил и забудь (асинхронно). А результат прийдет в notification web-service.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633654
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();


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


Насколько я знаю, Barrier и Latch не особо отличаются по семантики, разница лишь в нескольких фичесах, например, в Barrier можно установить barrierAction, который будет вызван когда все потоки будут завершены, а также, например, можно сделать reset count-а. Про Semaphore ничего не могу сказать.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633671
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторBarrier и Latch не особо отличаются по семантики, разница лишь в нескольких фичесах, например, в Barrier можно установить barrierAction, который будет вызван когда все потоки будут завершены,Неверно, задачи принципиально разные. Цель барьера - обеспечить одновременный старт нескольких потоков, когда каждый из них придет достигнет определенной точки своего выполнения. Цель латча - обеспечить старт потока(потоков), после того, как другие потоки совершили некие действия. Сементика абсолютно разная.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633680
_chaos_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Какие API классы или pattern-ы лучше использовать?
    #37633687
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_chaos_ Я не хочу лезть в создание котока, потому что во-первых: он создается в ядре "системы" и не очень то и хотелось навешивать на него ещё какие-то долнительные обьекты, во-вторых: я не знаю о id в то время когда создаю поток.Так как вы все-таки собираетесь сопоставлять реквесты и респонсы?
Ну хотите - создайте внутри потока латч и положите его в какую-нибудь расшаренную мапу.

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

Да точно-точно правы, немного подзабыл :).
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633693
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633712
_chaos_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Какие API классы или pattern-ы лучше использовать?
    #37633727
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.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633728
_chaos_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Какие API классы или pattern-ы лучше использовать?
    #37633732
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_chaos_Думаю так и сделаю, только вот ещё посмотрю с Exchanger, может подойдет.
Логика та же самая, только проще значние передавать.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633739
drsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
каков смысл в связи какого-то конкретного потока (worker) с состоянием обработки какого-то конкретного запроса (state)?
я бы сделал мультиплексор, раз уж сплошная асинхронщина.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633741
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drsmя бы сделал мультиплексор, раз уж сплошная асинхронщина.
Ну, хочется человеку stackatrace внятный поиметь, наверное. Других объяснений нет.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633752
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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
Какие API классы или pattern-ы лучше использовать?
    #37633753
_chaos_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drsmкаков смысл в связи какого-то конкретного потока (worker) с состоянием обработки какого-то конкретного запроса (state)?
я бы сделал мультиплексор, раз уж сплошная асинхронщина.

Смысл есть, по результатам работы каждого потока в БД ложатся данные, пока я не получу ответ от HLR я не могу положить эти данные, потому что результат работы это не только отправка запроса в HLR, а ещё кучу других задач. Частично положить или заниматься post-обработкой я тоже не могу, точнее могу, но на данный момент уже есть кое-какая архитектура и процесс как должно быть, а переделывать сильно, под одну не типичную, для этой задачи, ситуацию - нет желания и возможностей.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633756
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivanПо моему данная задача лучше решается с помощью классического wait/notify

Попробуйте написать через Exchanger - код будет ещё проще.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633772
drsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_chaos_drsmкаков смысл в связи какого-то конкретного потока (worker) с состоянием обработки какого-то конкретного запроса (state)?
я бы сделал мультиплексор, раз уж сплошная асинхронщина.

Смысл есть, по результатам работы каждого потока в БД ложатся данные, пока я не получу ответ от HLR я не могу положить эти данные, потому что результат работы это не только отправка запроса в HLR, а ещё кучу других задач. Частично положить или заниматься post-обработкой я тоже не могу, точнее могу, но на данный момент уже есть кое-какая архитектура и процесс как должно быть, а переделывать сильно, под одну не типичную, для этой задачи, ситуацию - нет желания и возможностей.
держишь транзакцию чтоли открытой?
это изврат, по хорошему так не делается.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633804
_chaos_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drsm_chaos_пропущено...


Смысл есть, по результатам работы каждого потока в БД ложатся данные, пока я не получу ответ от HLR я не могу положить эти данные, потому что результат работы это не только отправка запроса в HLR, а ещё кучу других задач. Частично положить или заниматься post-обработкой я тоже не могу, точнее могу, но на данный момент уже есть кое-какая архитектура и процесс как должно быть, а переделывать сильно, под одну не типичную, для этой задачи, ситуацию - нет желания и возможностей.
держишь транзакцию чтоли открытой?
это изврат, по хорошему так не делается.

не в транзации дело, я не использую их на протяжении всей работы потока, потому что я не смогу сделать откат, скажем, из какой-то внешней системы (например из SMSC или MMSC или VMS), потому что она не поддерживает транзакции. Суть больше в том, что был один заказчик и для него писалось, а потом появился другой-третий и я не могу тратить время на переписывание каких-то больших частей, моя задача быстро адаптировать и дописать то, что нужно, но не переписывать, потому что сроки ограничены.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37633877
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivan_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();		
	}


Эээ, а что делает метод getThredID()? Как он работает?
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37634057
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svenomOOsalivan_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();		
	}


Эээ, а что делает метод getThredID()? Как он работает?

:)
_chaos_Дальше у меня есть веб-сервис, в который будут приходить responses от HLR и мне нужно уведомлять потоки, которые ждут ответы от HLR о результате.

Метод public void webServiceRequestListener() - это (конечно в ООП лучше его сделать не методом а интерфайсом с реализацией, но лень писать) как раз слушатель responses от HLR, а в респонсах содержится соответственно идентификатор того потока кому он предназначается и метод getThreadID() извлекает этот идентификатор из респонса. Т.е когда приходит респонс от HLR дергается webServiceRequestListener с информацией которая пришла в респонсе. public void webServiceRequestListener(Responce resp) -> getThreadID(Responce resp)
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37634087
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А понятно, тогда это точно такое же решение, как я предложил выше.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37634716
_chaos_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczOOsalivanПо моему данная задача лучше решается с помощью классического wait/notify

Попробуйте написать через Exchanger - код будет ещё проще.

Так и сделал. Кстати, я считаю, что лучше, в данном случае, использовать все-таки concurrent классы, так как они используют CAS, вместо стандартного механизма. Ещё один + в сторону Exchanger.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37634836
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_chaos_Blazkowiczпропущено...

Попробуйте написать через Exchanger - код будет ещё проще.

Так и сделал. Кстати, я считаю, что лучше, в данном случае, использовать все-таки concurrent классы, так как они используют CAS, вместо стандартного механизма. Ещё один + в сторону Exchanger.

В том что я написал тоже частично КАС используется. Интересно было бы взглянуть на реализацию через эксченджер
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37635021
_chaos_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivan_chaos_пропущено...


Так и сделал. Кстати, я считаю, что лучше, в данном случае, использовать все-таки concurrent классы, так как они используют CAS, вместо стандартного механизма. Ещё один + в сторону Exchanger.

В том что я написал тоже частично КАС используется. Интересно было бы взглянуть на реализацию через эксченджер

Это пока набросок, я ещё не знаю всех данных.

HLRHandler - класс, который отправляет запрос в HLR и ожидает ответ.
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
public class HLRHandler extends AbstractHandler
{
	private static final Logger LOGGER = Logger.getLogger(HLRHandler.class);

	public static String HLR_WSDL_LOCATION = "hlr_wsdl_location";

	public static String HLR_SUCCESS_CODE = "hlr_success_code";
	public static String HLR_TIMEOUT = "hlr_timeout";

	public static Error createSubscriber(final String ip, final String username, final String password, final String path,
			final MessageSource messageSource, final String imsi, final String msisdn, final String key,
			final SubscriberType type, final boolean isBulkProcessing, final long operationId)
	{
		LOGGER.trace("Starting: createSubscriber(" + ip + "," + imsi + "," + msisdn + "," + key + "," + type + ","
				+ isBulkProcessing + "," + operationId + ")");

		Error error = null;

		try
		{
			final WSProvision wsProvision = new WSProvision(new URI("file:" + path
					+ StringUtils.getMessage(messageSource, HLR_WSDL_LOCATION)).toURL(), WSProvision.SERVICE);

			final ObjectFactory objectFactory = new ObjectFactory();
			final DTOEntrada dtoEntrada = objectFactory.createDTOEntrada();

			final String ticket = "my ticket";

			// number of action
			dtoEntrada.setActuacion(objectFactory.createDTOEntradaActuacion("1"));

			// Provisioning mechanism (SINC for synchronous, ASINCE to
			// asynchronous) P.S. works only 'ASINCE'
			dtoEntrada.setTipoConexion(objectFactory.createDTOEntradaTipoConexion("ASINCE"));

			// User Id
			dtoEntrada.setUsuario(objectFactory.createDTOEntradaUsuario("userId"));

			// Number of service
			dtoEntrada.setOoss(objectFactory.createDTOEntradaOoss("ooss"));

			// Priority
			dtoEntrada.setPrioridad(objectFactory.createDTOEntradaPrioridad("1"));

			// Ticket (transaction ID of movement)
			dtoEntrada.setTicket(objectFactory.createDTOEntradaTicket(ticket));

			// ID of system (required for sync)
			// dtoEntrada.setSistema(objectFactory.createDTOEntradaSistema("id of system"));

			// Time To Live (required for sync)
			// dtoEntrada.setTtl(objectFactory.createDTOEntradaTtl("60"));

			// array of parameters and values
			final List<Parametro> parameters = dtoEntrada.getParametros();
			final Parametro param1 = objectFactory.createParametro();
			parameters.add(param1);

			// param1
			param1.setNombre(objectFactory.createParametroNombre("name"));
			param1.setValor(objectFactory.createParametroValor("value"));

			// change IP address of web-service and execute
			final WSProvisionPortType portType = wsProvision.getWSProvisionHttpEndpoint();
			final BindingProvider provider = (BindingProvider) portType;

			final Map<String, Object> maps = provider.getRequestContext();
			maps.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://" + ip);

			portType.enviaComandoPS2(dtoEntrada);

			// waiting for result
			final Exchanger<HLRResponse> exchanger = new Exchanger<HLRResponse>();
			NotificationServiceImpl.addHandler(ticket, exchanger);
			checkHLRResponse(messageSource, exchanger.exchange(new HLRResponse(),
					Long.valueOf(StringUtils.getMessage(messageSource, HLR_TIMEOUT)), TimeUnit.MILLISECONDS));
		}
		catch (Exception e)
		{
			LOGGER.error("Failed provisioning for HLR (createSubscriber): ", e);

			error = createError();
		}

		LOGGER.trace("Ending: createSubscriber()");
		return error;
	}

	private static void checkHLRResponse(final MessageSource messageSource, final HLRResponse response) throws Exception
	{
		if (!response.getStatus().equals(StringUtils.getMessage(messageSource, HLR_SUCCESS_CODE)))
		{
			throw new Exception("HLR error: [ticket: " + response.getTicket() + ", status: " + response.getStatus() + ", error: "
					+ response.getSuberror() + "]");
		}
	}

	private static Error createError()
	{
		return createError(ErrorCodes.HLRError);
	}
}



NotificationServiceImpl - класс, который принимает ответы от HLR и уведомляет о результате
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
@javax.jws.WebService(serviceName = "WSNotificacion", portName = "WSNotificacionHttpSoap11Endpoint", targetNamespace = "****", wsdlLocation = "", endpointInterface = "****")
@Service
public class NotificationServiceImpl implements WSNotificacionPortType
{
	private static final Logger LOGGER = Logger.getLogger(NotificationServiceImpl.class);

	private static ConcurrentMap<String, Object> waitingRequests = new ConcurrentHashMap<String, Object>();

	public static void addHandler(final String ticket, final Exchanger<HLRResponse> exchanger)
	{
		waitingRequests.put(ticket, exchanger);
	}

	@Override
	public String notifica(final String ticket, final String status, final String suberror)
	{
		LOGGER.trace("Starting: notifica()");

		LOGGER.debug(ticket);
		LOGGER.debug(status);
		LOGGER.debug(suberror);

		final Iterator<String> iterTickets = waitingRequests.keySet().iterator();
		while (iterTickets.hasNext())
		{
			if (iterTickets.next().equals(ticket))
			{
				@SuppressWarnings("unchecked")
				final Exchanger<HLRResponse> exchanger = (Exchanger<HLRResponse>) waitingRequests.get(ticket);
				try
				{
					exchanger.exchange(new HLRResponse(ticket, status, suberror));
					return "OK";
				}
				catch (InterruptedException e)
				{
					LOGGER.error("HLR notification theard has been interrupted for ticket [" + ticket + "]: ", e);
				}
				finally
				{
					waitingRequests.remove(ticket);
				}
			}
		}

		LOGGER.trace("Ending: notifica()");
		return "FAILED";
	}
}



Я пока жду некоторые данные и после этого начну тестировать.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37635085
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_chaos_Blazkowiczпропущено...

Попробуйте написать через Exchanger - код будет ещё проще.

Так и сделал. Кстати, я считаю, что лучше, в данном случае, использовать все-таки concurrent классы, так как они используют CAS, вместо стандартного механизма. Ещё один + в сторону Exchanger.

Еще в данном случае алгоритмы КАС и блокировка не взаимоисключающие вещи, потому что поток нужно блокировать . В том что я написал выше, блокировка используется только там где без нее не обойтись исходя из самих условий задачи.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37635097
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivan,
Да, я что-то то же не вдуплил, нафига тут CAS нужен и в чем заключается его реимущество
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37636070
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_chaos_,

По моему в вашей реализации а эксченджером напутано, непонятно где тормозиться поток. Вообще эксченджеры сущетвуют для передачи объекта между потоками
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37636136
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще не понятно зачем тут эксченджер, если никакого эксчанджа нет и в помине.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37636204
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долго пытался понять, что таки нужно. Предложу таки свой вариант (как понял )

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
public static class WebService {
    
    private final long timeout;

    private final Handler handler;

    private final ConcurrentHashMap<String, FutureTask<String>> tasks = new ConcurrentHashMap<String, FutureTask<String>>();

    public WebService(long timeout, Handler handler) {
        this.handler = handler;
        this.timeout = timeout;
    }

    public String getOnWithIt(final String something) throws ExecutionException, TimeoutException, InterruptedException {
        FutureTask<String> task = tasks.get(something);
        if (task == null) {
            task = new FutureTask<String>(new Callable<String>(){
                @Override
                public String call() throws Exception {
                    return handler.handle(something);
                }
            });
            FutureTask<String> t = tasks.putIfAbsent(something, task);
            if (t == null) {
                task.run();
            } else {
                task = t;
            }
        }
        try {
            //TODO: exception handling :)
            return task.get(timeout, TimeUnit.SECONDS);
        } finally {
            tasks.remove(something);
        }

    }
    
}

public static class Handler {
    public String handle(String argument) throws Exception {
        //...
        return "ouch-ouch-ouch";
    }
}
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37636216
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivan_chaos_,

По моему в вашей реализации а эксченджером напутано, непонятно где тормозиться поток. Вообще эксченджеры сущетвуют для передачи объекта между потоками
Тормрзится-то он затормозится, а вот сможет ли он потом очнуться? Что-то сомневаюсь
Если придут два запроса с одинаковым ticket-ом и если на момент прибытия второго, первый обработается, то поток, ожидающий первого должен таки повиснуть навсегда (т.к. кладется один эксченджер, а достаем другой).
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37637227
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwa,

Суть задачи проста как я понял - запустить поток, в нем выполнить реквест к вебсервису и остановить поток (после реквета есть еще ряд действий, но которые нужно выполнить послле респонса). В отдельном потоке приходят респонсы от вебсервиса которые возобновляют ранее приостановленные потоки.
getOnWithIt - что делает метод?
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37637272
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это метод вебсервиса автора, очищенный от информационного мусора. Получаем запрос -> обрабатываем(блокируя текущий поток) -> получаем результат (разблокировав текущий поток) -> возвращаем как ответ вебсервиса.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37637437
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaЭто метод вебсервиса автора, очищенный от информационного мусора. Получаем запрос -> обрабатываем(блокируя текущий поток) -> получаем результат (разблокировав текущий поток) -> возвращаем как ответ вебсервиса.

Создаем поток который выполняет некотрый код, сперва этот код делает запрос к вебсервису (после чего поток должен быть заблокирован). И каким образом в вебсервисе мы сможем заблокировать поток из которого ушел ответ на вебсервис (подразумеваеться что вебсервис колл асинхронный - вызвали и поехал идальше не дожидаясь ответа)??
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37638011
_chaos_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivan_chaos_,

По моему в вашей реализации а эксченджером напутано, непонятно где тормозиться поток. Вообще эксченджеры сущетвуют для передачи объекта между потоками

Почему ж напутно? В NotificationServiceImpl я передаю exchanger, ticket, и пустой HLRResponse (мне не нужно что б он был заполнен для NotificationServiceImpl) и поток ждет ответ от NotificationServiceImpl. Из NotificationServiceImpl в HLRHandler я передаю заполненый HLRResponse и всё, поток продолжает свою работу.

З.Ы.
Два одинаковых ticket-а быть не может - я контролирую уникальность тикитов.

З.Ы.
З.Ы.

Если в HLRHandler не приходит ответ в течении HLR_TIMEOUT, то срабатывает exception и запрос считается failed.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37638600
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_chaos_OOsalivan_chaos_,

По моему в вашей реализации а эксченджером напутано, непонятно где тормозиться поток. Вообще эксченджеры сущетвуют для передачи объекта между потоками

Почему ж напутно? В NotificationServiceImpl я передаю exchanger, ticket, и пустой HLRResponse (мне не нужно что б он был заполнен для NotificationServiceImpl) и поток ждет ответ от NotificationServiceImpl. Из NotificationServiceImpl в HLRHandler я передаю заполненый HLRResponse и всё, поток продолжает свою работу.

З.Ы.
Два одинаковых ticket-а быть не может - я контролирую уникальность тикитов.

З.Ы.
З.Ы.

Если в HLRHandler не приходит ответ в течении HLR_TIMEOUT, то срабатывает exception и запрос считается failed.

Зачем так усложнять? У вас получается батлнек в методе
Код: java
1.
public String notifica(final String ticket, final String status, final String suberror)

. Представьте у вас будет 10000 потоков и от вебсервиса будет 10000 респонсов, в вашей реализации итератор будет пробегать в худшем случае 1000 раз, как все будет подтормаживать (т.е сложность алгоритма O(n)), а в том что я писал выше сложность - O(1)
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37638750
_chaos_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivan,

Вы однозначно правы - я затупил (реализация быстро, на коленках это на самом деле), можно из хеш-таблицы получать значение и не использовать итератор - это очевидно. А в целом, ничего не поменяется.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37638786
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_chaos_OOsalivan,

Вы однозначно правы - я затупил (реализация быстро, на коленках это на самом деле), можно из хеш-таблицы получать значение и не использовать итератор - это очевидно. А в целом, ничего не поменяется.
Еще каждый раз создание нового объекта Exchanger на очередной поток + не явное его использование(не для передачи объекта между потоками). Если важна производительность то для нотификации быстрее сработает нативный метод обжекта notifyAll, чем выборка из хэш таблицы.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37638794
svenom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivanЕсли важна производительность то для нотификации быстрее сработает нативный метод обжекта notifyAll, чем выборка из хэш таблицыДаа фигня это, никто не заметит разницу в несколько микросекунд с выборкой из HashMap и без оной.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37638893
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczOOsalivanПо моему данная задача лучше решается с помощью классического wait/notify

Попробуйте написать через Exchanger - код будет ещё проще.
90% синхронизационных задач решается с помощью очередей сообщений. wait/notify, latch, barrier, semafore - это все низкоуровневые средства, и нужны, как правило, лишь для реализации нестандартных очередей.
Exchanger - это нестандартная очередь (двунаправленная, с нулевым объемом буфера). Недостаток ее использования в данной задаче - если инициирующий поток задержится с выполнением запроса для получения respons'a - будет задержан нотифицирующий поток. Смысла же его задерживать нет. Поэтому объем буфера должен быть как минимум 1. Самый подходящий вариант - new ArrayBlockingQueue(1).
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37639474
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rfqесли инициирующий поток задержится с выполнением запроса для получения respons'a - будет задержан нотифицирующий поток. Смысла же его задерживать нет. Поэтому объем буфера должен быть как минимум 1. Самый подходящий вариант - new ArrayBlockingQueue(1).
Рассуждения логичные, но в данном случае притянуты за уши. Т.е. нотификация с удаленного сервера может прийти раньше чем инициирующий поток уснет после отправки данных?
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37640116
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Т.е. нотификация с удаленного сервера может прийти раньше чем инициирующий поток уснет после отправки данных?Может - ни один планировщик потоков не может вам гарантировать, что между соседними предложениями (отправка запроса и ожидание нотификации) не будет заметной паузы, хотя, конечно, вероятность этого мала. А еще в эту щель программисты-сопровождающие потом могут вставить какую-нибудь работу. Короче, не надо увеличивать число предпосылок для нормального функционирования. Обходиться минимумом - этот признак хорошего стиля проектирования.
...
Рейтинг: 0 / 0
Какие API классы или pattern-ы лучше использовать?
    #37640339
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rfqМожет - ни один планировщик потоков не может вам гарантировать, что между соседними предложениями (отправка запроса и ожидание нотификации) не будет заметной паузы, хотя, конечно, вероятность этого мала. А еще в эту щель программисты-сопровождающие потом могут вставить какую-нибудь работу. Короче, не надо увеличивать число предпосылок для нормального функционирования. Обходиться минимумом - этот признак хорошего стиля проектирования.
Вы правы.
...
Рейтинг: 0 / 0
52 сообщений из 52, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Какие API классы или pattern-ы лучше использовать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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