блокирование потребителей в Apache Camel с использованием существующих компонентов - PullRequest
2 голосов
/ 11 мая 2011

Я хотел бы использовать JDBC-компонент Apache Camel для чтения таблицы Oracle.Я хочу, чтобы Camel работал в распределенной среде, чтобы соответствовать требованиям доступности.Тем не менее, таблица, которую я читаю, похожа на очередь, поэтому я хочу, чтобы в каждый момент времени был только один читатель, чтобы я мог избежать проблем с блокировкой (грязно в Oracle).

Если читатель отключается,Я хочу, чтобы другой читатель вступил во владение.

Как бы вы достигли этого, используя готовые компоненты Camel?Возможно ли это?

1 Ответ

2 голосов
/ 14 мая 2011

Это зависит от вашей архитектуры развертывания.Например, если вы развернете свои приложения Camel на Servicemix (или ActiveMQ) в конфигурации master / slave (для HA), тогда в данный момент будет активен только один потребитель ...

Но если вынужно многократное выполнение (кластеризовано для масштабируемости), тогда (по умолчанию) они будут конкурировать / дублировать чтения из таблицы, если вы не напишите свою собственную логику блокировки.

Это легко, используя Hazelcast Distributed Locking .Существует компонент camel-hazelcast, но он не поддерживает API блокировки.Как только вы сконфигурируете свои приложения для участия в кластере Hazelcast, просто установите API-интерфейс блокировки вокруг любого кода, который необходимо синхронизировать для данного объекта ...

import com.hazelcast.core.Hazelcast;
import java.util.concurrent.locks.Lock;

Lock lock = Hazelcast.getLock(myLockedObject);
lock.lock();
try {
    // do something here
} finally {
    lock.unlock();
} 
...