2017-02-16 5 views
0

Я использую activeMQ tcp // localhost URL-адрес для тишины в течение некоторого времени, и у меня нет проблем с ним. В настоящее время я пытаюсь использовать коннектор «vm // localhost», но у меня возникла проблема с получением сообщения от производителя. Я использую весенний ботинок, производитель и потребитель в разных банках. Мой потребитель получает пустое сообщение. Я что-то упускаю? Ниже приведен мой код (принятый на сайте apache). Заранее спасибоНе получать сообщение от производителя с помощью ActiveMQ VM Transport

Producer.jar

ActiveMQConnectionFactory connectionFactory = 
new ActiveMQConnectionFactory("vm://localhost"); 
Connection connection = connectionFactory.createConnection(); 
connection.start(); 
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
Destination destination = session.createQueue("TEST.FOO"); 
MessageProducer producer = session.createProducer(destination); 
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 

String text = "Hello world! From: " + Thread.currentThread().getName() + " : " + this.hashCode(); 
TextMessage message = session.createTextMessage(text); 

System.out.println("Sent message: " + message.hashCode() + " : " + Thread.currentThread().getName()); 
producer.send(message); 

session.close(); 
connection.close(); 

Consumer.jar

ActiveMQConnectionFactory connectionFactory = 
new ActiveMQConnectionFactory("vm://localhost"); 
Connection connection = connectionFactory.createConnection(); 
connection.start(); 

connection.setExceptionListener(this); 

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
Destination destination = session.createQueue("TEST.FOO"); 

MessageConsumer consumer = session.createConsumer(destination); 

// Wait for a message 
Message message = consumer.receive(10000); 

if (message instanceof TextMessage) { 
    TextMessage textMessage = (TextMessage) message; 
    String text = textMessage.getText(); 
    System.out.println("Received 1: " + text); 
} else { 
    System.out.println("Received 2: " + message); 
} 

consumer.close(); 
session.close(); 
connection.close(); 
+0

Вы можете разместить код, запускающий потребитель и производитель? Вы уверены, что производитель отправляет сообщения до начала загрузки? –

+0

Коды @ HassenBennour запускаются через SpringBootApplication CommandLineRunner. Я установил время ожидания пользователя на 10 секунд. Затем я выполняю банку в течение этого периода. Я также пробовал, но все равно не было получено сообщение. Согласно println моего продюсера. msg был отправлен. исключение не было. – totoDaryl

+0

как я понял, что потребитель и производитель находятся в разных банках, но на той же самой SpringBootApplication и такой же JVM? –

ответ

1

я был уверен, что ВМ транспорт внутри виртуальной машины! и недоступно за его пределами, поэтому решение состоит в том, что одному из двух клиентов необходимо использовать vm-транспорт, а другой tcp и ActiveMQ - в том, что используется с использованием транспорта vm или для встраивания ваших двух компонентов в одну виртуальную машину.

увидеть мой другой ответ на тот же прецедент How to send Jms message from one spring-boot application to another when both apps use embedded activemq

+0

Спасибо за объяснение. Ваш ответ в ссылке очень полезен. я попытаюсь реализовать его в своем тестовом примере. Мой менеджер - программист на C, поэтому мне нужно защитить, что ActiveMQ (JMS) достаточно быстро подходит для многоуровневого приложения. – totoDaryl

Смежные вопросы