回顾往期项目,梳理下以前用到的东西,ActiveMq篇。
ActiveMq是什么?
个人理解,avtive是目前网上说的很多的"消息中间件",可以用来操作两个系统的数据交互(类似接口)。tomcat,weblogic 等为中间件,中间件为非操作系统,非业务应用软件,不是最终给客户使用的。 两者要区分开。
1.使用场景。
之前在税务行业工作时,最开始用的是webservice接口与神码公司进行数据交互,当时正值金三上线时期,双方测试环境经常性重启,造成数据缺失。后面在数据库里面跑了个job,定时检索未发送成功的数据,然后再次发送,因为金三库是个大库,许多纳税人白天去税务大厅办事,所以这个job一直放在晚上执行,但是很快发现了第二个问题,数据延迟性。后面跟对方讨论了下,废弃了该方案,用mq进行替换。
2.ActiveMq的使用。
(1)搭建步骤:
tar.gz解压指令是:tar -zxvf filename.tar.gz,这个百度上随便搜
B: 解压后进入主文件的bin目录 执行 ./ativemq start 启动 ActiveMQ
C: 浏览器输入 启动服务器的 IP:8161进入web页面,点击 Manage ActiveMQ broker可以查看消息推送的状态,默认账户、密码为:admin,admin。
(2)错误排查:
ActiveMq也与tomcat、weblogic一样有错误信息,错误日志存在于 /root/apache-mq/data 有个叫 activemq.log的日志文件,里面会列出如端口占用等报错信息。
(3)使用步骤:
点对点方式:
①.配置文件中引入依赖:
org.apache.activemq activemq-all 5.9.0
②.生产者类:
/** * @Description 生产者 * @Date 2099/12/24 * @Created by dcj */ public class MyProducer { //定义ActivMQ的连接地址 private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616"; public static void main(String[] args) throws JMSException { // 创建连接工厂 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); // 创建连接 Connection connection = activeMQConnectionFactory.createConnection(); // 打开连接 connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据 Destination destination = session.createQueue("myQueue"); // 创建一个生产者 MessageProducer producer = session.createProducer(destination); // 向队列推送10个文本消息数据 for (int i = 1 ; i <= 10 ; i++){ // 创建文本消息 TextMessage message = session.createTextMessage("第" + i + "个文本消息"); //发送消息 producer.send(message); //在本地打印消息 System.out.println("已发送的消息:" + message.getText()); } //关闭连接 connection.close(); } }
运行结果:
已发送的消息:第1个文本消息
已发送的消息:第2个文本消息
已发送的消息:第3个文本消息
已发送的消息:第4个文本消息
已发送的消息:第5个文本消息
已发送的消息:第6个文本消息
已发送的消息:第7个文本消息
已发送的消息:第8个文本消息
已发送的消息:第9个文本消息
已发送的消息:第10个文本消息
③.此时可以在web端查看是否有10条消息等待消费
④.消费者类:
/** * @Description 消费者类 * @Date 2099/12/24 * @Created by dcj */ public class MyConsumer {
//MQ链接地址 private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616"; public static void main(String[] args) throws JMSException { // 创建连接工厂 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); // 创建连接 Connection connection = activeMQConnectionFactory.createConnection(); // 打开连接 connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据 Destination destination = session.createQueue("myQueue"); // 创建消费者 MessageConsumer consumer = session.createConsumer(destination); // 创建消费的监听 consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { TextMessage textMessage = (TextMessage) message; try { System.out.println("消费的消息:" + textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); } }
测试结果:
消费的消息:第1个文本消息
消费的消息:第2个文本消息
消费的消息:第3个文本消息
消费的消息:第4个文本消息
消费的消息:第5个文本消息
消费的消息:第6个文本消息
消费的消息:第7个文本消息
消费的消息:第8个文本消息
消费的消息:第9个文本消息
消费的消息:第10个文本消息
订阅模式
①.订阅模式的生产者
/** * @Description 基于发布/订阅模式传输类型的生产者 * @Date 2099/12/24 * @Created by dcj */ public class MyProducerForTopic { //mq地址 private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616"; public static void main(String[] args) throws JMSException { // 创建连接工厂 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); // 创建连接 Connection connection = activeMQConnectionFactory.createConnection(); // 打开连接 connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据 Destination destination = session.createTopic("topicTest"); // 创建一个生产者 MessageProducer producer = session.createProducer(destination); // 向队列推送10个文本消息数据 for (int i = 1 ; i <= 10 ; i++){ // 创建文本消息 TextMessage message = session.createTextMessage("第" + i + "个文本消息"); //发送消息 producer.send(message); //在本地打印消息 System.out.println("已发送的消息:" + message.getText()); } //关闭连接 connection.close(); } }
②.订阅模式的消费者
/** * @Description 基于发布/订阅模式传输类型的消费者测试 * @Date 2099/12/24 * @Created by dcj */ public class MyConsumerForTopic { private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616"; public static void main(String[] args) throws JMSException { // 创建连接工厂 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); // 创建连接 Connection connection = activeMQConnectionFactory.createConnection(); // 打开连接 connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列目标,并标识队列名称,消费者根据队列名称接收数据 Destination destination = session.createTopic("topicTest"); // 创建消费者 MessageConsumer consumer = session.createConsumer(destination); // 创建消费的监听 consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { TextMessage textMessage = (TextMessage) message; try { System.out.println("消费的消息:" + textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); } }
点对点模式与订阅者模式最大的区别就是,订阅模式中的消费者无法获取到启动前生产者生产的数据。 即:生产者先开,消费者后开,消费者无法接收生产者之前的数据。