activemq入门基于queue和基于topic的demo

概述:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值