消息中间件(三) JMS与ActiveMQ入门

JMS

JMS(java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。

JMS本身只定义了一系列的接口规范,是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC(java Database Connectivity):这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ,这只是几个例子。 JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JML 客户机发送消息。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。

JMS 定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。

· TextMessage--一个字符串对象
· MapMessage--一套名称-值对
· ObjectMessage--一个序列化的 Java 对象
· BytesMessage--一个字节的数据流
· StreamMessage -- Java 原始值的数据流

对于消息的传递有两种类型与MQ是一致的

PTP点对点和Pub/Sub发布订阅(广播)

 

ActiveMQ

简介

Apache下的一个子项目。使用Java完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,少量代码就可以高效地实现高级应用场景。可插拔的传输协议支持,比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports。RabbitMQ、ZeroMQ、ActiveMQ均支持常用的多种语言客户端 C++、Java、.Net,、Python、 Php、 Ruby等。

 

安装

下载地址:https://www.ttrar.com/html/150569.html

打开wrapper.exe启动activeMQ

访问 http://localhost:8161/admin/ 用户名密码都是admin,进入管理器

 

入门案例

1、新建maven项目添加依赖

<groupId>org.apache.activemq</groupId>
        <artifactId>activemq-client</artifactId>
        <version>5.13.4</version>
</dependency>

2、点对点模式

PTP点对点:使用queue作为通信载体 

队列生产者

public class QueueProducer {
	 public static void main(String[] args) throws JMSException {
		//1.创建连接工厂
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
		//2.获取连接
		Connection connection = connectionFactory.createConnection();
		//3.启动连接
		connection.start();
		/*4.获取session  (参数1:是否启动事务,
		          参数2:消息确认模式[
		          AUTO_ACKNOWLEDGE = 1    自动确认
		          CLIENT_ACKNOWLEDGE = 2    客户端手动确认   
		          DUPS_OK_ACKNOWLEDGE = 3    自动批量确认
		          SESSION_TRANSACTED = 0    事务提交并确认
		         ])*/
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//5.创建队列对象
		Queue queue = session.createQueue("test-queue");
		//6.创建消息生产者
		MessageProducer producer = session.createProducer(queue);
		//7.创建消息
		TextMessage textMessage = session.createTextMessage("欢迎来到MQ世界!");
		//8.发送消息
		producer.send(textMessage);
		//9.关闭资源
		producer.close();
		session.close();
		connection.close();
	}
}

队列消费者

public class QueueConsumer {
	public static void main(String[] args) throws JMSException, IOException {
		 //1.创建连接工厂
		 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
		 //2.获取连接
	     Connection connection = connectionFactory.createConnection();
	     //3.启动连接
	     connection.start();
	     //4.获取session  (参数1:是否启动事务,参数2:消息确认模式)
	     Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
	     //5.创建队列对象
	     Queue queue = session.createQueue("test-queue");
		 //6.创建消息消费者
	     MessageConsumer consumer = session.createConsumer(queue);
		 //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.等待键盘输入
		 System.in.read();
		 //9.关闭资源
		 consumer.close();
		 session.close();
		 connection.close();
	}
}

 启动一次生产者,查看队列管理

启动一个消费者

查看控制台,成功收到消息队列中的消息消失

生产者发出的消息会存在队列中,直到被某个消费者消费就会消失。

 

发布/订阅模式

Pub/Sub发布订阅(广播):使用topic作为通信载体 

生产者

public class TopicProducer {
	public static void main(String[] args) throws JMSException {
		//1.创建连接工厂
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
		//2.获取连接
		Connection connection = connectionFactory.createConnection();
		//3.启动连接
		connection.start();
		//4.获取session  (参数1:是否启动事务,参数2:消息确认模式)
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//5.创建主题对象
		Topic topic = session.createTopic("test-topic");
		//6.创建消息生产者
		MessageProducer producer = session.createProducer(topic);
		//7.创建消息
		TextMessage textMessage = session.createTextMessage("欢迎来到MQ世界!");
		//8.发送消息
		producer.send(textMessage);
		//9.关闭资源
		producer.close();
		session.close();
		connection.close();
	}
}

消费者

public class TopicConsumer1 {
	public static void main(String[] args) throws JMSException, IOException {
		//1.创建连接工厂
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
		//2.获取连接
		Connection connection = connectionFactory.createConnection();
		//3.启动连接
		connection.start();
		//4.获取session  (参数1:是否启动事务,参数2:消息确认模式)
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//5.创建主题对象
		Topic topic = session.createTopic("test-topic");
		//6.创建消息消费者
		MessageConsumer consumer = session.createConsumer(topic);
		//7.监听消息
		consumer.setMessageListener(new MessageListener() {
			@Override
			public void onMessage(Message message) {
				TextMessage textMessage = (TextMessage) message;
				try {
					System.out.println("消费1--接收到消息:" + textMessage.getText());
				} catch (JMSException e) {
					e.printStackTrace();
				}
			}
		});
		//8.等待键盘输入
		System.in.read();
		//9.关闭资源
		consumer.close();
		session.close();
		connection.close();
	}
}

启动一次生产者,队列中有一个消息

 启动两个消费者,控制的没有接收到数据

启动一次生产者,两个消费者都收到数据

消费次数统计2,队列中仍是两条数据

生产者发出的消息可以被所有消费者消费,消费完以后会一直存在队列里,消费者的出现不会接收到发送过的消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值