У меня вопрос по JMS. Я прочитал соответствующие вопросы и ответы, но не смог найти четкого ответа.
У меня есть базовый c продюсер, подобный этому:
public class AsyncProducer {
public static void main(String[] args) throws Exception {
InitialContext initialContext = new InitialContext();
Queue queue = (Queue) initialContext.lookup("queue/asyncQueue");
try (
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();
JMSContext jmsContext = cf.createContext();
){
JMSProducer producer = jmsContext.createProducer();
producer.send(queue, "Async Message");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Это мой MessageListener:
public class AsyncConsumerListener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
TextMessage text = (TextMessage) message;
System.out.println("Consumer: message received: " + text.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
А это мой потребитель:
public class AsyncConsumer {
public static void main(String[] args) throws Exception{
InitialContext initialContext = new InitialContext();
Queue queue = (Queue) initialContext.lookup("queue/asyncQueue");
try (
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();
JMSContext jmsContext = cf.createContext();
){
JMSConsumer consumer = jmsContext.createConsumer(queue);
consumer.setMessageListener(new AsyncConsumerListener());
//Thread.sleep(10000);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Сначала я запускаю класс Producer
и отправляю сообщение в очередь. Затем, когда я запускаю класс Consumer
. Если строка Thread.sleep(10000);
закомментирована, то Consumer
не получит сообщение. Но когда я отлаживаю Consumer
, он получает сообщение.
Я знаю, что когда приходит сообщение, слушатель вызывается в отдельном потоке. В этом примере в очереди есть сообщение, но потребитель не получает сообщение, пока не запущен Thread.sleep(10000)
.
Почему мой Consumer
не получает сообщение, когда строка Thread.sleep(10000);
закомментировано?