2016-03-04 1 views
1

я ударился головой о стену об этом в течение всего дня, очень раздражает, но я сейчас поставить этот вопрос к сообществу, надеюсь, кто-то может помочь мнеНесколько Слушателей в одном RabbitListenerContainer не работает

Это мой конфигурации:

<rabbit:connection-factory id="connectionFactory" 
     virtual-host="****" username="****" password="****" /> 
    <rabbit:template id="amqpTemplate" connection-factory="connectionFactory" /> 
    <rabbit:admin connection-factory="connectionFactory" /> 

    <rabbit:queue name="a" durable="true" /> 
    <rabbit:queue name="b" durable="true" /> 

    <rabbit:listener-container prefetch="10" 
     task-executor="taskExecutor" acknowledge="auto" 
     transaction-size="10" connection-factory="connectionFactory" 
     concurrency="10" channel-transacted="false" 
     message-converter="jsonMessageConverter" requeue-rejected="false"> 

     <rabbit:listener id="a-listener" ref="Abean" 
      method="listen" queue-names="a" /> 
     <rabbit:listener id="b-listener" ref="Bbean" 
      method="listen" queue-names="b" /> 
    </rabbit:listener-container> 

    <bean id="Abean" 
     class="****" /> 
    <bean id="Bbean" 
     class="****" /> 

    <rabbit:direct-exchange name="****" 
     durable="true"> 
     <rabbit:bindings> 
      <rabbit:binding queue="a" key="a" /> 
      <rabbit:binding queue="b" 
       key="b" /> 
     </rabbit:bindings> 
    </rabbit:direct-exchange> 

После запуска контекст, никаких ошибок, не представляется, что только первый слушатель (а-слушатель) настроен будут иметь потребителей, подключенных к очереди (а) это инте но другой слушатель, нет ничего, ни один пользователь, подключающийся к очереди (б).

В чем проблема с этой конфигурацией?

Я использую последнюю пружинный AMQP (1.5.4.Release)

ответ

2

Я просто скопировал конфигурацию и этот тест ...

@ContextConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
public class Foo { 

    @Autowired 
    private RabbitTemplate template; 

    @Autowired 
    private FooListener Abean; 

    @Autowired 
    private FooListener Bbean; 

    @Test 
    public void test() throws Exception { 
     template.convertAndSend("sotest", "a", "foo"); 
     template.convertAndSend("sotest", "b", "bar"); 
     assertTrue(Abean.latch.await(10, TimeUnit.SECONDS)); 
     assertTrue(Bbean.latch.await(10, TimeUnit.SECONDS)); 
    } 

    public static class FooListener { 

     private final CountDownLatch latch = new CountDownLatch(1); 

     public void listen(byte[] foo) { 
      System.out.println("received:" + foo); 
      latch.countDown(); 
     } 
    } 

} 

... и она работала хорошо.

Вы не показываете фасоль taskExcecutor; возможно, у вашей задачи есть только один поток?

+0

Привет, Гэри, спасибо за помощь, мой исполнитель задач настроен на размер пула пула 5 и максимальный размер пула 50 –

+0

Привет, Гари, я нашел проблему, я действительно думаю, что это ошибка, слишком обманчивая для моего нравится: Моя конфигурация была (2 очереди): потребитель параллелизм = 5 taskexecutor.core.pool.size = 5 taskexecutor.max.pool.size = 50 кажется, что задача исполнитель бассейн не будет масштаб превышает 5 для удовлетворения потребностей потребителей в другой очереди, то есть первая конфигурация очереди будет иметь 5 потребителей, а следующая не получит ни одного. Только когда я нажимаю taskexecutor.core.pool.size до 10, другой набор потребителей фактически запускается и начинает слушать очередь. Ваши мысли ... –

+1

Из [документации Spring AMQP] (http://docs.spring.io/spring-amqp//reference/html/_reference.html#_threading_and_asynchronous_consumers), 'Если не настроено, SimpleAsyncTaskExecutor используемый. Если используется объединенный исполнитель, убедитесь, что размер пула достаточен для обработки настроенного параллелизма. '. Из javadoc 'ThreadPoolExecutor':' Если в потоках maxPoolSize больше, чем corePoolSize, но меньше , новый поток будет создан только в том случае, если очередь заполнена. 'Если у вас нет ограниченной очереди в исполнителе, вы никогда не будете получить больше потоков. Размер ядра должен быть достаточно большим. –