ActiveMQ入门


ActiveMQ是JMS规范的一种实现

ActiveMQ的消息形式

Java消息服务应用程序结构支持两种模型:

1.点对点模型(基于队列)

每个消息只能有一个消费者。消息的生产者和消费者之间没有时间上的相关性。可以由多个发送者,但只能被一个消费者消费。

  • 一个消息只能被一个接受者接受一次
  • 生产者把消息发送到队列中(Queue),这个队列可以理解为电视机频道(channel)
  • 在这个消息中间件上有多个这样的channel
  • 接受者无需订阅,当接受者未接受到消息时就会处于阻塞状态

2. 发布者/订阅者模型(基于主题的)

每个消息可以有多个消费者。生产者和消费者之间有时间上的相关性。订阅一个主题的消费者只能消费自它订阅之后发布的消息。

  • 允许多个接受者,类似于广播的方式
  • 生产者将消息发送到主题上(Topic)
  • 接受者必须先订阅

注:持久化订阅者:特殊的消费者,告诉主题,我一直订阅着,即使网络断开,消息服务器也记住所有持久化订阅者,如果有新消息,也会知道必定有人回来消费。

关于持久化订阅者和持久化消息的概念

JMS公共接口

JMS 公共 点对点域 发布/订阅域
ConnectionFactory QueueConnectionFactory TopicConnectionFactory
Connection QueueConnection TopicConnection
Destination Queue Topic
Session QueueSession TopicSession
MessageProducer QueueSender TopicPublisher
MessageConsumer QueueReceiver TopicSubscriber
  • ConnectionFactory:连接工厂是客户用来创建连接的对象,例如ActiveMQ提供的ActiveMQConnectionFactory。
  • Connection:JMS Connection封装了JMS 客户端到JMS Provider 的连接与JMS提供者之间的一个虚拟的连接。
  • Destination:消息的目的地,是用来指定生产的消息的目标和它消费的消息的来源的对象。
  • Session: JMS Session是生产和消费消息的一个单线程上下文。会话用于创建消息的生产者(producer),消费者(consumer),消息(message)等,会话,是一个事务性的上下文。消息的生产和消费不能包含在同一个事务中。
  • MessageProducer:由Session 对象创建的用来发送消息的对象
  • MessageConsumer:由Session 对象创建的用来发送消息的对象

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

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

ActiveMQ安装启动访问

安装

  • 主机安装JDK
  • ActiveMQ部署在一个Jetty容器中直接解压即可

进入apache-activemq-5.12.0/bin

  • 启动:./activemq start
  • 关闭:./activemq stop
  • 查看:./activemq status

访问Broker

  • http://IP:8161/admin
  • 输入 用户:admin,密码:admin

503错误解决,把主机名添加到hosts中

ActiveMQ的使用

添加pom依赖

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-all</artifactId>
    <version>5.11.2</version>
</dependency>

点对点Queue

生产者Producer

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

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

public class QueueProducerTest {
   

	@Test
	public void testQueueProducer() throws Exception {
   
		// 1. 创建连接工厂对象ConnectionFactory,需要指定ip及端口号
		// 参数brokerURL即服务器的ip加端口号
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
				"tcp://192.168.110.129:61616");
		// 2. 使用ConnectionFactory对象创建connection对象
		Connection connection = connectionFactory.createConnection();
		
		// 3. 开启连接
		connection.start();
		
		// 4. 创建Session对象
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		
		// 5. 使用Session创建一个Destination对象,此处创建Queue即队列
		Queue queue = session.createQueue("test-queue");
		
		// 6. 创建一个Producer
		MessageProducer messageProducer = session.createProducer(queue);
		
		// 7.创建一个Message对象
		TextMessage textMessage = session.createTextMessage("This is my first point to point queue message!");
		
		// 8.使用Producer发送消息
		messageProducer.send(textMessage);
		
		// 9.关闭资源
		messageProducer.close();
		session.close();
		connection.close();
	}
}

消费者Consumer

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.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

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

public class QueueComsumerTest {
   

	@Test
	public void testQueueComsumer() throws Exception {
   
		// 1.创建连接工厂ConnectionFactory
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
				"tcp://192.168.110.129:61616");
		// 2.创建连接
		Connection connection = connectionFactory.createConnection();
		
		// 3.启动
		connection.start();
		
		// 4.创建session
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		
		// 5.创建destination,注意名称要与生产端一致
		Queue queue = session.createQueue("test-queue");
		
		// 6.创建消费者
		MessageConsumer comsumer = session.createConsumer(queue);
		
		// 7.接受消息,这里是对某一个Destination做监听,即test-queue
		comsumer.setMessageListener(new MessageListener() {
   
			
			@Override
			public void onMessage(Message message) {
   
				
				if(message instanceof TextMessage) {
   
					TextMessage text = (TextMessage) message;
					try {
   
						String myMsg = text.getText();
						// 8.打印消息This is my first point to point queue message!
						System.out.println(myMsg);
					} catch (JMSException e) {
   
						e.printStackTrace();
					}
				}
				
			}
			
		});
		
		// 9.等待键盘输入,不让进程退出
		System.in.read();
		
		// 10.关闭资源
		comsumer.close();
		session.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值