2012-04-18 1 views
0

У моего сервера есть два клиента разных типов, у которых есть другой формат сообщения, поэтому на сервере есть два сервера NioServerSocketChannelFactory, которые обрабатывают запросы клиентов с двумя типами соответственно. Эти два типа клиентов должны получить доступ к одному и тому же объекту в двух обработчиках NioServerSocketChannelFactory. Могу ли я поделиться тем же объектом OrderedMemoryAwareThreadPoolExecutor в двух ChannelPipelines?share ExecutionHandler в разных ChannelPipeline

, например:

Channels.pipeline(
    concurrencyHandler, 
    new Handler1()); 
} 

Channels.pipeline(
    concurrencyHandler, 
    new Handler2()); 
} 

Будет OrderedMemoryAwareThreadPoolExecutor заботиться о нити параллелизма, когда Handler1 & 2 доступа такого же объект?

ответ

1

Вы должны использовать один ExecutionHandler на ChannelFactory, поскольку OrderedMemoryAwareThreadPoolExecutor использует идентификатор канала для поиска правильного Исполнителя для данного Канала. Идентификатор канала уникален только для ChannelFactory, поэтому у вас могут быть плохие побочные эффекты, если вы делитесь им с другими ChannelFactories.

+0

Он использует объект канала, который не является ключом канала. – jean

+0

Код, который я прочитал, является 3.3.1, getChildExecutorKey возвращает объект Channel. Trustin говорит, что OMATPE будет заботиться о синхронизации потоков, но я не нашел синхронизированное ключевое слово или что-то еще. Как это произошло? – jean

+0

Он использует LinkedTransferQueue для этого, который использует CAS –

0

Share OrderedMemoryAwareThreadPoolExecutor в двух ChannelFactory не может выполнять синхронизацию между потоками. Канал имеет свою исключительную очередь задач, OrderedMemoryAwareThreadPoolExecutor только гарантирует, что событие одного канала (задача в очереди) выполняется упорядоченным образом. Он не может доказать задачи в двух очередях задач двух каналов, которые выполняются упорядоченно. Невозможно синхронизировать задачу в разных очередях доступа к одному объекту.