Java消息服务 —ActiveMQ实战

1.JMS—Java消息服务

Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS消息服务的规范包含两种消息模式

  • 点对点
  • 发布者/订阅者

常用的消息中间件

  • ActiveMQ
  • kafka
  • RabbitMQ
  • RocketMQ

JMS API

  • ConnectionFactory
  • Connection
  • Session
  • Destination
    目标是一个包装了消息目标标识符的被管对象,消息目标是指消息发布和接收的地点,或者是队列,或者是主题
  • MessageConsumer
    由会话创建的对象,用于接收发送到目标的消息
  • MessageProducer
    由会话创建的对象,用于发送消息到目标
  • Message
    是在消费者和生产者之间传送的对象,也就是说从一个应用程序创送到另一个应用程序

消息的类型

  • StreamMessage
    Java原始数据流
  • MapMessage
    键值对
  • TextMessage
    字符串对象
  • ObjectMessage
    序列化对象
  • ByteMessage
    字节数据流

2.windows环境下载安装ActiveMQ

• 下载 http://activemq.apache.org/download.html
• 解压文件夹,双击 home/bin/winXX/wrapper.exe 进行启动
• 浏览器中访问 http://localhost:8161
• 管理员账号和密码为 admin / admin

下载界面

apache-activemq-5.15.2解压后的文件

bin存放的是脚本文件
conf存放的是基本配置文件
data存放的是日志文件
docs存放的是说明文档
examples存放的是简单的实例
lib存放的是activemq所需jar包
webapps用于存放项目的目录

ActiveMQ默认启动时,启动了内置的jetty服务器,提供一个用于监控ActiveMQ的admin应用。 双击 home/bin/winXX/wrapper.exe 进行启动:


启动ActiveMQ

浏览器中访问 http://localhost:8161

image.png

管理员账号和密码为 admin / admin进行登录:
image.png

到这里为止,ActiveMQ 服务端就启动完毕了。

3.创建JMS-ActiveMQ工程

添加maven依赖:


maven依赖

3.1点对点消息

在点对点或队列模型下,一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。这种模式被概括为:
• 只有一个消费者将获得消息
• 生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。
• 每一个成功处理的消息都由接收者签收

点对点消息

①创建消息生产者

    public void producer() throws JMSException {
        //1.创建ConnectionFactory  连接工厂
        String brokerUrl = "tcp://localhost:61616";
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl);
        //2.创建Connection 连接对象
        Connection connection = connectionFactory.createConnection();
        //开启连接
        connection.start();
        //3.创建Session事务管理,通过参数设置事务级别
        Session session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
        //4.创建Destination 目的地对象
        Destination destination = session.createQueue("text-Message");
        //5.创建消息的生产者
        MessageProducer messageProducer = session.createProducer(destination);
        //6.创建一条消息
        TextMessage textMessage = session.createTextMessage("测试-消息生产者");
        //7.发送消息
        messageProducer.send(textMessage);
        //提交事务
        session.commit();
        //8.释放资源
        messageProducer.close();
        session.close();
        connection.close();
    }

②创建消息消费者

    public void consumer() throws JMSException, IOException {
        //1.创建ConnectionFactory
        String brokerUrl = "tcp://localhost:61616";
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl);
        //2.创建Connection
        Connection connection = connectionFactory.createConnection();
        connection.start();
        //3.创建Session
        Session session = connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
        //4.创建Destination 目的地对象
        Destination destination = session.createQueue("text-Message");
        //5.创建消费者
        MessageConsumer messageConsumer = session.createConsumer(destination);
        //6.消费消息,监听队列中的消息,若有新消息,会执行onMessage方法
        messageConsumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println("消息:" + textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        //避免单元测试停止
        System.in.read();
        //7.释放资源
        messageConsumer.close();
        session.close();
        connection.close();
    }

③运行ActiveMQ项目
生产者运行结果:

生产者

消费者运行结果:
消费者

3.2发布/订阅 消息

发布者/订阅者模型支持向一个特定的消息主题发布消息。0或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式被概括为:
• 多个消费者可以获得消息
• 在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息。

发布/订阅 消息

消息发布者:

//1.  创建连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
//2.  创建连接 并 开启
Connection connection = connectionFactory.createConnection();
connection.start();
//3.  创建 Session
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//4.  创建 Topic 对象
Topic topic = session.createTopic("weixin-Topic");
//5.  创建生产者
MessageProducer producer = session.createProducer(topic);
//6.  发送消息
TextMessage textMessage = session.createTextMessage("Hello,Topic MQ");
producer.send(textMessage);
//7.  释放资源
producer.close();
session.close();
connection.close();

消息订阅者:

        //1.  创建连接工厂
        ConnectionFactory connectionFactory = new
                ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_BROKER_URL);
        //2.  创建并启动连接
        Connection connection = connectionFactory.createConnection();
        connection.start();
        //3.  创建 Session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //4.  创建目的地对象
        Topic topic = session.createTopic("weixin-Topic");
        //5.  创建消费者
        MessageConsumer consumer = session.createConsumer(topic);
        //6.  获取消息
        consumer.setMessageListener(new MessageListener() {
            @Override
            public void onMessage(Message message) {
                TextMessage textMessage = (TextMessage) message;
                try {
                    System.out.println(textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        System.in.read();
        //7.  释放资源
        consumer.close();
        session.close();
        connection.close();
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容