前面我们已经搭建和配置好了ActiveMQ,下面来看一个Demo,体验一下MQ。

JMS 消息模型

  JMS消息服务应用程序结构支持两种模型:点对点模型,发布者/订阅者模型。  

  (1)点对点模型(Queue)

    一个生产者向一个特定的队列发布消息,一个消费者从这个队列中依次读取消息。

    模型特点:只有一个消费者获得消息。

  (2)发布者/订阅者模型(Topic)

    0个或多个订阅者可以接受特定主题的消息。

    模型特点:多个消费者可获得消息。

    Topic和Queue的最大区别在于Topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息;而Queue则是以点对点的形式通知多个处于监听状态的客户端中的一个。

JMS消息格式

  • MapMessage -- key-value键值对
  • TextMessage -- 字符串对象
  • ObjcetMessage -- 一个序列化的Java对象
  • ByteMessage -- 一个未解释字节的数据流
  • StreamMessage -- Java原始值的数据流

点对点模型Demo

public class Constants {

    public static final String MQ_NAME = "parry";

    public static final String MQ_PASSWORD = "parry123";

    public static final String MQ_BROKETURL = "tcp://192.168.56.129:61616";
}
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; import com.parry.demo.constant.Constants; /**
*
* <p>
* MSProduct 点对点模型-消息生产者
* <p>
*/
public class MSProduct { public static void main(String[] args) {
// 连接工厂
ConnectionFactory factory;
// 连接实例
Connection connection = null;
// 收发的线程实例
Session session;
// 消息发送目标地址
Destination destination;
// 消息创建者
MessageProducer messageProducer;
try {
factory = new ActiveMQConnectionFactory(Constants.MQ_NAME, Constants.MQ_PASSWORD,
Constants.MQ_BROKETURL);
// 获取连接实例
connection = factory.createConnection();
// 启动连接
connection.start();
// 创建接收或发送的线程实例(创建session的时候定义是否要启用事务,且事务类型是Auto_ACKNOWLEDGE也就是消费者成功在Listern中获得消息返回时,会话自动确定用户收到消息)
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// 创建队列(返回一个消息目的地)
destination = session.createQueue("parryQuene");
// 创建消息生产者
messageProducer = session.createProducer(destination);
// 创建TextMessage消息实体
TextMessage message = session.createTextMessage("我是parry,这是我的第一个消息!");
messageProducer.send(message);
session.commit();
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; import com.parry.demo.constant.Constants;
/**
* <p>
* MQConsumer 点对点--消息消费者
* <p>
*/
public class MQConsumer { public static void main(String[] args) {
// 连接工厂
ConnectionFactory connectionFactory;
// 连接实例
Connection connection = null;
// 收发的线程实例
Session session;
// 消息发送目标地址
Destination destination;
try {
// 实例化连接工厂
connectionFactory = new ActiveMQConnectionFactory(Constants.MQ_NAME, Constants.MQ_PASSWORD, Constants.MQ_BROKETURL);
// 获取连接实例
connection = connectionFactory.createConnection();
// 启动连接
connection.start();
// 创建接收或发送的线程实例(消费者就不需要开启事务了)
session = connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);
// 创建队列(返回一个消息目的地)
destination = session.createQueue("parryQuene");
// 创建消息消费者
MessageConsumer consumer = session.createConsumer(destination);
//注册消息监听
consumer.setMessageListener(new MQListerner());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* <p>
* MQListerner 生产者监听器
* <p>
*/
public class MQListerner implements MessageListener{ @Override
public void onMessage(Message message) {
try {
System.out.println(((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}

发布者/订阅者模型Demo

  (1)发布者

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; import com.parry.demo.constant.Constants; /**
* <p>
* MQProducer 订阅消息的发送者
* <p>
*/
public class MQProducer { public static void main(String[] args) {
// 连接工厂
ConnectionFactory factory;
// 连接实例
Connection connection = null;
// 收发的线程实例
Session session;
// 消息发送目标地址
Destination destination; try {
// 实例化连接工厂
factory = new ActiveMQConnectionFactory(Constants.MQ_NAME, Constants.MQ_PASSWORD, Constants.MQ_BROKETURL);
// 获取连接实例
connection = factory.createConnection();
// 启动连接
connection.start();
// 创建接收或发送的线程实例(创建session的时候定义是否要启用事务,且事务类型是Auto_ACKNOWLEDGE也就是消费者成功在Listern中获得消息返回时,会话自动确定用户收到消息)
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// 创建队列(返回一个消息目的地)
destination = session.createTopic("parryTopic");
// 创建消息发布者
MessageProducer producer = session.createProducer(destination);
// 创建TextMessage消息
TextMessage message = session.createTextMessage("你好,这是我发布的第一条消息!");
// 发布消息
producer.send(message);
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}

  (2)订阅者01

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; import com.parry.demo.constant.Constants; /**
* <p>
* MQCousumer01 订阅-发布模式 订阅者01
* <p>
*/
public class MQCousumer01 { public static void main(String[] args) {
// 连接工厂
ConnectionFactory factory;
// 连接实例
Connection connection = null;
// 收发的线程实例
Session session;
// 消息发送目标地址
Destination destination;
try {
// 实例化连接工厂
factory = new ActiveMQConnectionFactory(Constants.MQ_NAME, Constants.MQ_PASSWORD, Constants.MQ_BROKETURL);
// 获取连接实例
connection = factory.createConnection();
// 启动连接
connection.start();
// 创建接收或发送的线程实例
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 创建队列(返回一个消息目的地)
destination = session.createTopic("parryTopic");
// 创建消息订阅者
MessageConsumer consumer = session.createConsumer(destination);
// 消息发布者添加监听器
consumer.setMessageListener(new Listerner01());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* <p>
* Listerner01 订阅者01的监听器
* <p>
*/
public class Listerner01 implements MessageListener{ @Override
public void onMessage(Message message) {
try {
System.out.println("订阅者01接收到消息:" + ((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}

  (3)订阅者02

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; import com.parry.demo.constant.Constants; /**
* <p>
* MQCousumer02 订阅-发布模式 订阅者02
* <p>
*/
public class MQCousumer02 { public static void main(String[] args) {
// 连接工厂
ConnectionFactory factory;
// 连接实例
Connection connection = null;
// 收发的线程实例
Session session;
// 消息发送目标地址
Destination destination;
try {
// 实例化连接工厂
factory = new ActiveMQConnectionFactory(Constants.MQ_NAME, Constants.MQ_PASSWORD, Constants.MQ_BROKETURL);
// 获取连接实例
connection = factory.createConnection();
// 启动连接
connection.start();
// 创建接收或发送的线程实例
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 创建队列(返回一个消息目的地)
destination = session.createTopic("parryTopic");
// 创建消息订阅者
MessageConsumer consumer = session.createConsumer(destination);
// 消息发布者添加监听器
consumer.setMessageListener(new Listerner02());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* <p>
* Listerner02 订阅者02的监听器
* <p>
*/
public class Listerner02 implements MessageListener{ @Override
public void onMessage(Message message) {
try {
System.out.println("订阅者02接收到消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}

ActiveMQ入门实例Demo的更多相关文章

  1. ActiveMQ介绍和ActiveMQ入门实例

    ActiveMQ百度百科   ActiveMQ入门实例-cnblogs.com      作者用的是5.5的版本,我测试时用的是5.6,按照作者说的整了一下,走得通

  2. ActiveMQ入门实例

    1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip,然后双击a ...

  3. java 消息机制 ActiveMQ入门实例

    1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 我下载的时候是 ActiveMQ 5.14.0 Release版 2.运行ActiveMQ 解压缩ap ...

  4. .Net平台下ActiveMQ入门实例

    1.ActiveMQ简介 先分析这么一个场景:当我们在网站上购物时,必须经过,下订单.发票创建.付款处理.订单履行.航运等.但是,当用户下单后,立即跳转到“感谢那您的订单” 页面.不仅如此,若果没有延 ...

  5. ActiveMQ入门实例(转)

    1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip,然后双击a ...

  6. .Net平台下ActiveMQ入门实例(转)

    1.ActiveMQ简介 先分析这么一个场景:当我们在网站上购物时,必须经过,下订单.发票创建.付款处理.订单履行.航运等.但是,当用户下单后,立即跳转到"感谢那您的订单" 页面. ...

  7. 转发 .Net平台下ActiveMQ入门实例 https://www.cnblogs.com/madyina/p/4121458.html

    1.ActiveMQ简介 先分析这么一个场景:当我们在网站上购物时,必须经过,下订单.发票创建.付款处理.订单履行.航运等.但是,当用户下单后,立即跳转到“感谢那您的订单” 页面.不仅如此,若果没有延 ...

  8. Java消息机制 ActiveMQ入门实例

    转载自:http://www.cnblogs.com/wyh3721/p/5917316.html 1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/  ...

  9. ActiveMQ入门实例(转)

    转载自:http://www.cnblogs.com/xwdreamer/archive/2012/02/21/2360818.html 1.下载ActiveMQ 去官方网站下载:http://act ...

随机推荐

  1. C# - 计时器Timer

    System.Timers.Timer 服务器计时器,允许指定在应用程序中引发事件的重复时间间隔. using System.Timers: // 在应用程序中生成定期事件 public class ...

  2. Linux服务器技术收集

    如何说服运维选择 Debian/Ubuntu 而不是 CentOS? 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS? HHVM 是如何提升 PHP 性能的?

  3. MySQL5.7 error log时间显示问题

    最近有两三套环境升级到了5.7.16,发现mysql.err中的时间好像有些问题,经查是mysql 5.7后的变更,如下: root@localhost [(none)]>select now( ...

  4. 关于Three.js基本几何形状之SphereGeometry球体学习

    一.有关球体SphereGeometry构造函数参数说明 <1>.SphereGeometry(radius, widthSegments, heightSegments, phiStar ...

  5. Win7(x64)升级到Win10

    北京时间7月29日零点起,微软正式开始向包含中国在内的全球用户推送Windows 10正式版安装包,Win7.Win8正版用户从29日零点起就可以免费升级到Win 10. 如果你的C盘里边有“$Win ...

  6. Windows编译Nginx源码

    Windows下的Nginx战役,人不作就不会死!就像是拿着麦当劳的优惠券去买肯德基一样,别扭啊 Nginx是一款轻量级的Web 服务器.反向代理服务器.邮件服务器等等集一大串荣誉于一身的大牌人物!他 ...

  7. 在Ubuntu和Linux Mint上安装Oracle JDK

    在Ubuntu和Linux Mint上安装Oracle JDK 使用下面的命令安装,只需一些时间,它就会下载许多的文件,所及你要确保你的网络环境良好: sudo add-apt-repository ...

  8. 【代码笔记】iOS-获得富文本设置以后的文字高度

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  9. 一个URL的物理文件的体现

    场景 许多同学在开发过程中经常会遇到一个问题,怎么去定义一个url?以及定义一个url之后怎么根据一个url定义文件. 公司组织一次内部培训,为了把这次培训的内容以博客的形式共享出来. URL与文件的 ...

  10. 使用beautifulsoup与requests爬取数据

    1.安装需要的库 bs4 beautifulSoup  requests lxml如果使用mongodb存取数据,安装一下pymongo插件 2.常见问题 1> lxml安装问题 如果遇到lxm ...