Java ActiveMQ消息服务案例

Java ActiveMQ消息机制

前言
我很容易健忘,学习一门技术,没几天又要百度查询了,但是我不想这样,所以我要开始写属于自己的博客。将自己学到的技术通过博客来记录。这是我第一次写博客,以后我也会继续写。

今天的内容如下:

  • 消息服务介绍
  • ActiveMQ基于java的实现
  • spring整合ActiveMQ
  • ActiveMQ集群

消息服务
消息服务分为两种:生产者/消费者、发布者/订阅者;

我们的微信就是一个典型的案例。

生产者/消费者:
你跟你的好友发送消息相当于生产者和消费者的模型。你给一个好友发送信息,你就是这条消息的生产者,你的好友就是这条消息的消费者。你是生产者很容易理解,因为这条消息是你生产的。为什么说你的好友是消费者呢。把消息理解为商品,你的好友在没有点击消息之前,也就是还没消费这个商品。它还在架子上,还没有卖出去。当他点击之后,也就是阅读了这条消息,相当于买下了这个商品。
所以从这个例子可以得到生产者/消费者模型的特点:

  • 点对点:你这条消息只能是一个好友接受。你不能给这位好友发送消息,另一个好友也接收到这条消息。
  • 不管有没有消费者,生产者都可以生产商品:相当于不管你好友在不在线,你都可以给你的好友发送消息。

发布者/订阅者:
这个也好理解,相当在微信里你跟公众号的关系,只要你关注了公众号,你都可以看公众号发布的内容,这时你就相当于订阅者了。
这个模型也有特点:

  • 一对多的:只要关注了公众号的好友,都可以接收发布的内容。
  • 接收不到订阅之前的发布的内容。

上面便是消费服务的介绍,下面就开始应用了它吧!

ActiveMQ基于java的实现

首先介绍ActiveMQ是什么先?
ActiveMQ是一个服务器,就像Tomcat服务器一样。在微信里, 不管你好友在不在线,你都可以给好友发送消息。因为你发送的消息是被发送到服务器里,等到你好友上线了,就在发送给他。ActiveMQ就是这样的功能。

下载zip安装包:http://activemq.apache.org/activemq-5154-release.html

下载zip包
解压之后进入根目录:在这里插入图片描述
进入bin目录,根据电脑不同系统进入win64或win32,两种启动方式:
第一个是直接启动:就是启动之后有一个弹窗,不要关闭它,关闭就是关闭服务器了。
第二个是转为服务启动。
在这里插入图片描述
我现在练习是用第一种启动方式。启动之后,打开连接

127.0.0.1:8161

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>
      <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值