Распределение задач на обслуживание
От: rlt  
Дата: 02.03.08 20:46
Оценка:
Есть заданное количество сервисов, которые выполняют некие действия над задачей. Каждый из этих сервисов работает в своем потоке, одновременно обслуживает только 1 задачу. Есть очередь задач. Каждая задача должна обрабатываться либо всем сервисами/либо конечным числом (4 из 10). Это заданно внутри свойств самой задачи. Есть некий контроллер, который берет задачу из очереди и отправляет на выполнение на требуемые сервисы.

Так вот... как бы это наиболее грамотно реализовать с помощью классов из java.util.concurrent Почитал доки, статейки разные, вроде уже примерно нарисовалась картина как это делать, но хочется совета, как бы это сделали вы.
Re: Распределение задач на обслуживание
От: denis.zhdanov Россия http://denis-zhdanov.blogspot.com/
Дата: 03.03.08 07:59
Оценка:
Здравствуйте, rlt, Вы писали:

rlt>Есть заданное количество сервисов, которые выполняют некие действия над задачей. Каждый из этих сервисов работает в своем потоке, одновременно обслуживает только 1 задачу. Есть очередь задач. Каждая задача должна обрабатываться либо всем сервисами/либо конечным числом (4 из 10). Это заданно внутри свойств самой задачи. Есть некий контроллер, который берет задачу из очереди и отправляет на выполнение на требуемые сервисы.


rlt>Так вот... как бы это наиболее грамотно реализовать с помощью классов из java.util.concurrent Почитал доки, статейки разные, вроде уже примерно нарисовалась картина как это делать, но хочется совета, как бы это сделали вы.



Если настраивать количество потоков для каждого сервиса отдельно, то так:

//...

private final Map<Class<?>/* service class */, BlockingQueue /* tasks queue */> service2queue = new ConcurrentHashMap<Class<?>, BlockingQueue>();

// initialization of the map
// ...

// usage
service2queue.get(Service1.class).put(task);



Если хочется использовать общий thread pool, то хранить в таске ссылку на сервис, который должен его обрабатывать, и постить нужное кол-во таких тасков:


class MyTask {
    private final Service service;
    
    // ctor

    public void run() {
        service.doService();
    }
}

// ...
private final ExecutorService service;

// ...
// We need to schedule the task for two specific services
service.schedule(new MyTask(service1));
service.schedule(new MyTask(service2));
http://denis-zhdanov.blogspot.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.