消息队列开发记录笔记-ActiveMQ
1.下载ActiveMQ
去官方网站下载:http://activemq.apache.org/
2.运行ActiveMQ
解压缩apache-activemq-5.5.1-bin.zip,然后双击apache-activemq-5.5.1\bin\activemq.bat运行ActiveMQ程序。
3.代码:
需要参数:消息队列IP、端口默认61616,用户名,密码,queue。写在配置文件中。
消费消息代码,项目启动开启一条线程,线程执行以下代码。一直监听消息队列,有数据就消费。
//连接消息队列
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616"); //消息队列的地址
Connection connection = null;
Session session = null;
try {
//根据用户名和密码创建连接消息队列服务器的连接
connection = factory.createConnection("1014", "1014");
connection.start();
//创建客户端确认的会话
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
//确定目标队列
Destination dest = new ActiveMQQueue("skyform.queue.1014");
MessageConsumer consumer = session.createConsumer(dest);
//接受处理消息
while(true){
Message msg = consumer.receive();
if (msg instanceof TextMessage) {
String body = null;
try {
body = ((TextMessage) msg).getText();
//TODO:接受到消息以后的业务处理,业务需求,接收消息后,放到自己的队列里调用下面的sender.供别人消费。
msg.acknowledge();//事物处理
} catch (JMSException e) {
e.printStackTrace();
}
}else{
Throw new RuntimeException(“非法的消息”);
}
}
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (session != null) {
Try{session.close();}catch(Exception e){e. printStackTrace()}
}
if (connection != null) {
Try{ connection.close();}catch(Exception e){e. printStackTrace()}
}
}
发送代码:把消息放到自己的消息队列,供别人消费
// ConnectionFactory :连接工厂,JMS 用它创建连接
ConnectionFactory connectionFactory;
// Connection :JMS 客户端到JMS Provider 的连接
Connection connection = null;
// Session: 一个发送或接收消息的线程
Session session;
// Destination :消息的目的地;消息发送给谁.
Destination destination;
// MessageProducer:消息发送者
MessageProducer producer;
// TextMessage message;
// 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar try { connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 构造从工厂得到连接对象
connection = connectionFactory.createConnection("1072","1072");
// 启动
connection.start();
// 获取操作连接
session = connection.createSession(Boolean.TRUE,
Session.CLIENT_ACKNOWLEDGE);
// 获取session注意参数值xingbo.xu-queue是一个服务器的queue,须在在ActiveMq的console配置
destination = session.createQueue("skyform.queue.1072");
// 得到消息生成者【发送者】
producer = session.createProducer(destination);
// 构造消息,此处写死,项目就是参数,或者方法获取
sendMessage(session, producer); session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection)
connection.close();
} catch (Throwable ignore) {
}
}
}
4.队列情况查看
发送队列通过 http://localhost:8161/admin 可监听队列情况以及发送测试数据,如下图:


