ActiveMQ 未收到来自生产者的消息
ActiveMQ Not Receiving messages from Producer
我有一个 JMS 生产者和一个消费者,代理是 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
收件人代码
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 队列没有收到来自发送者的消息(参考截图):
当我从 Web 控制台发送一条消息时,它在队列中被接收,但来自生产者的消息没有进入队列。
另一个有趣的行为是(如队列接收器代码所示,接收器在收到第一条消息后退出),当我再次启动接收器时,它会收到相同的消息并继续这样做直到我关闭服务器关闭并重新启动。
我是运行 Windows 8.1,这是我第一次遇到这个问题。我将不胜感激。
ActiveMQ -> 5.11.1
Session session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
即使您使用了 AUTO_ACK 模式,这也会创建一个事务处理会话。因此,您创建的是事务处理会话,而不是处理 JMS 事务。在收到 sent/received 条消息后使用 session.commit()
。
在打开的 JMS 事务上调用 session.close()
会回滚该 JMS 事务。
http://docs.oracle.com/javaee/7/api/javax/jms/Session.html#close()
我有一个 JMS 生产者和一个消费者,代理是 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
收件人代码
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 队列没有收到来自发送者的消息(参考截图):
当我从 Web 控制台发送一条消息时,它在队列中被接收,但来自生产者的消息没有进入队列。
另一个有趣的行为是(如队列接收器代码所示,接收器在收到第一条消息后退出),当我再次启动接收器时,它会收到相同的消息并继续这样做直到我关闭服务器关闭并重新启动。
我是运行 Windows 8.1,这是我第一次遇到这个问题。我将不胜感激。
ActiveMQ -> 5.11.1
Session session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
即使您使用了 AUTO_ACK 模式,这也会创建一个事务处理会话。因此,您创建的是事务处理会话,而不是处理 JMS 事务。在收到 sent/received 条消息后使用 session.commit()
。
在打开的 JMS 事务上调用 session.close()
会回滚该 JMS 事务。
http://docs.oracle.com/javaee/7/api/javax/jms/Session.html#close()