博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ActiveMQ--发送消息到队列、从队列接收消息
阅读量:2445 次
发布时间:2019-05-10

本文共 5342 字,大约阅读时间需要 17 分钟。

JMS编码总体架构

在这里插入图片描述

Destincation

  • 在点对点的消息传递域中,目的地被称为队列(queue)。
  • 在发布/订阅消息传递域中,目的地被称为朱琪(topic)。
    在这里插入图片描述

在这里插入图片描述

案例

发送方编码

package pres.zhang.activemq;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;public class JmsProduce {
public static final String ACTIVEMQ_URL = "tcp://localhost:61616"; public static final String QUEUE_NAME = "queue01"; public static void main(String[] args) throws JMSException {
//1.创建连接工厂,按照给定的url地址,采用默认用户名和密码 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); //2.通过连接工厂,获得连接connection,并启动访问 Connection connection = activeMQConnectionFactory.createConnection(); connection.start(); //3.创建回话session //两个参数 1.事务 2.签收 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4.创建目的地(具体是队列还是主题topic) Queue queue = session.createQueue(QUEUE_NAME); //创建消息的生产者 MessageProducer messageProducer = session.createProducer(queue); //通过使用messageProducer生产3条消息发送到MQ的队列里面 for (int i = 0; i < 3; i++) {
//7.创建消息 TextMessage textMessage = session.createTextMessage("msg---" + i);//可以理解为字符串 //8.通过messageProducer发送给MQ messageProducer.send(textMessage); } //9.关闭资源 messageProducer.close(); session.close(); connection.close();; System.out.println("消息发布到MQ完成!"); }}

运行代码,然后访问localhost:8161:

在这里插入图片描述
在这里插入图片描述

控制台的说明:

在这里插入图片描述

接收方消息编码

在这里插入图片描述

package pres.zhang.activemq;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;public class JmsConsumer {
public static final String ACTIVEMQ_URL = "tcp://localhost:61616"; public static final String QUEUE_NAME = "queue01"; public static void main(String[] args) throws JMSException {
//1.创建连接工厂,按照给定的url地址,采用默认用户名和密码 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); //2.通过连接工厂,获得连接connection,并启动访问 Connection connection = activeMQConnectionFactory.createConnection(); connection.start(); //3.创建回话session //两个参数 1.事务 2.签收 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4.创建目的地(具体是队列还是主题topic) Queue queue = session.createQueue(QUEUE_NAME); //5.创建消费者 MessageConsumer messageConsumer = session.createConsumer(queue); while(true){
TextMessage textMessage = (TextMessage) messageConsumer.receive(); if(textMessage != null){
System.out.println("*****消费者接收到消息:" + textMessage.getText()); }else{
break; } } messageConsumer.close(); session.close(); connection.close(); }}

运行程序,输出:

*****消费者接收到消息:msg---0*****消费者接收到消息:msg---1*****消费者接收到消息:msg---2*****消费者接收到消息:msg---0*****消费者接收到消息:msg---1*****消费者接收到消息:msg---2

控制台:

在这里插入图片描述

第一中接收方式:receive()方法

  • 无参:阻塞式,如果没有收到消息就一直等待。
  • long类型参数(毫秒):超时等待,等待指定的时间仍然没有收到消息则自动释放。

第二种接收方式:监听

package pres.zhang.activemq;import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;import javax.xml.soap.Text;import java.io.IOException;public class JmsConsumer {
public static final String ACTIVEMQ_URL = "tcp://localhost:61616"; public static final String QUEUE_NAME = "queue01"; public static void main(String[] args) throws JMSException, IOException {
//1.创建连接工厂,按照给定的url地址,采用默认用户名和密码 ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL); //2.通过连接工厂,获得连接connection,并启动访问 Connection connection = activeMQConnectionFactory.createConnection(); connection.start(); //3.创建回话session //两个参数 1.事务 2.签收 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //4.创建目的地(具体是队列还是主题topic) Queue queue = session.createQueue(QUEUE_NAME); //5.创建消费者 MessageConsumer messageConsumer = session.createConsumer(queue); //第一种方式:receive() // while(true){
// TextMessage textMessage = (TextMessage) messageConsumer.receive(); // if(textMessage != null){
// System.out.println("*****消费者接收到消息:" + textMessage.getText()); // }else{
// break; // } // } // messageConsumer.close(); // session.close(); // connection.close(); //第二中方式:监听 messageConsumer.setMessageListener(new MessageListener() {
@Override public void onMessage(Message message) {
if(message != null && message instanceof TextMessage){
TextMessage textMessage = (TextMessage) message; try {
System.out.println("监听器接收消息:" + textMessage.getText()); } catch (JMSException e) {
e.printStackTrace(); } } } }); //保证控制台运行 System.in.read(); messageConsumer.close(); session.close(); connection.close(); }}

运行输出:

监听器接收消息:msg---0监听器接收消息:msg---1监听器接收消息:msg---2

在这里插入图片描述

消费者3大消费情况

  1. 先生产: 只启动1号消费者。问题:1号消费者能消费吗?

    可以

  2. 先生产:先启动1号消费者再启动2号消费者。问题:2号消费者还能消费消息吗?

    1号可以,2号没有,都被一号消费了。

  3. 先启动两个消费者,再生产6条消息。问题,消费情况如何?

    1号消费者:第1,3,5条消息。2号消费者:第2,4,6条。类似轮询。

转载地址:http://hypqb.baihongyu.com/

你可能感兴趣的文章
如何从Windows 10开始菜单上的最常用列表中删除项目
查看>>
quicktime ogv_Windows的QuickTime已死,应卸载以确保安全
查看>>
ios表情符号_如何使用iOS系统表情符号替换Facebook Messenger中的表情符号
查看>>
canary版本_如何设置Canary家庭安全摄像机
查看>>
如何在Android TV上侧面加载应用
查看>>
vlc ts 流 选择节目_如何查看哪些服务为流提供电影或节目
查看>>
smart 200密码忘记_如何阻止某些Android应用与Smart Lock同步密码
查看>>
在基于Ubuntu或Debian的Linux系统上安装KeePass Password Safe
查看>>
windows隐藏文件夹_在Windows中隐藏或密码保护文件夹的最佳方法
查看>>
macos 虚拟镜像文件_如何在macOS中使用虚拟文件测试网络或硬盘速度
查看>>
FAT32,exFAT和NTFS有什么区别?
查看>>
扔旧被子扔掉霉运_您应该扔掉所有高科技产品盒吗?
查看>>
cardboard下载_如何在Android上设置Google Cardboard
查看>>
如何在充电时阻止Nintendo Switch接管电视
查看>>
assistant字体_如何自定义您的Google Assistant每日简报
查看>>
失物招领php_我的Mac上“失物招领”文件夹中的大型iNode文件是什么?
查看>>
safari隐私模式_如何优化Safari以获得最大的隐私
查看>>
mozilla rhnio_如何优化Mozilla Firefox以获得最大的隐私
查看>>
macos减少磁盘写入_如何减少macOS Finder的吸附
查看>>
vim macos_如何在Linux(或macOS)上使用Vim密码保护文本文件
查看>>