Рекомендуется ли использовать временную очередь JMS для синхронного использования?

Если мы будем использовать механизм запроса/ответа JMS с использованием «Временной очереди», будет ли этот код масштабируемым?

На данный момент мы не знаем, будем ли мы поддерживать 100 запросов в секунду или 1000 запросов в секунду.

Приведенный ниже код — это то, что я собираюсь реализовать. Он использует JMS в «синхронном» режиме. Ключевые части — это то, где создается «Потребитель», чтобы указать «Временную очередь», которая была создана для этого сеанса. Я просто не могу понять, является ли использование таких временных очередей масштабируемым дизайном.

  destination = session.createQueue("queue:///Q1");
  producer = session.createProducer(destination);
  tempDestination = session.createTemporaryQueue();
  consumer = session.createConsumer(tempDestination);

  long uniqueNumber = System.currentTimeMillis() % 1000;
  TextMessage message = session
      .createTextMessage("SimpleRequestor: Your lucky number today is " + uniqueNumber);

  // Set the JMSReplyTo
  message.setJMSReplyTo(tempDestination);

  // Start the connection
  connection.start();

  // And, send the request
  producer.send(message);
  System.out.println("Sent message:\n" + message);

  // Now, receive the reply
  Message receivedMessage = consumer.receive(15000); // in ms or 15 seconds
  System.out.println("\nReceived message:\n" + receivedMessage);

Обновление:

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

Шаги:

    // 1. Create Send and Receive Queue.
    // 2. Create a msg with a specific ID
 final String correlationId = UUID.randomUUID().toString();
 final TextMessage textMessage = session.createTextMessage( msg );
 textMessage.setJMSCorrelationID( correlationId );

    // 3. Start a consumer that receives using a 'Selector'.
           consumer = session.createConsumer( replyQueue, "JMSCorrelationID = '" + correlationId + "'" );

Отличие этого шаблона в том, что мы не создаем новую временную очередь для каждого нового запроса. Вместо этого все ответы поступают только в одну очередь, но используйте «селектор», чтобы убедиться, что каждый поток запросов получает только тот ответ, о котором заботится.

Я думаю, что недостатком здесь является то, что вы должны использовать «селектор». Я еще не знаю, является ли это менее предпочтительным или более предпочтительным, чем ранее упомянутый шаблон.Мысли?

24
задан rk2010 28 May 2012 в 19:00
поделиться