ActiveMQ入门代码案例
ActiveMQ入门代码案例:
pom依赖:
<!-- activemq 所需要的jar 包-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.9</version>
</dependency>
<!-- activemq 和 spring 整合的基础包 -->
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>3.16</version>
</dependency>
JMS编码总体规范:


Destination(目的地)简介:
Destination是目的地。下面拿jvm和mq,做个对比。目的地,我们可以理解为是数据存储的地方。
Destination分为两种:队列和主题。下图介绍:

Destination之队列(Queue)
消息队列生产者
案例代码:
public static final String ACTIVEMQ_URL = "tcp://www.zhangzhixi.top:61616";
public static final String ACTIVE_NAME = "active1";
public static void main(String[] args) throws Exception {
/*1、创建连接工厂*/
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
/*2、打开连接*/
final Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
/*3、创建Session会话:参数1:事务,参数2:签收*/
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
/*4、创建目的地:具体是队列还是主题topic*/
Queue queue = session.createQueue(ACTIVE_NAME);
/*5、创建消息的消费者*/
final MessageProducer producer = session.createProducer(queue);
for (int i = 1; i <= 60; i++) {
final TextMessage textMessage = session.createTextMessage("生产者生产消息:Message=>" + i);
producer.send(textMessage);
}
/*6、关闭资源*/
producer.close();
session.close();
connection.close();
System.out.println("*****生产者生产完成*****");
}
控制台:

Number Of Pending Messages:
等待消费的消息,这个是未出队列的数量,公式=总接收数-总出队列数。
Number Of Consumers:
消费者数量,消费者端的消费者数量。
Messages Enqueued:
进队消息数,进队列的总消息量,包括出队列的。这个数只增不减。
Messages Dequeued:
出队消息数,可以理解为是消费者消费掉的数量。
总结:
当有一个消息进入这个队列时,等待消费的消息是1,进入队列的消息是1。
当消息消费后,等待消费的消息是0,进入队列的消息是1,出队列的消息是1。
当再来一条消息时,等待消费的消息是1,进入队列的消息就是2。
消息队列消费者
案例代码:
public static final String ACTIVEMQ_URL = "tcp://www.zhangzhixi.top:61616";
public static final String ACTIVE_NAME = "active1";
public static void main(String[] args) throws Exception {
/*1、创建连接工厂*/
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
/*2、打开连接*/
final Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
/*3、创建Session会话:参数1:事务,参数2:签收*/
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
/*4、创建目的地:具体是队列还是主题topic*/
Queue queue = session.createQueue(ACTIVE_NAME);
final MessageConsumer consumer = session.createConsumer(queue);
/*5、消费者消费方式一:订阅(同步阻塞)*/
while (true) {
final TextMessage receive = (TextMessage) consumer.receive(30000);
if (receive != null) {
System.out.println("*******消费者收到消息*******" + receive.getText());
}else{
break;
}
}
consumer.close();
session.close();
connection.close();
System.out.println("****消费者结束消费*****");
}
控制台:

异步监听式消费者(MessageListener)
1 public static final String ACTIVEMQ_URL = "tcp://www.zhangzhixi.top:61616"; 2 public static final String ACTIVE_NAME = "active1"; 3 public static void main(String[] args) throws Exception { 4 /*1、创建连接工厂*/ 5 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); 6 /*2、打开连接*/ 7 final Connection connection = activeMQConnectionFactory.createConnection(); 8 connection.start(); 9 /*3、创建Session会话:参数1:事务,参数2:签收*/ 10 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 11 /*4、创建目的地:具体是队列还是主题topic*/ 12 Queue queue = session.createQueue(ACTIVE_NAME); 13 final MessageConsumer consumer = session.createConsumer(queue); 14 /*6、消费者消费方式二:监听器(异步非阻塞)*/ 15 consumer.setMessageListener(new MessageListener() { 16 @Override 17 public void onMessage(Message message) { 18 if (message instanceof TextMessage) { 19 final TextMessage textMessage = (TextMessage) message; 20 try { 21 System.out.println("*******消费者收到消息:" + textMessage.getText()); 22 } catch (JMSException e) { 23 e.printStackTrace(); 24 } 25 } 26 } 27 }); 28 System.in.read(); 29 consumer.close(); 30 session.close(); 31 connection.close(); 32 System.out.println("****消费者结束消费*****"); 33 }

队列消息(Queue)总结
两种消费方式:
同步阻塞方式(receive())
订阅者或接收者抵用MessageConsumer的receive()方法来接收消息,receive方法在能接收到消息之前(或超时之前)将一直阻塞。
异步非阻塞方式(监听器onMessage())
订阅者或接收者通过MessageConsumer的setMessageListener(MessageListener listener)注册一个消息监听器,当消息到达之后,系统会自动调用监听器MessageListener的onMessage(Message message)方法。
队列的特点:

消息消费情况

情况1:只启动消费者1。
结果:消费者1会消费所有的数据。
情况2:先启动消费者1,再启动消费者2。
结果:消费者1消费所有的数据。消费者2不会消费到消息。
情况3:生产者发布6条消息,在此之前已经启动了消费者1和消费者2。
结果:消费者1和消费者2平摊了消息。各自消费3条消息。
疑问:怎么去将消费者1和消费者2不平均分摊呢?而是按照各自的消费能力去消费。我觉得,现在activemq就是这样的机制。

浙公网安备 33010602011771号