2015-04-14 3 views
2

У меня есть продюсер JMS и один потребитель брокер ActiveMQ см код ниже:ActiveMQ Не Получение сообщений от производителя

Код отправителя

package activemq; 

import javax.jms.ConnectionFactory; 
import javax.jms.MessageProducer; 
import javax.jms.Queue; 
import javax.jms.QueueConnection; 
import javax.jms.Session; 
import javax.jms.TextMessage; 

import org.apache.activemq.ActiveMQConnectionFactory; 

public class PlatformNotifier { 

public static void main(String[] args) throws Exception{ 

    ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://localhost:61616"); 

    QueueConnection connection=(QueueConnection)connectionFactory.createConnection(); 
    connection.start(); 

    Session session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE); 

    Queue queue=session.createQueue("QUEUE.NOTIFICATION"); 

    MessageProducer producer=session.createProducer(queue); 

    String message="from producer"; 
    TextMessage textMessage=session.createTextMessage(message); 

    producer.send(textMessage); 

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

}//main closing 

}//class closing 

Receiver Код

package activemq; 

import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.jms.Message; 
import javax.jms.MessageConsumer; 
import javax.jms.Session; 

import org.apache.activemq.ActiveMQConnectionFactory; 

public class ServiceNotifier { 

public static void main(String[] args) throws Exception{ 

    System.out.println("Service Notifier"); 

    ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://localhost:61616"); 

    Connection connection=connectionFactory.createConnection(); 
    connection.start(); 

    Session session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE); 

    Destination queue=session.createQueue("QUEUE.NOTIFICATION"); 

    MessageConsumer consumer=session.createConsumer(queue); 

    Message message=consumer.receive(60*1000); 

    System.out.println("Message = "+message); 

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

}//main closing 

}//class closing 

Проблема заключается в том, что очередь ActiveMQ не получает сообщение от отправителя (см. снимок экрана):

enter image description here

Когда я отправляю сообщение с веб-консоли, оно принимается в очереди, но от производителя ничего не приземляется в очереди.

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

Я работаю на Windows 8.1, это первый раз, когда я сталкиваюсь с этой проблемой. Я был бы признателен за помощь.

ActiveMQ -> 5.11.1

ответ

4

Session session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE); это создает транзакционной сеанс, даже если вы использовали режим AUTO_ACK. Таким образом, вы создаете транзакционные сеансы, но не обрабатываете транзакции JMS. Используйте session.commit() после того, как вы отправили/получили сообщение.

Вызов session.close() на открытой транзакции JMS возвращает эту транзакцию JMS. http://docs.oracle.com/javaee/7/api/javax/jms/Session.html#close()

+0

Да, сейчас он работает, спасибо за наблюдение, примет ответ +1 – Ironluca

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