ActiveQq的代码实现
]从java代码开始再过渡到springboot
Java代码的实现
1.activemq这个消息中间件有两种形式
1. p2p(生产者,消费者)
特点:
生产者:
package com.lqh; import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue; import javax.jms.*; public class p2ppub {
public static void main(String[] args) throws Exception {
// 创建连接工厂
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.91.111:61616");
// 创建连接
Connection connection = factory.createConnection();
// 创建会话 第一个参数就是指是否开启session事务如果开启了,需要手动提交session.commit
// Session.AUTO_ACKNOWLEDGE 这个代表自动回执就是接收到消息后向对列应答成功
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建生产者(指明消息队列的名字)
Destination destination = new ActiveMQQueue("152-queue1");
MessageProducer producer = session.createProducer(destination);
// 创建消息 使用会话创建
TextMessage textMessage = session.createTextMessage("hello-152");
// 生产者发布消息
producer.send(textMessage);
// 提交
// session.commit();
// 关闭资源
connection.close();
session.close();
producer.close();
} }
消费者:
package com.lqh; import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue; import javax.jms.*; public class p2psub {
// 消费者
public static void main(String[] args) throws JMSException {
// 创建连接工厂
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.91.111:61616");
// 创建连接
Connection connection = factory.createConnection();
// 启动连接
connection.start();
// 创建会话 是否开启事务 开启自动回执
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建消费者 指定消费者的队列名字
Destination destination = new ActiveMQQueue("152-queue1");
MessageConsumer consumer = session.createConsumer(destination); // 消费者获取到消息
TextMessage receive = (TextMessage) consumer.receive();
System.out.println(receive); // 事务提交
// session.commit();
// 资源释放
connection.close();
consumer.close();
session.close(); }
}
2. 发布与订阅
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
pub 发布
package com.lqh; import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue; import javax.jms.*; public class p2ppub {
public static void main(String[] args) throws Exception {
// 创建连接工厂
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.91.111:61616");
// 创建连接
Connection connection = factory.createConnection();
// 创建会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建生产者(指明消息队列的名字)
Destination destination = new ActiveMQQueue("152-queue1");
MessageProducer producer = session.createProducer(destination);
// 创建消息 使用会话创建
TextMessage textMessage = session.createTextMessage("hello-152");
// 生产者发布消息
producer.send(textMessage);
// 提交
// session.commit();
// 关闭资源
connection.close();
session.close();
producer.close();
} }
sub 订阅
package com.lqh; import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue; import javax.jms.*; public class p2psub {
// 消费者
public static void main(String[] args) throws JMSException {
// 创建连接工厂
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.91.111:61616");
// 创建连接
Connection connection = factory.createConnection();
// 启动连接
connection.start();
// 创建会话 是否开启事务 开启自动回执
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建消费者 指定消费者的队列名字
Destination destination = new ActiveMQQueue("152-queue1");
MessageConsumer consumer = session.createConsumer(destination); // 消费者获取到消息
TextMessage receive = (TextMessage) consumer.receive();
System.out.println(receive); // 事务提交
// session.commit();
// 资源释放
connection.close();
consumer.close();
session.close(); }
}
这个订阅与发布是需要先启动订阅者,再启动发布者这样消息才会发布出来然后程序才会截止。也就是pub/sub的特点
为了解决这个问题就采用了持久化 订阅者的持久化
package com.lqh; import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTopic; import javax.jms.*; public class DureableSub {
public static void main(String[] args) throws JMSException {
// 创建一个连接工厂
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.91.111:61616");
// 2从工厂获取一个连接
Connection connection = factory.createConnection();
connection.setClientID("clinet111"); //给连接起一个名字随便起 (为一个标识id)
connection.start();
// 3根据连接创建一个会话
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 4.根据会话去创建一个可持久化订阅
ActiveMQTopic destination=new ActiveMQTopic("151-Topic");
// 可持久化订阅 给当前消费者起一个id 这个id可以随便起
TopicSubscriber consumer = session.createDurableSubscriber((Topic) destination, "anyname");
// 5.接收消息。
TextMessage message = (TextMessage) consumer.receive();
String text = message.getText();
System.out.println(text); connection.close();
session.close();
consumer.close();
}
}
为了使持久化生效需要先启动一次订阅者,和发布者做一个连接告诉activemq我当前是一个可持久化的订阅者 ,以后将这个信息保存起来为持久化之前topic的信息是不保存的,有订阅者将这个信息推出去没有就将这个信息删除了
例如:没有持久化前 只是启动分布者信息发布后没有订阅者,就会将信息删除
持久化后,即使没有订阅者消息发布后会将消息保存起来当消费者一启动就会将信息发布回来。
p2p中消费者需要访问才能消费
解决方法---监听器
使用springboot集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
<version>2.1.5.RELEASE</version>
</dependency>
server.port=8989
spring.activemq.broker-url=tcp://192.168.91.111:61616
p2p 代码
package com.example.controller; import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage; @RestController
public class TestSubController {
@Autowired
JmsTemplate jmsTemplate; @RequestMapping("send")
public void sendMsg(){
// 指定消息队列的名字
ActiveMQQueue destination = new ActiveMQQueue("151-Topic");
jmsTemplate.convertAndSend(destination,"hello");
}
// 监听器当151-Topic消息队列发生了改变就会调用当前方法
@JmsListener(destination = "151-Topic")
public void receive(Message message) throws JMSException {
TextMessage textMessage= (TextMessage) message;
System.out.println(textMessage.getText());
}
}
发布和订阅
package com.example.controller; import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage; @RestController
public class TestPubSubController {
@Autowired
private JmsTemplate jmsTemplate; @RequestMapping("pub")
public String pub(String msg){
ActiveMQTopic destination = new ActiveMQTopic("boot-topic");
jmsTemplate.convertAndSend(destination,msg);
return "publish success";
} @RequestMapping("sub")
public String sub(){
ActiveMQTopic destination = new ActiveMQTopic("boot-topic");
Object o = jmsTemplate.receiveAndConvert(destination);
String s = o.toString();
return s;
}
@JmsListener(destination = "boot-topic",containerFactory = "defaultJmsListenerContainerFactory")
public void receive(Message message) throws JMSException {
TextMessage textMessage= (TextMessage) message;
System.out.println(textMessage.getText());
}
}
因为springboot集成了activemq但是并没有实现持久化所以需要自定义持久化
package com.example.conf; import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory; @Configuration
public class KeepSubConf {
@Bean
public DefaultJmsListenerContainerFactory defaultJmsListenerContainerFactory(){
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(activeMQConnectionFactory());
factory.setClientId("client01");
factory.setSubscriptionDurable(true);
return factory;
} public ActiveMQConnectionFactory activeMQConnectionFactory(){
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.121.126:61616"); return factory;
} }
///
ActiveQq的代码实现的更多相关文章
- 日期格式代码出现两次的错误 ORA-01810
错误的原因是使用了两次MM . 一.Oracle中使用to_date()时格式化日期需要注意格式码 如:select to_date('2005-01-01 11:11:21','yyyy-MM-dd ...
- 可爱的豆子——使用Beans思想让Python代码更易维护
title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- redux-amrc:用更少的代码发起异步 action
很多人说 Redux 代码多,开发效率低.其实 Redux 是可以灵活使用以及拓展的,经过充分定制的 Redux 其实写不了几行代码.今天先介绍一个很好用的 Redux 拓展-- redux-amrc ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序
直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运 ...
- jsp前端实现分页代码
前端需要订一page类包装,其参数为 private Integer pageSize=10; //每页记录条数=10 private Integer totalCount; //总记录条数 priv ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
随机推荐
- C# prism 框架 MVVM框架 Prism系列之事件聚合器
网址:https://www.cnblogs.com/ryzen/p/12610249.html 本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 ...
- C#多线程---Event类实现线程同步
一.简介 我们使用类(.net Framework中的类,如 AutoResetEvent, Semaphore类等)的方法来实现线程同步的时候,其实内部是调用操作系统的内核对象来实现的线程同步. S ...
- 深入浅出Mybatis系列(四)---配置详解之properties与environments
我先简单的给大家示例一下properties的使用方法. <configuration> <!-- 方法一: 从外部指定properties配置文件, 除了使用resource属性指 ...
- Mac Ideal 常用快捷键
智能提示 ⌘ -> command ⇧ -> shift ⌥ -> option -> 上箭头 -> 下箭头 ⌃ -> Control mac的option键 = ...
- 客户机与服务器TCP连接状态
客户机:
- 对集合使用Comparator
1 import java.util.Comparator; 2 import java.util.PriorityQueue; 3 4 /** 5 * 对集合使用Comparator,不改变对象的自 ...
- MySQL5.7.24 安装
官网地址 https://dev.mysql.com/downloads/mysql/ 1. 安装依赖 yum install -y cmake make gcc gcc-c++ libaio ncu ...
- Sublime Text 快速分别独立选中多行
效果图 直接上代码 import sublime, sublime_plugin # 独立选择每一行(在当前选中范围内) class SelectEverySingleLine(sublime_plu ...
- Python之psutil-进程管理
在给PC端应用做自动化测试或者监测应用性能时,不可避免的会与进程管理打交道,python中的psutil模块能够帮助我们处理进程,它主要用于系统监视.分析和限制进程资源以及管理正在运行的进程.一起来了 ...
- 移动端ios上下滑动翻页事件失效
移动端开发过程中,在添加上下滑动事件时候,引入了最常用的移动端库zepto.js及其touch模块,有一种现象,安卓的手机没有问题,上下滑动翻页很正常 :但是到了ios上面,好啊,上下滑动会出现弹性滚 ...