2016-06-24 2 views
0

Я пытаюсь решить, будет ли convertSendAndReceive работать для следующего случая использования:Spring AMQP convertSendAndReceive с успокоительной многопоточных производителя

У меня есть RESTful веб-сервис, который необходимо сделать RPC вызовы и получить ответ обратно в для обслуживания запроса. Я никогда не использовал функцию ответа-ответа в Spring-amqp или RabbitMQ.

Будет ли это работать или я возглавляю путь, чреватый опасностью?

EDIT: Я беспокоюсь, будет ли поток, создающий сообщение, получить правильный ответ, а не получить ответ другого потока.

Я добавил к тесту, который указан в документации весны-amqp под названием JavaConfigFixedReplyQueueTests. Я добавил следующий тестовый пример:

(Мое соединениеFactory bean другое, но это только, чтобы указать нашу конфигурацию SSL для экземпляра rabbitmq моей компании, поэтому я не перечисляю это здесь. Все существующие тесты прошли с этим изменением.)

@Test 
public void testReplyContainer_multiple_threads() throws Exception 
{ 
    fixedReplyQRabbitTemplate.setReplyTimeout(-1); 
    // limit the number of actual threads 
    int poolSize = 100; 
    ExecutorService service = Executors.newFixedThreadPool(poolSize); 
    List<Future<?>> futures = new ArrayList<>(); 

    for(int n = 0; n < 1000; n++) 
    { 
     Future<?> f = service.submit(makeNumberedRunnable(n)); 
     futures.add(f); 
    } 

    // wait for all tasks to complete before continuing 
    for(Future<?> f : futures) 
    { 
     f.get(); 
    } 

    // shut down the executor service so that this thread can exit 
    service.shutdownNow(); 
} 

private Runnable makeNumberedRunnable(int n) 
{ 
    return new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      assertEquals("FOO" + n, fixedReplyQRabbitTemplate.convertSendAndReceive("foo" + n)); 
     } 
    }; 
} 

в основном мой тест создает много потоков и убедившись, что правильный поток специфического ответа возвращается. Тест проходит очень хорошо, что дает мне немного уверенности в моем подходе.

Я надеюсь, что Gary Russell может позвонить или, может быть, Artem Bilan, чтобы дать мне свое мнение экспертов. Тем не менее, я приветствую тех, кто хорошо осведомлен в этой области, чтобы дать мне советы.

Спасибо за ваше время.

ответ

0

Все методы ...sendAndReceive(...) будут правильно коррелировать запрос/ответ, чтобы правильный ответ возвращался в запрашивающем потоке.

+0

Спасибо, Гэри! Я думал, что это так, но я не мог найти, где кто-то делает многопотокового продюсера, как мой, поэтому я хотел быть уверенным. –

+0

Это довольно фундаментальное требование - структура была бы непригодной для использования, если бы вы не могли полагаться на такие вещи. –

+0

Я бы предпочел задать этот вопрос и выглядеть здесь как идиот, а не реализовывать несколько критически важных решений, которые ломаются в производстве. :-) –