ActiveMQ笔记之点对点队列(Point-to-Point)
1. 点对点通信
点对点是一种一对一通信方式,更像是有一个队列,一个人往队列里放消息,另一个人从队列中取消息,其最大的特点是一个消息只会被消费一次,即使有多个消费者同时消费,他们消费的也是不同的消息。
2. 简单实现
添加依赖
添加Maven依赖:
<!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-all -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.2</version>
</dependency>
activemq.properties
在resource下创建一个activemq.properties,用来保存activemq的用户名、密码、连接地址等信息:
username = xxx
passwd = xxx
url = tcp://xx.xx.xx.xx:61616
ActiveMqUtils
创建一个工具类,用来获取连接,因为工厂类一般都是比较重量级的类,不应该重复创建:
package org.cc11001100.activemq; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import java.io.IOException;
import java.util.Properties; /**
* @author: CC11001100
* @date: 2017/11/8 18:20
* @email: CC11001100@qq.com
*/
public class ActiveMqUtils { private static ConnectionFactory connectionFactory; static{
try {
Properties properties = new Properties();
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("activemq.properties"));
connectionFactory=new ActiveMQConnectionFactory(properties.getProperty("username"),
properties.getProperty("passwd"),
properties.getProperty("url"));
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 获取JMS连接
*
* @return JMS Connection
*/
public static Connection getConnection(){
try {
return connectionFactory.createConnection();
} catch (JMSException e) {
e.printStackTrace();
}
return null;
} }
SenderUtils
创建发送消息的工具类:
package org.cc11001100.activemq; import javax.jms.*;
import java.util.function.Function; /**
* @author: CC11001100
* @date: 2017/11/8 18:12
* @email: CC11001100@qq.com
*/
public class SenderUtils { /**
* 向指定的队列发送消息
*
* @param queueName 发送到哪个队列
* @param generateMessage 使用这个方法产生要发送的消息
*/
public static void send(String queueName, Function<Session, Message> generateMessage){ Connection conn=null;
Session session=null;
MessageProducer messageProducer=null; try {
conn = ActiveMqUtils.getConnection();
assert conn != null;
conn.start();
session=conn.createSession(true, Session.AUTO_ACKNOWLEDGE); /*队列名是区分大小写的,如果不存在的话会自动创建一个*/
Queue queue=session.createQueue(queueName);
messageProducer=session.createProducer(queue);
/*设置非持久化,持久化的意思是要求发送的时候接收方要在线*/
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT); // 生成消息并发送
Message message = generateMessage.apply(session);
messageProducer.send(message); /*在提交的时候消息才会真正的发出去*/
session.commit();
} catch (JMSException e) {
e.printStackTrace();
}finally{ if(messageProducer!=null){
try {
messageProducer.close();
} catch (JMSException e) {
e.printStackTrace();
}
} if(session!=null){
try {
session.close();
} catch (JMSException e) {
e.printStackTrace();
}
} if(conn!=null){
try {
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
} } } }
注意:在session.commit()之前消息是不会被发送出去的。
ReceiverUtils
创建接收消息的工具类:
package org.cc11001100.activemq; import javax.jms.*;
import java.util.function.Function; /**
* @author: CC11001100
* @date: 2017/11/8 18:37
* @email: CC11001100@qq.com
*/
public class ReceiverUtils { /**
* 从指定队列中接收一个消息
*
* @param queueName 队列名称
* @return 接收到的消息内容
*/
public static Message receive(String queueName){ Connection conn=null;
Session session=null;
MessageConsumer messageConsumer=null; try {
conn=ActiveMqUtils.getConnection();
assert conn != null;
conn.start();
session=conn.createSession(true,Session.AUTO_ACKNOWLEDGE); Queue queue=session.createQueue(queueName);
messageConsumer=session.createConsumer(queue); /*这是一个阻塞式的方法,在接收到消息之前会一直阻塞着*/
Message message=messageConsumer.receive();
session.commit();
return message;
} catch (JMSException e) {
e.printStackTrace();
}finally{ if(messageConsumer!=null){
try {
messageConsumer.close();
} catch (JMSException e) {
e.printStackTrace();
}
} if(session!=null){
try {
session.close();
} catch (JMSException e) {
e.printStackTrace();
}
} if(conn!=null){
try {
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
} } return null;
} /**
* 从指定队列接收一个消息并将它传递给回调方法处理,返回处理后的结果
*
* @param queueName 队列名称
* @param callback 处理消息的回调方法
* @param <T> 处理消息后的返回值
* @return 处理消息后的返回值
*/
public static <T> T receive(String queueName, Function<Message, T> callback){
Message message = receive(queueName);
assert message!=null;
return callback.apply(message);
} }
Main
创建测试类:
package org.cc11001100.activemq; import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; /**
* @author: CC11001100
* @date: 2017/11/8 18:49
* @email: CC11001100@qq.com
*/
public class Main { public static void main(String[] args) { final String QUEUE_NAME = "FOO_QUEUE"; // 生产者
new Thread(()->{ while(true){ try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
} SenderUtils.send(QUEUE_NAME, session -> {
try {
return session.createTextMessage(Long.toString(System.currentTimeMillis()));
} catch (JMSException e) {
e.printStackTrace();
}
return null;
});
} }).start(); // 消费者
new Thread(()->{ while(true){
ReceiverUtils.receive(QUEUE_NAME, message->{
if(message instanceof TextMessage){
try {
TextMessage textMessage = (TextMessage) message;
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
return message;
});
} }).start(); } }
ActiveMQ笔记之点对点队列(Point-to-Point)的更多相关文章
- ActiveMQ笔记(7):如何清理无效的延时消息?
ActiveMQ的延时消息是一个让人又爱又恨的功能,具体使用可参考上篇ActiveMQ笔记(6):消息延时投递,在很多需要消息延时投递的业务场景十分有用,但是也有一个缺陷,在一些大访问量的场景,如果瞬 ...
- php 利用activeMq+stomp实现消息队列
php 利用activeMq+stomp实现消息队列 一.activeMq概述 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J ...
- 实战Spring4+ActiveMQ整合实现消息队列(生产者+消费者)
引言: 最近公司做了一个以信息安全为主的项目,其中有一个业务需求就是,项目定时监控操作用户的行为,对于一些违规操作严重的行为,以发送邮件(ForMail)的形式进行邮件告警,可能是多人,也可能是一个人 ...
- Linux进程间通信IPC学习笔记之消息队列(SVR4)
Linux进程间通信IPC学习笔记之消息队列(SVR4)
- Spring boot 集成ActiveMQ(包含双向队列实现)
集百家之长,成一家之言. 1. 下载ActiveMQ https://mirrors.tuna.tsinghua.edu.cn/apache/activemq/5.15.9/apache-activ ...
- 学习ActiveMQ(二):点对点(队列)模式消息演示
一:介绍 点对点的消息发送方式主要建立在 消息(Message ),队列(Queue),发送者(Sender),消费者(receiver)上,Queue 存贮消息,Sender 发送消息,receiv ...
- ActiveMQ 笔记(二)部署和DEMO(队列、主题)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.部署操作 1. 部署在linux 上的acvtiveMQ 要可以通过前台windows 的页面访问, ...
- ActiveMQ笔记(1):编译、安装、示例代码
一.编译 虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码. 1.1 https://github.com/apache/activemq/r ...
- ActiveMQ_点对点队列(二)
一.本文章包含的内容 1.列举了ActiveMQ中通过Queue方式发送.消费队列的代码(普通文本.json/xml字符串.对象数据) 2.spring+activemq方式 二.配置信息 1 ...
随机推荐
- javascript 常用知识点
1:浏览器是有缓存的,开发中可以通过快捷键绕过缓存 对于Windows驱动的系统:Ctrl + F5 对于Mac驱动的系统:Command + Shift + R. 2:精度问题 (符点和大数字可能会 ...
- PHP创建对象的几种形式
创建对象的几种形式 class C1{ var $p1 = 1; //定义一个属性: } 形式1: $o1 = new C1(); //通过一个类,去new出一个对象 形式2: $o2 = new ...
- Debugger DataSet 调试时查看DataSet
delphi 跟踪调试的时候查看DataSet数据记录 Ctrl+F7调试 增强工具DataSethttp://edn.embarcadero.com/article/40268 http://do ...
- Vue.js checkbox 练习
<div id="app"> <input type=" />足球 <input type=" />篮球 <input ...
- hdu 6435 CSGO(最大曼哈顿距离)
题目链接 Problem Description You are playing CSGO. There are n Main Weapons and m Secondary Weapons in C ...
- 【Java】JAVA-加密-DES加密代码详解
package util; import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; import javax.c ...
- 题解 P1808 【单词分类_NOI导刊2011提高(01)】
大家用的方法都太好了!! 蒟蒻小金羊来发一篇玄学堆排. STL大法好! (附有核心code详解,完整code) 核心:两次排序,第一次自我排序,第二次整体排序. 核心code1: string str ...
- P1039 侦探推理
题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...
- 【BZOJ2432】【NOI2011】兔农(数论,矩阵快速幂)
[BZOJ2432][NOI2011]兔农(数论,矩阵快速幂) 题面 BZOJ 题解 这题\(75\)分就是送的,我什么都不想写. 先手玩一下,发现每次每次出现\(mod\ K=1\)的数之后 把它减 ...
- 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】
题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双 ...