Java ActiveMQ消息机制
前言
我很容易健忘,学习一门技术,没几天又要百度查询了,但是我不想这样,所以我要开始写属于自己的博客。将自己学到的技术通过博客来记录。这是我第一次写博客,以后我也会继续写。
今天的内容如下:
- 消息服务介绍
- ActiveMQ基于java的实现
- spring整合ActiveMQ
- ActiveMQ集群
消息服务
消息服务分为两种:生产者/消费者、发布者/订阅者;
我们的微信就是一个典型的案例。
生产者/消费者:
你跟你的好友发送消息相当于生产者和消费者的模型。你给一个好友发送信息,你就是这条消息的生产者,你的好友就是这条消息的消费者。你是生产者很容易理解,因为这条消息是你生产的。为什么说你的好友是消费者呢。把消息理解为商品,你的好友在没有点击消息之前,也就是还没消费这个商品。它还在架子上,还没有卖出去。当他点击之后,也就是阅读了这条消息,相当于买下了这个商品。
所以从这个例子可以得到生产者/消费者模型的特点:
- 点对点:你这条消息只能是一个好友接受。你不能给这位好友发送消息,另一个好友也接收到这条消息。
- 不管有没有消费者,生产者都可以生产商品:相当于不管你好友在不在线,你都可以给你的好友发送消息。
发布者/订阅者:
这个也好理解,相当在微信里你跟公众号的关系,只要你关注了公众号,你都可以看公众号发布的内容,这时你就相当于订阅者了。
这个模型也有特点:
- 一对多的:只要关注了公众号的好友,都可以接收发布的内容。
- 接收不到订阅之前的发布的内容。
上面便是消费服务的介绍,下面就开始应用了它吧!
ActiveMQ基于java的实现
首先介绍ActiveMQ是什么先?
ActiveMQ是一个服务器,就像Tomcat服务器一样。在微信里, 不管你好友在不在线,你都可以给好友发送消息。因为你发送的消息是被发送到服务器里,等到你好友上线了,就在发送给他。ActiveMQ就是这样的功能。
下载zip安装包:http://activemq.apache.org/activemq-5154-release.html

解压之后进入根目录:
进入bin目录,根据电脑不同系统进入win64或win32,两种启动方式:
第一个是直接启动:就是启动之后有一个弹窗,不要关闭它,关闭就是关闭服务器了。
第二个是转为服务启动。

我现在练习是用第一种启动方式。启动之后,打开连接
8161是这个服务器的默认端口。
进去之后点击指示的连接:


登录:账户密码都是默认的:admin
登录成功:

这时候服务已经开启了。下面是编写java的了。
如果你建立普通的java项目,那你要导入activemq-all-5.15.4.jar
这个包在下载的ActiveMQ根目录有。
如果你是maven项目的话,在pom.xml加上依赖:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.9.0</version>
</dependency>
先讲解这个activemq-all-5.15.4.jar包的主要接口吧,这里我用一下其他博友的图片,他总结的太好了。

然后就是开始写java代码了:
现在先讲生产者/消费者模型:
首先建立一个生产者produce类
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Produec
{
//生产者将消息发送到服务器的连接。
private static final String ACTIVEMQ_URL="tcp://127.0.0.1:61616";
//队列的名字,你发送消息到这个队列里,你好友从这个对列拿到消息。
private static final String QUEUE_NAME="FISTMQ";
public static void main( String[] args ) throws Exception
{
//创建连接工厂类,参数为连接的链接
ActiveMQConnectionFactory connFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
//由连接工厂创建一个连接
Connection conn = connFactory.createConnection();
conn.start();
//由连接conn创建一个会话,
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
//由会话创建一个目的地。就是消息发送到的队列
Destination destination = session.createQueue(QUEUE_NAME);
//由会话创建一个生产者。
MessageProducer produce = session.createProducer(destination);
//发送十条消息。
for(int i = 0; i < 10; i++) {
TextMessage message = session.createTextMessage("App发送了message:"+i);
produce.send(message);
System.out.println("我发送了message:"+i);
}
conn.close();
}
}
你运行一下,然后刷新就刚刚登陆那个页面刷新一下

这里我翻译成中文了,这样好看点,你就点击第二个【队列】,就可以看到你发送的消息条数了,由于我还没启动消费者,所以这些消息都在排队。
下面我们编写消费者:跟生产者差不多,不过消费者没有发送消息,它设置了一个监听器,监听生产者发送的消息。
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Customer {
private static final String ACTIVEMQ_URL = "tcp://127.0.0.1:61616";
private static final String QUEUE_NAME = "FISTMQ";
public static void main(String[] args) throws Exception {
ActiveMQConnectionFactory connFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
Connection conn = connFactory.createConnection();
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue(QUEUE_NAME);
//由会话创建一个消费者
MessageConsumer consumer = session.createConsumer(destination);
//消费者设置一个消息监听器。
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMssage = (TextMessage) message;
try {
System.out.println("来自" + message.getJMSDestination() + "的消息:" + textMssage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
写完运行一下:控制台是这样的。

然后你刷新网页:

待处理消息对垒变为0了,
如果你有两个消费者会怎么样呢。
你先运行两次消费者,建立两个消费者,
然后运行生产者。
其中一个消费者是这样(偶数):

另一个消费者(奇数):

然后你刷新网页看看:

消费者数量已经变为2了。
下面讲的是ActiveMQ整合spring:
生产者/消费者
这里我使用的是maven项目,新建一个maven项目,配置pom.xm
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.intell</groupId>
<artifactId>ActiveMQ</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>ActiveMQ</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.2.5.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.activemq</</

本文介绍了Java中ActiveMQ消息服务的使用,包括消息服务的基本概念、ActiveMQ的Java实现、Spring整合ActiveMQ以及ActiveMQ集群的配置。通过实例展示了生产者/消费者模型和发布/订阅者模型,并详细说明了如何配置ActiveMQ集群以实现高可用性和负载均衡。
最低0.47元/天 解锁文章
8万+

被折叠的 条评论
为什么被折叠?



