ActiveMQ的配置与使用
1.什么是ActiveMQ
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。
JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。消息是 JMS 中的一种类型对象,由两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带着应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象 (ObjectMessage)、属性集合 (MapMessage)、字节流 (BytesMessage)、原始值流 (StreamMessage),还有无有效负载的消息。
JMS和MQ的关系:JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
2.ActiveMQ与Spring的集成
首先将ActiveMQ如下的jar包导入项目中。
配置activemq的spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
<!--(嵌入配置)activeMq消息容器-->
<amq:broker useJmx="true" persistent="true" >
<amq:managementContext>
<amq:managementContext createConnector="false"/>
</amq:managementContext>
<amq:persistenceAdapter>
<amq:kahaDB directory="${jmsDir}" >
</amq:kahaDB>
</amq:persistenceAdapter>
<amq:transportConnectors>
<amq:transportConnector uri="tcp://${jms.ip}:${jms.port}" />
</amq:transportConnectors>
</amq:broker> <!-- wireFormat.maxInactivityDuration=0& --> <bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="vm://${jms.ip}?jms.useAsyncSend=true" />
</bean> <bean id="simpleJmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory"/>
<property name="sessionCacheSize" value="100" />
<property name="cacheConsumers" value="true"></property>
<property name="exceptionListener" ref="jmsExceptionListener"/>
</bean> <bean id="jmsExceptionListener" class="com.ibms.core.jms.JmsExceptionListener"></bean> <!-- Message 转换器 -->
<bean id="activeMqMessageConverter" class="com.ibms.core.jms.ActiveMqMessageConverter"/> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="simpleJmsConnectionFactory" />
<property name="defaultDestinationName" value="messageQueue"/>
</bean> <!-- 消息对象队列 -->
<amq:queue id="messageQueue" name="messageQueue" physicalName="messageQueue" />
<!-- 消息生产者 -->
<bean id="messageProducer" class="com.ibms.core.jms.MessageProducer"/> <!--
消息消费者
map配置的是队列中消息处理类。
键:队列中消息类 对应的类 全路径 如: com.ibms.core.model.MailModel
值:消息处理类,需要实现接口类IJmsHandler 。如:com.ibms.oa.service.jms.impl.MailHandler
用户也可以配置自己的处理方式,配置到这里。
--> <bean name="messageConsumer" class="com.ibms.core.jms.MessageConsumer">
<property name="handlers">
<map>
<entry key="com.ibms.oa.service.jms.MessageModel">
<bean class="com.ibms.oa.service.jms.MessageHandler"></bean>
</entry>
</map>
</property>
</bean> <!--
map配置的是队列中消息处理类。
键:1,2,3
值:消息处理类,需要实现接口类IMessageHandler 。
用户也可以配置自己的处理方式,配置到这里。
每增加一种消息方式的时候,需要增加对应的处理器(如下,如mailMessageHandler实现IMessageHandler 接口)--> <bean id="mailMessageHandler" class="com.ibms.oa.service.jms.MailMessageHandler"></bean>
<bean id="innerMessageHandler" class="com.ibms.oa.service.jms.InnerMessageHandler"></bean> <bean id="messageHandlerContainer " class="com.ibms.oa.service.jms.MessageHandlerContainer">
<property name="handlersMap" ref="handlersMap"/>
</bean> <bean id="handlersMap" class="java.util.LinkedHashMap">
<constructor-arg>
<map>
<entry key="1" value-ref="mailMessageHandler" />
<entry key="3" value-ref="innerMessageHandler" />
</map>
</constructor-arg>
</bean> <!--消息监听容器 -->
<bean id="messageListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="simpleJmsConnectionFactory" />
<property name="destination" ref="messageQueue" />
<property name="messageListener" ref="messageMsgListener" />
</bean> <!-- 邮件消息消费监听器 -->
<bean id="messageMsgListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<constructor-arg>
<ref bean="messageConsumer"/>
</constructor-arg>
<property name="messageConverter" ref="activeMqMessageConverter" />
<property name="defaultListenerMethod" value="sendMessage" />
</bean> <bean id="messageEngine" class="com.ibms.core.engine.MessageEngine">
<property name="mailSender" ref="mailSender"/>
<property name="fromUser" value="${mail.from}"/>
</bean> </beans>
然后依次实现消息的转换器ActiveMqMessageConverter
public class ActiveMqMessageConverter implements MessageConverter { /**
* 转换发送消息。
*/
@Override
public Message toMessage(Object object, Session session)
throws JMSException { } /**
* 转换接收消息。
*/
@Override
public Object fromMessage(Message msg) throws JMSException { } }
消息的生产者MessageProducer
public class MessageProducer
{
private static final Log logger=LogFactory.getLog(MessageProducer.class);
@Resource(name="messageQueue")
private Queue messageQueue; @Resource
private JmsTemplate jmsTemplate; public void send(Object model)
{
logger.debug("procduce the message");
//产生邮件\短信\消息发送的消息,加到消息队列中去 jmsTemplate.convertAndSend(messageQueue, model);
}
}
消息的消费者MessageConsumer(可扩展)
/**
* 从消息队列中读取对象,并且进行消息发送。
*
* @author zxh
*
*/
public class MessageConsumer { /**
* 处理消息
*/
private Map<String, IJmsHandler> handlers = new HashMap<String, IJmsHandler>(); protected Logger logger = LoggerFactory.getLogger(MessageConsumer.class);
public void setHandlers(Map<String, IJmsHandler> handlers) {
this.handlers = handlers;
} /**
* 发送消息
*
* @param model
* 发送的对象
* @throws Exception
*/
public void sendMessage(Object model) throws Exception {
if (BeanUtils.isNotEmpty(handlers) && BeanUtils.isNotEmpty(model)) {
IJmsHandler jmsHandler = handlers.get(model.getClass().getName());
if(jmsHandler!=null){
jmsHandler.handMessage(model);
}
else{
logger.info(model.toString());
}
} else {
throw new Exception("Object:[" + model + "] is not entity Object ");
}
}
}
3.ActiveMQ应用场景
a.非均匀应用集成
ActiveMQ 中间件用Java语言编写,因此自然提供Java客户端 API。但是ActiveMQ 也为C/C++、.NET、Perl、PHP、Python、Ruby 和一些其它语言提供客户端。在你考虑如何集成不同平台不同语言编写应用的时候,ActiveMQ 拥有巨大优势。在这样的例子中,多种客户端API通过ActiveMQ 发送和接受消息成为可能,无论使用的是什么语言。此外,ActiveMQ 还提供交叉语言功能,该功能整合这种功能,无需使用远程过程调用(RPC)确实是个优势,因为消息协助应用解耦。
b.作为RPC的替代
应用使用RPC同步调用十分普遍。假设大多数客户端服务器应用使用RPC,包括ATM、大多数WEB应用、信用卡系统、销售点系统等等。尽管很多系统很成功,转换使用异步消息可以带来很多好处,而且也不会放弃响应保证。系统依赖同步需求典型地限制了扩展,因为最终需求将开始起作用,从而放慢整个系统。取而代之这种不好的体验,使用异步消息,附加的消息接收器可以轻松添加,假设你的应用可以解耦。
c.两个应用之间解耦
正如之前讨论的,紧耦合架构可以导致很多问题,尤其是如果他们是分布的。松耦合架构,在另一方面,证实了更少的依赖性,能够更好地处理不可预见的改变。你不见可以在系统中改变组件而不影响整个系统,而且组件交互也相当的简单。取代使用同步方案的组件交互,组件利用异步通信。这样的松耦合遍及系统被称之为事件驱动架构(EDA)。
d.作为事件驱动架构的主干
在之前的观点中,解耦、异步风格架构允许软件本身进一步扩展(水平的可扩展性),而不是依赖硬件的可扩展性(垂直的可扩展)。想象一下一种难以置信的流量、电子商务网站像亚马逊。但一个用户在亚马逊上购买,有许多分开的阶段贯穿,订单需要履行包括订单配置、创建发票、支付流程、订单完成、运输等。然而,但一个用户实际上提交了一个订单,用户立即得到一个页面说明,“感谢您的订单”不仅如此,没有任何延迟。用户也收到了订单已经收到的邮件说明,订单配置流程由亚马逊雇佣就是个很好的例子,第一步在一种更大的、异步流程中。每一个订单步骤直接由分开的服务奋力地处理。但用户下了订单,异步调用提交订单,但是全部订单流程不会落后于通过网页浏览器进行的同步调用。反之,订单被接受并立即被确认。这个流程中剩余的步骤一步地被处理。如果发生了问题。组织流程进行,用户会被通知。这样的异步流程提供大量的可扩展性。
e.改善应用可扩展性
许多应用利用事件驱动架构,为了提供大量的可扩展性,包括像电子商务、政府、制造业和在线游戏等领域。使用异步消息在业务领域分离一个应用,许多其它可能性开始合并。考虑使用服务为特定任务设计应用的能力。这正是面向服务架构(SOA)的主干。每一个服务实现一个独立的功能,而且只是那个功能。应用通过这些服务构成来创建,在服务间使用异步消息实现通信。这种风格的应用设计被称之为复杂事件处理(CEP)。使用CEP,系统中组件之间的交互可以被进一步的分析跟踪。在考虑异步消息在系统的组件之间添加一种迂回的时候,这些可能性是无止境的。
ActiveMQ的配置与使用的更多相关文章
- ActiveMQ安装配置及使用 转发 https://www.cnblogs.com/hushaojun/p/6016709.html
ActiveMQ安装配置及使用 ActiveMQ介绍 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JM ...
- ActiveMQ内存配置和密码设置
1.配置内存 bin中activemq.bat 中的第一行 加上 : REM 配置内存 set ACTIVEMQ_OPTS=-Xms1G -Xmx1G 2.修改控制台密码 1.打开conf/jetty ...
- (转)关于ActiveMQ的配置
目前常用的消息队列组建无非就是MSMQ和ActiveMQ,至于他们的异同,这里不想做过多的比较.简单来说,MSMQ内置于微软操作系统之中,在部署上包含一个隐性条件:Server需要是微软操作系统.(对 ...
- (jms)ActiveMQ 安装配置.
前言 ActiveMQ他是Apache出品的一个JMS提供者,管理会话和队列,运行在JVM下,支持多种语言,如JAVA,C++,C#,应用协议: OpenWire,Stomp REST,WS Noti ...
- ActiveMQ安全配置
1.activeMQ管理后台用户名.密码的设置 管理后台地址http://localhost:8161/admin 默认用户名密码admin admin 端口默认是8161,且服务采用的是服务器,所以 ...
- ActiveMQ主从配置
这种方式有个问题,activemq1有消息没消费完但是突然宕机,虽然程序会自动连到activemq2.但是activemq1的消息只有等机器恢复后才会被消费. 1.启动:我这里使用的是apache-a ...
- activemq spring 配置
Apache ActiveMQ是最流行和最强大的开源消息集成模式服务器.Apache ActiveMQ是速度快,支持多跨语言的客户端和协议,带有易于使用企业集成模式和许多先进的功能在充分支持JMS 1 ...
- ActiveMQ基本配置与示例演示
一.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 二.运行ActiveMQ 将apache-activemq-5.11.1-bin.zip解压,由于本系 ...
- centos下的activemq的配置及PHP的使用
一.安装JDK 1.下载JDK(官网:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...
随机推荐
- def语句常见错误
自觉不才,使用def语句时容易出现以下错误, 参考: 习题—25 http://www.2cto.com/shouce/Pythonbbf/ex25.html def add(): print &qu ...
- HttpServletResponse对象(一)
web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象. request和response对象既然代表请求和响应,那么我 ...
- 微信web开发工具
http://mp.weixin.qq.com/wiki/10/e5f772f4521da17fa0d7304f68b97d7e.html#.E4.B8.8B.E8.BD.BD.E5.9C.B0.E5 ...
- 笨方法学python--参数,解包,变量
1 cmd中执行 python ex11.py, ex11.py部分也是所谓的"参数". 2 from sys import argv script, first, second, ...
- 移动端日历控件 mobiscroll 的简单使用、参数设置
mobiscroll 在性能方面比较好,可选用多种效果,滑动效果也比较顺畅. 提供样式文件和js文件,直接点击下载,该版本是 mobiscroll 2.13的 官方地址 :https://docs ...
- Chapter 2 Open Book——22
I dropped my head, letting my hair fall to conceal my face. 我低下了我的头,让我的头发垂下来隐藏我的脸. I was sure,though ...
- hdu_1181_变形课(dfs)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1181 题意:中文题,不解释 题解:直接DFS #include<cstdio> #incl ...
- 大数据量情况下求top N的问题
上周五的时候去参加了一个面试,被问到了这个问题.问题描述如下: 假如存在一个很大的文件,文件中的每一行是一个字符串.请问在内存有限的情况下(内存无法加载这个文件中的所有内容),如何计算出出现频率最高的 ...
- HDU1236:排名
Problem Description 今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑 每题的分值,所以并不是最后的排名.给定录取分数线,请你写程序找出最后 ...
- putty 默认设置
打开 在 title上 点击 change settings / 或直接打开 设置面板 ,session 写 Default Settings 点击 save OK 另外 在 window- ...