概述:
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。(这句话引用百度的,哈哈)
背景:
- 1、采用Maven工程
- 2、jdk 1.8 (它要求是jdk1.7以上)
1、下载activemq
官方网址:下载activemq, window下载
apache-activemq-5.15.0-bin.zip |
2、启动activemq 服务器
解压下载包,找到 你解压的目录\apache-activemq-5.15.0\bin
输入cmd回车就行,进入dos窗口,输入
activemq start (双击activemq.bat好像起不来)
3、进入后台添加消息队列(Queue)(等会消息就会发送这里)
后台地址: http://127.0.0.1:8161/admin/
会弹出用户和密码框,两个框都输入admin就行。(初始密码)
服务器起来,开始写代码
4、首先引入jar(pom.xml)
<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.jack</groupId>
<artifactId>ActiveMQ</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ActiveMQDemo</name>
<description>学习activeMq</description>
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.0</version>
</dependency>
</dependencies>
</project>
总结:这里采用一个总包,其实activemq分成很多部分,入门嘛简单就好。
接收者:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 接受消息
* @author Administrator
*
*/
public class Receiver {
public static void main(String[] args){
//connectionFactory:连接工厂,JMS用创建连接
ConnectionFactory connectionFactory;
//Connection:JMS客户端到JMSProvider的连接
Connection connection = null;
//SEssion:一个发送或接收消息的会话
Session session;
//Destination:消息目的地,消息发送给谁
Destination destination;
//消费者,消息接受者
MessageConsumer consumer;
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616"
);
try {
//从工厂得到连接对象
connection = connectionFactory.createConnection();
//启动
connection.start();
//获取操作连接
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//获取session注意参数firstQueue是在console进行配置的
destination = session.createQueue("firstQueue");
consumer = session.createConsumer(destination);
while (true) {
//设置接收者接受消息的时间,设置100s
TextMessage message = (TextMessage) consumer.receive(100000);
if(null != message){
System.out.println("收到消息" + message.getText());
}else {
break;
}
}
} catch (JMSException e) {
e.printStackTrace();
} finally {
try{
if (null != connection) {
connection.close();
}
}catch (Throwable e){
}
}
}
}
创建Session时 有两个重要的参数,第一个boolean类型的参数用来表示是否采用事务消息。如果是消息是事务的,对应的参数设置为true,此时消息的提交自动有commit处理,消息的回滚则自动由rollback处理。如果不是事务设置为false第二参数 :
- Session.AUTO_ACKNOWLEGE 表示Session会自动确认所接收到的消息,
- Session.Client_ACKNOWLEDGE 表示由客户端程序通过调用消息的确认方法来确认所接收的消息。
- Session.DUPS_OK_ACKNOWLEDGE 延迟确认,导致消息重复投递。
消费者:
package com.jack;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 发送
* @author Administrator
*
*/
public class Sender {
private static final int SEND_NUMBER = 5;
public static void main(String[] args) {
//ConnectionFactory:连接工厂,JMS用它创建连接
ConnectionFactory connectionFactory;
//Connetcion : JMS 客户端到JMS Provider 的连接
Connection connection = null;
//Session :一个发送或接收消息的线程
Session session;
//Destination:消息的目的地;消息发送给谁
Destination destination;
//MessageProducer : 消息发送者
MessageProducer producer;
//TextMessageProducer producer;
//构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,
"tcp://localhost:61616");
try {
//构造从工厂得到连接对象
connection = connectionFactory.createConnection();
//启动
connection.start();
//获取操作连接
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//获取session注意参数值firstQueue在console配置
destination = session.createQueue("firstQueue");
//消息生成者(发送者)
producer = session.createProducer(destination);
//不持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//构造消息
sendMessage(session, producer);
session.commit();
} catch (JMSException e) {
e.printStackTrace();
}finally{
try {
if(null != connection){
connection.close();
}
}catch(Throwable e) {
}
}
}
private static void sendMessage(Session session, MessageProducer producer) throws JMSException {
for (int i=1; i<=SEND_NUMBER; i++) {
TextMessage message = session.createTextMessage("ActiveMq发送消息:" + i);
//发送消息到目的地方
System.out.println("发送消息:" + "ActiveMq发送的消息" + i);
producer.send(message);
}
}
}
5、启动测试
先启动接收者,后启动发送者(是不是类似socket通讯)
日志如下:
6、大致流程图
7、基于topic (多用于广播)
首先创建topic
修改代码:try{} 中的代码
注意:修改topic变量为 Topic topic
发送者 :注意创建session 第一个参数为false,那么session.commit()去掉。因为不是事务提交
//构造从工厂得到连接对象
connection = connectionFactory.createConnection();
//启动
connection.start();
//获取操作连接
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//获取session注意参数值firstTopic在console配置
topic = session.createTopic("firstTopic");
//消息生成者(发送者)
producer = session.createProducer(topic);
//不持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//构造消息
sendMessage(session, producer);
//从工厂得到连接对象
connection = connectionFactory.createConnection();
//启动
connection.start();
//获取操作连接
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//获取session注意参数firstTopic是在console进行配置的
topic = session.createTopic("firstTopic");
consumer = session.createConsumer(topic);
while (true) {
//设置接收者接受消息的时间,设置100s
TextMessage message = (TextMessage) consumer.receive(100000);
if(null != message){
System.out.println("收到消息" + message.getText());
}else {
break;
}
}
结果和queue是一样的。
参考引用:
http://www.cnblogs.com/xwdreamer/archive/2012/02/21/2360818.html