5.常见异常
开发中常见的2个异常以及解决方法:
javax.jms.IllegalStateException: The Session is closed
网络异常时客户端会报出这个错误
javax.jms.JMSException: Channel was inactive for too long
服务器消息较长时间没有消息发送时,客户端会报这个错误
可以把连接mq的url修改成下面的样子
failover:(tcp://127.0.0.1:61616?wireFormat.maxInactivityDuration=10000)&maxReconnectDelay=10000
failover 失效备援
maxInactivityDuration 允许最大静止(消息服务器无消息)时间
maxReconnectDelay 最大重连间隔
解决方法参考:http://hi.baidu.com/hontlong/blog/item/d475a916ffc8e65df3de32c8.html
6.安全配置
1、控制台安全配置,打开conf/jetty.xml文件,找到
<bean id="securityConstraint" class="org.eclipse.jetty.http.security.Constraint">
<property name="name" value="BASIC" />
<property name="roles" value="admin" />
<property name="authenticate" value="false" />
</bean>
将“false”改为“true”即可。用户名和密码存放在conf/jetty-realm.properties文件中。
2.连接和消费队列的用户名密码配置
apache-activemq-5.5.1-bin\apache-activemq-5.5.1\conf
credentials.properties文件配置用户名、密码
activemq.username=1091
activemq.password=aL^PbQInrzUUY^m9
activemq.xml文件配置:
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
安全配置参考网站:http://www.cnblogs.com/CopyPaster/archive/2012/04/27/2473179.html
7.ActiveMQ通过JAAS实现的安全机制
参考博客《转载-ActiveMQ通过JAAS实现的安全机制》
消息队列开发记录笔记-ActiveMQ的更多相关文章
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- 消息队列:快速上手ActiveMQ消息队列的JMS方式使用(两种模式:Topic和Queue的消息推送和订阅)
1.实现功能 希望使用一套API,实现两种模式下的消息发送和接收功能,方便业务程序调用 1.发送Topic 2.发送Queue 3.接收Topic 4.接收Queue 2.接口设计 根据功能设计公共调 ...
- [分布式学习]消息队列之rocketmq笔记
文档地址 RocketMQ架构 哔哩哔哩上的视频 mq有很多,近期买了<分布式消息中间件实践>这本书,学习关于mq的相关知识.mq大致有有4个功能: 异步处理.比如业务端需要给用户发送邮件 ...
- NSQ:分布式消息队列学习记录
参考资料: NSQ:分布式的实时消息平台 初识NSQ分布式实时消息架构 深入NSQ之旅 nsq topic和channel的区别
- 消息队列高手课 -笔记-Kafka高性能的几个关键点
总结下kafka 高性能的几个关键点是: 1:使用批量处理的方式 去提升系统的吞吐能力 2:基于磁盘文件高性能的顺序读写的特性来设计存储结构 3:利用操作系统的PageCache 来缓存数据 减少I ...
- java面试记录三:hashmap、hashtable、concurrentHashmap、ArrayList、linkedList、linkedHashmap、Object类的12个成员方法、消息队列MQ的种类
口述题 1.HashMap的原理?(数组+单向链表.put.get.size方法) 非线程安全:(1)hash冲突:多线程某一时刻同时操作hashmap并执行put操作时,可能会产两个key的hash ...
- lesson5:利用jmeter来压测消息队列(activemq)
本文讲述了利用jmeter来压测消息队列,其中消息队列采用apache的activemq,jmeter本身是支持符合jms标准消息队列的压测,由于jmeter的官方sampler配置比较复杂,本文直接 ...
- 【框架学习与探究之消息队列--EasyNetQ(1)】
前言 本文欢迎转载,实属原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7603554.html 废话 既然都是废话了,所以大家就可以跳过了,这里是博主有事没事 ...
- 深入剖析 RabbitMQ —— Spring 框架下实现 AMQP 高级消息队列协议
前言 消息队列在现今数据量超大,并发量超高的系统中是十分常用的.本文将会对现时最常用到的几款消息队列框架 ActiveMQ.RabbitMQ.Kafka 进行分析对比.详细介绍 RabbitMQ 在 ...
随机推荐
- 2011年浙大:Graduate Admission
题目描述: It is said that in 2011, there are about 100 graduate schools ready to proceed over 40,000 app ...
- HDU4825(字典树+贪心)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
- Linux网络工具lsof和netstat
lsof全名为list opened files,即列举系统中已经被打开的文件,基本使用如下: (1) 查看/etc/passwd使用情况 lsof /etc/password (2) 查看监听的so ...
- AngularJS:SQL
ylbtech-AngularJS:SQL 1.返回顶部 1. AngularJS SQL 在前面章节中的代码也可以用于读取数据库中的数据. 使用 PHP 从 MySQL 中获取数据 AngularJ ...
- javascript一些小的注意点
try...catch 可以测试代码中的错误.try 部分包含需要运行的代码,而 catch 部分包含错误发生时运行的代码. 当try { 里面的代码 出现错误了 }catch(e){ 才执行下面的c ...
- PostgreSQL 监控数据库活动
监控数据库活动 1. 标准Unix 工具 [root@mysqlhq ~]# ps auxww | grep ^postgrespostgres 12106 0.0 0.0 340060 15064 ...
- Intellij IDEA 发布后的项目在哪里
Intellij IDEA 中使用 tomcat 并发布项目后,项目并没有出现在在 webapps 文件夹中,如果没有手动修改过部署目录的话,idea的真实部署目录为 File---->Proj ...
- wp8安装SSL证书
把证书打成zip包,wp8的IE能下载并打开ZIP包,然后点击cer文件,就能安装证书了
- C Primer Plus学习笔记(七)- 字符输入/输出和输入验证
单字符 I/O:getchar() 和 putchar() getchar() 和 putchar() 每次只处理一个字符 getchar() 和 putchar() 都不是真正的函数,它们被定义为供 ...
- PHP类(三)-类的封装
设置私有成员 使用private关键字来设置私有成员,完成对成员的封装,封装后的成员在对象的外部不能被访问,如果访问会出现错误,在对象的内部能访问被封装的成员属性和方法. <?php class ...