ActiveMQ 点对点发送与接收 都是基于Queue队列的,每条消息只能被一个消费者所消费
点对点模型 用于 消息生产者 和 消息消费者 之间 点到点 的通信。消息生产者将消息发送到由某个名字标识的特定消费者。这个名字实际上对于消费服务中的一个 队列(Queue),在消息传递给消费者之前它被 存储 在这个队列中。队列消息 可以放在 内存 中也可以 持久化,以保证在消息服务出现故障时仍然能够传递消息。
消息生产者
package com.kevin.mq.activemqdemo;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Author kevin
* @Description 消息发送者
* @Date Created on 2019/8/2 15:21
*/
public class Sender {
/**消息服务器的连接地址**/
public static final String BROKER_URL = "tcp://127.0.0.1:61616";
public static void main(String[] args) {
Sender sender = new Sender();
sender.sendMessage("Kevin Hello ActiveMQ.");
}
public void sendMessage (String msg) {
Connection connection = null;
Session session = null;
MessageProducer messageProducer = null;
try {
//1.创建一个连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
//2.创建一个连接
connection = connectionFactory.createConnection();
//3.创建一个Session回话
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//4.创建一个目的地
Destination destination = session.createQueue("kevin.shoudong.queue");
//5.创建一个消息的生产者
messageProducer = session.createProducer(destination);
//6.设置消息是否需要持久化
//messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i=0;i<20;i++){
Message message = session.createTextMessage("kevin "+ i);
message.setIntProperty("Id", i);
//发送消息
messageProducer.send(message);
}
}catch (Exception e){
e.printStackTrace();
} finally {
try{
//关闭连接释放资源
if (null != messageProducer) {
messageProducer.close();
}
if (null != session) {
session.close();
}
if (null != connection) {
connection.close();
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
消费者,
需要一直处于运行状态,监听消息,然后进行消费
package com.kevin.mq.activemqdemo;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* @Author kevin
* @Description 消息的接收者
* @Date Created on 2019/8/2 15:34
*/
public class Receive {
/**消息服务器的连接地址**/
public static final String BROKER_URL = "tcp://127.0.0.1:61616";
public static void main(String[] args) {
Receive receiver = new Receive();
receiver.receiveMessage();
}
/**
* 接收消息
*
*/
public void receiveMessage () {
Connection connection = null;
Session session = null;
MessageConsumer messageConsumer = null;
try{
//1.创建一个连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
//2.创建一个连接
connection = connectionFactory.createConnection();
//3.创建一个Session回话
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//4.创建一个目的地
Destination destination = session.createQueue("kevin.shoudong.queue");
//5.创建一个消费者
//selector即为消息选择器,通过选择需要的标识,过滤消息接受id为10-15之 //间的消息
String selector = "Id >=10 and Id<=15";
messageConsumer = session.createConsumer(destination, selector);
//messageConsumer = session.createConsumer(destination);
//接收消息之前 需要启动连接
connection.start();
while (true){
Message message = messageConsumer.receive();
if (message instanceof TextMessage){
//判断是否是文本消息
String text = ((TextMessage) message).getText();
System.out.println("接收到的消息内容是:" + text);
}else{
System.out.println("接收到的消息内容是 非文本消息" );
}
}
}catch (Exception e){
e.printStackTrace();
} finally {
try{
//关闭连接释放资源
if (null != messageConsumer) {
messageConsumer.close();
}
if (null != session) {
session.close();
}
if (null != connection) {
connection.close();
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}