package test.mq.helloworld;
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Sender {
//默认连接用户名
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
//默认连接密码
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
//默认连接地址
private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
//发送的消息数量
private static final int SENDNUM = 10;
public static void main(String[] args) throws Exception {
/*ActiveMQConnectionFactory activeMQConnectionFactory =
new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616");*/
/**
* activemq.xml 配置密码
*/
ActiveMQConnectionFactory activeMQConnectionFactory =
new ActiveMQConnectionFactory(
"bhz",
"bhz",
"tcp://localhost:61616");
//连接
Connection connection = null;
try {
connection = activeMQConnectionFactory.createConnection();
connection.start();
//创建session
// Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//开启事物
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//消息的目的地
Destination destination = session.createQueue("queue1");
//创建消息生产者
MessageProducer messageProducer = session.createProducer(destination);
//Persistent 用来指定JMS Provider对消息进行持久化操作,以免Provider fail的时候,丢失Message
//NON_Persistent 方式下的JMS Provider不会对消进宪持久化
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//发送消息
sendMessage(session, messageProducer);
//使用事物 Boolean.TRUE
session.commit();
} catch (Exception e) {
e.printStackTrace();
}finally{
if(connection != null){
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
/**
* 发送消息
* @param session
* @param messageProducer 消息生产者
* @throws Exception
*/
public static void sendMessage(Session session,MessageProducer messageProducer) throws Exception{
for (int i = 0; i < Sender.SENDNUM; i++) {
//创建一条文本消息
TextMessage textMessage = session.createTextMessage();
textMessage.setText("我的消息内容,id为"+i);
messageProducer.send(textMessage);
System.out.println("生产者: "+textMessage.getText());
// TextMessage message = session.createTextMessage("ActiveMQ 发送消息" +i);
// System.out.println("生产者发送消息:Activemq 发送消息" + i);
//通过消息生产者发出消息
// messageProducer.send(message);
}
}
}
package test.mq.helloworld;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Receiver {
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;//默认连接用户名
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;//默认连接密码
private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;//默认连接地址
public static void main(String[] args) {
ConnectionFactory connectionFactory;//连接工厂
Connection connection = null;//连接
Session session;//会话 接受或者发送消息的线程
Destination destination;//消息的目的地
MessageConsumer messageConsumer;//消息的消费者
//实例化连接工厂
// connectionFactory = new ActiveMQConnectionFactory(Receiver.USERNAME, Receiver.PASSWORD, Receiver.BROKEURL);
/**
* activemq.xml 配置密码之后
*/
connectionFactory = new ActiveMQConnectionFactory("bhz", "bhz", Receiver.BROKEURL);
try {
//通过连接工厂获取连接
connection = connectionFactory.createConnection();
//启动连接
connection.start();
//创建session
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建一个连接HelloWorld的消息队列
destination = session.createQueue("queue1");
//创建消息消费者
messageConsumer = session.createConsumer(destination);
while (true) {
//receive 阻塞的等待生产者生产才接受 receive(100000)等待多久;
TextMessage textMessage = (TextMessage) messageConsumer.receive(100000);
if(textMessage != null){
System.out.println("收到的消息:" + textMessage.getText());
}else {
break;
}
}
} catch (JMSException e) {
e.printStackTrace();
}finally{
if(connection != null){
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
Number Of Consumers 消费者 这个是消费者端的消费者数量
Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量。可以理解为总接收数-总出队列数
Messages Enqueued 进入队列的消息 进入队列的总数量,包括出队列的。 这个数量只增不减
Messages Dequeued 出了队列的消息 可以理解为是消费这消费掉的数量
这个要分两种情况理解
在queues里它和进入队列的总数量相等(因为一个消息只会被成功消费一次),如果暂时不等是因为消费者还没来得及消费。
在 topics里 它因为多消费者从而导致数量会比入队列数高。
简单的理解上面的意思就是
当有一个消息进入这个队列时,等待消费的消息是1,进入队列的消息是1。
当消息消费后,等待消费的消息是0,进入队列的消息是1,出队列的消息是1.
在来一条消息时,等待消费的消息是1,进入队列的消息就是2.
没有消费者时 Pending Messages 和 入队列数量一样
有消费者消费的时候 Pedding会减少 出队列会增加
到最后 就是 入队列和出队列的数量一样多
以此类推,进入队列的消息和出队列的消息是池子,等待消费的消息是水流。
//Producer 开启事物 并且使用Client的方式
Session session = connection.createSession(Boolean.TRUE, Session.CLIENT_ACKNOWLEDGE);
//Consumer 开启事物 并且使用Client的方式
message Enqueued 进入队列的信息增加10条 但是Message Dequeued 出队列的数量没有增加