基于Java的消息队列

(一):群发的概念:例如广播的形式,只有在同一时间在同一个频道的人能够收到消息,其他的都不会收到消息

(二):JMS即Java消息服务应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信

(三):组成元素

       a:JMS提供者  连接面向消息中间件的,JMS接口的一个实现,提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器.

       b:JMS客户   生产或消费基于消息的Java的应用程序或对象

       c:JMS生产者/JMS消费者       创建并发送(接收)消息的JMS客户。

       d:JMS消息  包括可以在JMS客户之间传递的数据的对象

       e:JMS队列         一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同                                 一旦一个消息被阅读,该消息将被从队列中移走。

       f:JMS主题    一种支持发送消息给多个订阅者的机制

(四):一张帮助理解的图片

(五):需要用到的jar包有

         <dependency> 
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  		<version>4.11</version>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-jms</artifactId>
  		<version>4.2.4.RELEASE</version>
  	</dependency>
  	<dependency>
  		<groupId>org.apache.activemq</groupId>
  		<artifactId>activemq-all</artifactId>
  		<version>5.11.2</version>
  	</dependency>


(六):两种模式:点对点和广播模式

package com.qf.jms.test;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.junit.Test;

public class Expérimenter {
	/**
	 * 点对点模型
	 */
	// connection用于程序和服务器之间建立连接通信用
	// Destination目标,包含消息发布和目标
	// MessageConsumer消费者
	// MessageProducer生产者
	// Message消息对象
	// Session会话接口,用于接收和发送消息
	/**
	 * 当消息发送完毕,对方接受到以后,会自动将消息删除
	 * 
	 * @throws Exception
	 */
	/**
	 * activemq怎样保证消息不丢失,内部有应答系统,当发送给服务器的时候,一段时间服务器会给发送者一个响应,同理
	 * 当服务器发给接受者的时候也会有一个响应,这样保证了消息的不丢失
	 */
	@Test
	public void Test1() throws Exception {
		// 这是一个发送方
		// 1创建连接
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://10.0.135.131:61616");
		// 2打开连接
		Connection connection = connectionFactory.createConnection();
		connection.start();
		// 3创建会话
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 4创建一个生产者,设置具体发送的内容
		Queue queue = session.createQueue("woyaofaxiaoxi");
		MessageProducer producer = session.createProducer(queue);
		// 5创建一个生产者
		TextMessage textMessage = new ActiveMQTextMessage();
		textMessage.setText("我真的想要发送一个消息给你");
		// 6设置发送的内容
		producer.send(textMessage);
		// 7将内容发送出去
		producer.close();
		session.close();
		connection.close();
		// 8关闭资源
	}

	@Test
	public void Test2() throws Exception {
		// 这是点对点的接收方
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://10.0.135.131:61616");
		Connection connection = connectionFactory.createConnection();
		connection.start();
		// 创建消息是否需要等待对方回复,如果为true,则需要等待对方答复,则程序处于阻塞状态
		// 当设置为true的时候,第二个参数将会失去意义
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		Queue queue = session.createQueue("woyaofaxiaoxi");
		// 发送者发送到服务器的消息,依靠这个参数传送给接收方
		MessageConsumer consumer = session.createConsumer(queue);
		// 设置一个监听器,实现为实现的方法
		consumer.setMessageListener(new MessageListener() {
			@Override
			public void onMessage(Message message) {
				try {
					TextMessage textMessage = (TextMessage) message;
					// 做一个子父类型的强转
					String string = textMessage.getText();
					System.out.println(string);
				} catch (JMSException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		System.in.read();
		// 作用:阻塞程序的结束,可以时刻接收到服务端发送过来的消息
	}

	/**
	 * 这是一种广播模式,多个消费者可以获取消息
	 * 
	 */
	// 注意:广播模式会存在消息的丢失
	@Test
	public void Test3() throws Exception {
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://10.0.135.131:61616");
		Connection connection = connectionFactory.createConnection();
		connection.start();
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		// 创建搬运工.广播模式 发布者/订阅者模式
		Topic topic = session.createTopic("131415");
		MessageProducer producer = session.createProducer(topic);
		TextMessage textMessage = new ActiveMQTextMessage();
		textMessage.setText("这真的是一个广播模式");
		producer.send(textMessage);
		producer.close();
		session.close();
		connection.close();
	}

	@Test
	public void Test4() throws Exception {
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://10.0.135.131:61616");
		Connection connection = connectionFactory.createConnection();
		connection.start();
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		Topic topic = session.createTopic("131415");
		MessageConsumer consumer = session.createConsumer(topic);
		consumer.setMessageListener(new MessageListener() {
			@Override
			public void onMessage(Message message) {
				try {
					TextMessage textMessage = (TextMessage) message;
					String string = textMessage.getText();
					System.out.println(string);
				} catch (JMSException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
		System.in.read();
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值