一:介绍

  点对点的消息发送方式主要建立在 消息(Message ),队列(Queue),发送者(Sender),消费者(receiver)上,Queue 存贮消息,Sender 发送消息,receive接收消息.具体点就是Sender Client通过Queue发送message ,而 receiver Client从Queue中接收消息。消息发送客户端与接收客户端没有时间上的依赖,发送客户端可以在任何时刻发送信息到Queue,而不需要知道接收客户端是不是在运行。
  二:通过jms编码接口之间的关系,流程如下:

  1.创建连接Connection
  2.创建会话Session
  3.通过Session来创建其它的(MessageProducer、MessageConsumer、Destination、TextMessage)
  4.将生产者 MessageProducer 和消费者 MessageConsumer 都会指向目标 Destination
  5.生产者向目标发送TextMessage消息send()
  6.消费者设置监听器,监听消息。

  三:创建实例

  1.打开IDEA,创建一个ActiveMQ的maven项目,如下图:

  2.自己新创建两个java文件,appConsumer消费者类和appProducer生产者类,项目结构如下图:

  3.生产者代码如下:

 package com.liu.jms;

 import org.apache.activemq.ActiveMQConnectionFactory;

 import javax.jms.*;

 public class appProducer {

     private static final String url = "tcp://127.0.0.1:61616";//actvemq的服务器tcp连接方式
private static final String queueName = "queue-test";//定义队列的名称 public static void main(String[] args) throws JMSException {
//1.创建connectionFactory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
//2.创建connection
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建destination
Destination destination = session.createQueue(queueName);
//6.创建生产者
MessageProducer producer = session.createProducer(destination); for (int i = 0; i < 100; i++) { TextMessage textMessage = session.createTextMessage("test" + i);
//7.发送消息
producer.send(textMessage); System.out.println("发送消息" + textMessage.getText()); }
//8.关闭连接
connection.close();
}
}

  如代码所示,通过tcp方式连接了服务端,(别忘了启动服务端的服务)。链接的具体参数可以参考http://activemq.apache.org/connection-configuration-uri.html

然后创建了一个生产者,这个生产者绑定了一个以名为queueName的队列为目的源,代表着这个生产者的消息会发到这个消息队列上面去。然后通过for循环发送了一百个消息。

  4.消费者代码如下:

package com.liu.jms;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class appConsumer {

    private static final String url = "tcp://127.0.0.1:61616";
private static final String queueName = "queue-test"; public static void main(String[] args) throws JMSException {
//1.创建connectionFactory
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
//2.创建connection
Connection connection = connectionFactory.createConnection();
//3.启动连接
connection.start();
//4.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.创建destination
Destination destination = session.createQueue(queueName);
//6.创建消费者
MessageConsumer consumer = session.createConsumer(destination);
//7.创建一个监听器
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();
}
}
});
//8.关闭连接(监听器是异步的还没有监听到消息的时候,就关闭连接了)
//connection.close();
}
}

  如代码所示:消费者和生产者不同的是,消费需要建立一个监听器,来监听以名为queueName的队列上是否有了消息,有消息就会接受,然后通过onMessage方法对消息进行处理。

  5.测试

  首先启动消费者这个java类,观察控制台,如下图:

  接着启动生产者的java类,观察控制台,如下图:生产了一百条消息。

  此时切换至消费的控制台,观察控制台,如下图:已经打印出了一百条消息了,说明消费者已经接受到全部一百条消息。

  6.打开activemq的控制台查看Queues:(http://127.0.0.1:8161/admin/queues.jsp)如下图所示:队列有一个名字是我们设置的queue-test,消费者也有一个就是我们创建的那个消费者类,队列中有一百条消息,被移除了一百条,也就是上面所说的,消费者接收到了这100条全部的消息。

  7.那么我启动了两个相同目标队列的消费者呢?重新测试一下看看,为方便看清结果,重启一下服务。然后运行两遍消费者,idea控制台如下图:有两个消费者,且都没有收到消息。

  8.启动生产者,如下图:生产了一百条信息。

  9.看看两个消费者的控制台,如下两张图:其中一个消费接收到的全是奇数的消息,而另一个接收到的都是偶数的消息。

  

  10.看看activemq控制台,如下图,消费者确实是两个。

  11.得出结论:当有点对点模式下,两个消费者消费的消息之和是生产者产生的消息总数,且每一个消息都只会被一个消费者接收,不会出现两个消费者接收同一消息的情况。

这一篇通过这个简单的小demo我们已经实现了点对点的通信方式,并了解它的特性。下一篇将会学习订阅发布模式。

学习ActiveMQ(二):点对点(队列)模式消息演示的更多相关文章

  1. RabbitMQ学习系列二-C#代码发送消息

    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...

  2. Spring整合ActiveMQ,实现队列主题消息生产消费

    1.引入依赖 pom.xml 1 <!-- activemq --> 2 <dependency> 3 <groupId>org.springframework&l ...

  3. ActiveMQ (二)—发布订阅模式

    ActiveMQ的另一种模式就SUB/HUB即发布订阅模式,是SUB/hub就是一拖N的USB分线器的意思.意思就是一个来源分到N个出口.还是上节的例子,当一个订单产生后,后台N个系统需要联动,但有一 ...

  4. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  5. vim学习(二)之模式

    vim模式 基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode). 命令模式: 用户刚刚启 ...

  6. ActiveMQ基本详解与总结& 消息队列-推/拉模式学习 & ActiveMQ及JMS学习

    转自:https://www.cnblogs.com/Survivalist/p/8094069.html ActiveMQ基本详解与总结 基本使用可以参考https://www.cnblogs.co ...

  7. 消息队列-推/拉模式学习 & ActiveMQ及JMS学习

    一种分类是推和拉 . 还有一种分类是 Queue 和 Pub/Sub . 先看的这一篇:http://blog.csdn.net/heyutao007/article/details/50131089 ...

  8. RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列

    一.理论: .net环境下,C#代码调用RabbitMQ消息队列,本文用easynetq开源的.net Rabbitmq api来实现. EasyNetQ 是一个易于使用的RabbitMQ的.Net客 ...

  9. ActiveMQ_点对点队列(二)

      一.本文章包含的内容 1.列举了ActiveMQ中通过Queue方式发送.消费队列的代码(普通文本.json/xml字符串.对象数据) 2.spring+activemq方式   二.配置信息 1 ...

随机推荐

  1. pt-online-schema-change VS oak-online-alter-table【转】

    前言 在上篇文章中提到了MySQL 5.6 Online DDL,如果是MySQL 5.5的版本在DDL方面是要付出代价的,虽然已经有了Fast index Creation,但是在添加字段还是会锁表 ...

  2. C++设计模式——组合模式

    问题描述 上图,是一个公司的组织结构图,总部下面有多个子公司,同时总部也有各个部门,子公司下面有多个部门.如果对这样的公司开发一个OA系统,作为程序员的你,如何设计这个OA系统呢?先不说如何设计实现, ...

  3. 038_nginx backlog配置

    一. backlog=number sets the backlog parameter in the listen() call that limits the maximum length for ...

  4. 【原创】运维基础之yum离线环境安装软件

    首先查看系统版本号,然后根据版本号从 CentOS-7-x86_64-DVD-1708.iso 和 CentOS-7-x86_64-Everything-1708.iso 根据需要选择一个下载,我这里 ...

  5. jdbc连接sqlserver,mysql,oracle

    class xxx{ private static String port = "1433"; private static String ip = "192.168.2 ...

  6. 使用DBMS_SHARED_POOL包将对象固定到共享池

    使用DBMS_SHARED_POOL包将对象固定到共享池2011年06月24日 09:45:00 Leshami 阅读数:5808 版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处. htt ...

  7. 在vue-cli3 中import引入一个没有export default{}的js文件

    如果这个js文夹,放在vue-cli3中搭建的项目中的,public文件夹下,通过 //.js可以省略不行 import '/public/xxx.js' 其实你在浏览器中看的时候,发现会报错误 :  ...

  8. 微信支付现金红包接口应用实例代码说明和DEMO详解,适合用来做微信红包营销活动、吸粉利器

      本文详细介绍微信红包开发的接口,商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,领取到红包后,用户的资金直接进入微信零钱.后面带有具体调用php实例   总结一下:需要注意的是PEM秘 ...

  9. Mysql的性能优化

    1.参考书籍:MYSQL 5.5从零开始学 Mysql性能优化就算通过合理安排资源,调整系统参数使MYSQL运行更快,更节省资源.MYSQL性能优化包括查询速度优化,更新速度优化,mysql服务器优化 ...

  10. Intervals 差分约束

    题意:给定n个区间[Li,Ri]以及n个整数vi. 现在要有一个集合,使得这个集合和任意[Li,Ri]都有 至少 vi个元素相同. 问这个集合最少要几个元素. 定义S(x) 表示[1,x]中选择的元素 ...