ActiveMQ相关背景(转)

概述


介绍中间件、MOM、JMS、ActiveMQ,及相互的关系。

中间件


由于业务的不同、技术的发展、硬件和软件的选择有所差别,导致了异构组件或应用并存的局面。要使这些异构的组件协同工作,一个有效的方式就是提供一个允许它们进行通信的层,该层即为中间件

 

在概念上,中间件位于应用程序层与平台层(操作系统和底层网络服务)之间:

 

分类:

  • 基于远程过程调用(Remote Procedure Call, RPC)的中间件
    允许一个应用程序中的过程调用远程应用程序中的过程,就好像它们是本地调用一样。
  • 基于对象请求代理(Object Request Broker, ORB)的中间件
  • 面向消息(Message-Oriented Middleware,MOM)的中间件
    使分布式应用程序可以通过发送和接收消息来进行通信和交换数据。

MOM


全称:Message-Oriented Middleware 中文:面向消息的中间件

MOM通信模型:


 

MOM模型中的四个基本元素:消息传递提供者目的地客户端(发送方或接收方)、消息

发送方客户端消息发送到消息提供者维护的目的地,这些消息一直被保留直到接收方客户端消息取出。

JMS


全称:Java Message Service 中文:Java消息服务

JMS是Java的一套API标准,最初的目的是为了使应用程序能够访问现有的MOM系统(客户端通过JMS访问消息提供者);后来被许多现有的MOM供应商采用,并实现为MOM系统。

基于JMS实现的MOM,又被称为JMS Provider

ActiveMQ


Apache出品,完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。

它有很多功能、特色,所以它的详细信息很复杂。但是基于这一刻,我们只需要知道两件事:(1) 它是MOM;(2) 它是JMS的一个实现。

相互关系


附录


参考

    1. Sun Java System Message Queue 3.7 UR1 技术概述 — 第 1 章 消息传送系统:简介
      这里有一系列的文章,对JMS的技术做了详细的说明,只是没有代码

 

http://www.cnblogs.com/ywjy/p/5330208.html

概述


以ActiveMQ + Log4j + Spring的技术组合,实现基于消息队列的统一日志服务。

参考:Spring+Log4j+ActiveMQ实现远程记录日志——实战+分析

 

本文提供pdf下载:基于ActiveMQ的统一日志服务.pdf

与参考文章的比较

1. 更新了技术的版本
    e.g. Spring升级到4.2.0,ActiveMQ升级到5.13.2

2. 更新了依赖
    e.g. 使用activemq-client 5.13.2替换activemq-core 5.7.0,并取消了多余的spring-jms依赖

3. 精简了配置
    e.g. 去掉spring.xml中的jmsTemplate

4. 其他略述

前提

为理解文章的内容,你可能需要先了解下面的知识:

1. 了解基于Maven的项目结构

2. 下载并运行ActiveMQ

3. 了解log4j基于properties配置的简单用法

4. 了解基于Spring-webmvc的框架的搭建

当然,这只是建议......

技术版本

  1. ActiveMQ - 5.13.2
  2. Log4j - 1.2.17
  3. Spring - 4.2.4

结构图


1.节点拓扑图

说明:

  1. 应用系统基于log4j规范,通过JMSAppender将日志发送到ActiveMQ
  2. Log Server向ActiveMQ订阅消息,并指定MessageListener的实现来接收ActiveMQ发布的消息

实现


1.Log Server

你可以从amqlog-server拿到源代码。

1.1.文件目录结构

 1 pom.xml
 2 src/main/webapp/
 3     |---- WEB-INF/
 4               |---- web.xml
 5     |---- index.jsp # 忽略
 6 src/main/resources/
 7     |---- spring-beans.xml
 8     |---- topic.properties # 集中管理修改概率比较高的属性配置
 9 src/main/java/
10     |---- cn.sinobest.asj.logserver
11               |---- LogListener.java # 接收并输出log message

1.2.文件内容

1.2.1. pom.xml

 1 <project xmlns="http://maven.apache.org/POM/4.0.0"
 2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <groupId>cn.sinobest.asj</groupId>
 6     <artifactId>log-servler</artifactId>
 7     <packaging>war</packaging>
 8     <version>0.0.1-SNAPSHOT</version>
 9     <name>amqlog-servler Maven Webapp</name>
10     <url>http://maven.apache.org</url>
11     <description>日志服务器,从ActiveMQ订阅主题,从而获取相关的日志数据</description>
12     <dependencies>
13         <dependency>
14             <groupId>junit</groupId>
15             <artifactId>junit</artifactId>
16             <version>3.8.1</version>
17             <scope>test</scope>
18         </dependency>
19         <!-- use to import spring-webmvc framework -->
20         <dependency>
21             <groupId>org.springframework</groupId>
22             <artifactId>spring-web</artifactId>
23             <version>4.2.4.RELEASE</version>
24         </dependency>
25         <dependency>
26             <groupId>org.springframework</groupId>
27             <artifactId>spring-jms</artifactId>
28             <version>4.2.4.RELEASE</version>
29         </dependency>
30         <!-- use to subscribe topic message from ActiveMQ -->
31         <dependency>
32             <groupId>org.apache.activemq</groupId>
33             <artifactId>activemq-client</artifactId>
34             <version>5.13.2</version>
35         </dependency>
36         <!-- use to extract log content from message -->
37         <dependency>
38             <groupId>log4j</groupId>
39             <artifactId>log4j</artifactId>
40             <version>1.2.17</version>
41         </dependency>
42     </dependencies>
43     <build>
44         <finalName>amqlog-servler</finalName>
45     </build>
46 </project>

1.2.2. web.xml

 1 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2     xmlns="http://java.sun.com/xml/ns/javaee"
 3     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 5     id="WebApp_ID" version="3.0" metadata-complete="false">
 6     <display-name>Archetype Created Web Application</display-name>
 7     <context-param>
 8         <param-name>contextConfigLocation</param-name>
 9         <param-value>
10                 classpath:spring-beans.xml
11             </param-value>
12     </context-param>
13     <listener>
14         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
15     </listener>
16 </web-app>

1.2.3. spring-beans.xml

装配图

说明:左上角标识由谁提供具体的实现,没有标识的由自己提供实现。

内容

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans
 6         http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 7         http://www.springframework.org/schema/context
 8         http://www.springframework.org/schema/context/spring-context-4.2.xsd">
 9     <context:property-placeholder location="classpath:topic.properties" />
10     <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
11         <property name="brokerURL" value="${topic.brokerURL}" />
12         <!-- add trusted packages. see http://activemq.apache.org/objectmessage.html -->
13         <property name="trustedPackages">
14             <list>
15                 <value>org.apache.log4j.spi</value>
16             </list>
17         </property>
18     </bean>
19     <bean id="connectionFactory"
20         class="org.springframework.jms.connection.SingleConnectionFactory">
21         <property name="targetConnectionFactory" ref="targetConnectionFactory" />
22     </bean>
23     <bean id="destination" class="org.apache.activemq.command.ActiveMQTopic">
24         <constructor-arg name="name" value="${topic.topicName}" />
25     </bean>
26     <!-- define the message-listener to receive and dipose log data. -->
27     <bean id="messageListener" class="cn.sinobest.asj.logserver.LogListener" />
28     <bean id="jmsContainer"
29         class="org.springframework.jms.listener.DefaultMessageListenerContainer">
30         <property name="connectionFactory" ref="connectionFactory" />
31         <property name="destination" ref="destination" />
32         <property name="messageListener" ref="messageListener" />
33     </bean>
34 </beans>

说明:

在targetConnectionFactory的属性中,指定了trustedPackages。ActiveMQ自5.12.2版本之后,强制用户指定一份可信任的packages白名单,以对付ObjectMessage存在的安全漏洞。具体内容可参考:http://activemq.apache.org/objectmessage.html

1.2.4. topic.properties

topic.brokerURL=tcp://localhost:61616
topic.topicName=demo

注意:brokerURL的值必须和ActiveMQ的监听地址一致。

1.2.5. LogListener.java

 1 package cn.sinobest.asj.logserver;
 2 import javax.jms.JMSException;
 3 import javax.jms.Message;
 4 import javax.jms.MessageListener;
 5 import org.apache.activemq.command.ActiveMQObjectMessage;
 6 import org.apache.log4j.spi.LoggingEvent;
 7 public class LogListener implements MessageListener {
 8     private static final String TEMPLATE = "[%-5s] %s";
 9     public void onMessage(Message message) {
10         try {
11             // extract LoggingEvent from message
12             // you must set org.apache.log4j.spi into the trusted packages list
13             // see spring-beans.xml in classpath
14             LoggingEvent event = (LoggingEvent) ((ActiveMQObjectMessage) message)
15                     .getObject();
16             String content = String.format(TEMPLATE, event.getLevel()
17                     .toString(), event.getMessage().toString());
18             System.out.println(content);
19         } catch (JMSException e) {
20             e.printStackTrace();
21         }
22     }
23 }

说明:这里的LoggingEvent来自package org.apache.log4j.spi,该package在spring-beans.xml的白名单中。

2.Log Client

log client模拟一般的应用系统。该应用系统有日志存储的需要,将日志发送给ActiveMQ而不用关心日志最终的存储方式。这里仅用一个简单的JavaSE project来模拟,但是已经足够提供完整的核心代码。

你可以从amqlog-client拿到源代码。

2.1.文件目录结构

1 pom.xml
2 src/main/resources/
3     |---- log4j.properties # 配置日志输出地点,及ActiveMQ的相关参数
4     |---- jndi.properties # 配置topic
5 src/main/java/
6     |---- cn.sinobest.asj.logclient
7               |---- LogProducer.java # 生成并输出日志

2.2.文件内容

2.2.1. pom.xml

 1 <project xmlns="http://maven.apache.org/POM/4.0.0"
 2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <groupId>cn.sinobest.asj</groupId>
 6     <artifactId>amqlog-client</artifactId>
 7     <version>0.0.1-SNAPSHOT</version>
 8     <name>Simple app to send log to ActiveMQ</name>
 9     <description>模拟一般的应用系统,通过log4j发送日志到ActiveMQ</description>
10     <dependencies>
11         <!-- use to write log -->
12         <dependency>
13             <groupId>log4j</groupId>
14             <artifactId>log4j</artifactId>
15             <version>1.2.17</version>
16         </dependency>
17         <dependency>
18             <groupId>commons-logging</groupId>
19             <artifactId>commons-logging</artifactId>
20             <version>1.1.1</version>
21         </dependency>
22         <!-- use to import class org.apache.activemq.jndi.ActiveMQInitialContextFactory
23             to write log to ActiveMQ -->
24         <dependency>
25             <groupId>org.apache.activemq</groupId>
26             <artifactId>activemq-client</artifactId>
27             <version>5.13.2</version>
28         </dependency>
29     </dependencies>
30 </project>

2.2.2. log4j.properties

 1 # define the stand out appender
 2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 3 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 4 log4j.appender.stdout.layout.ConversionPattern=[%-5p] %-d{yyyy-MM-dd HH:mm:ss z}%n        %m%n%n
 5
 6 # define the jms appender
 7 log4j.appender.jms=org.apache.log4j.net.JMSAppender
 8 log4j.appender.jms.InitialContextFactoryName=org.apache.activemq.jndi.ActiveMQInitialContextFactory
 9 log4j.appender.jms.ProviderURL=tcp://localhost:61616
10 # TopicBindingName可以自由配置,只需要确保提供对应的jndi属性即可
11 log4j.appender.jms.TopicBindingName=topicName
12 # TopicConnectionFactoryBindingName目前不能自由配置
13 log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory
14
15 # define the logger
16 log4j.rootLogger=INFO, stdout, jms

注意:log4j.appender.jms.ProviderURL的值必须和ActiveMQ的监听地址一致。

2.2.3. jndi.properties

topic.topicName=demo

注意:key的后半部分(topicName)必须与log4j.properties中的log4j.appender.jms.TopicBindingName一致。

属性间的对应关系

2.2.4. LogProducer.java

 1 package cn.sinobest.asj.logclient;
 2 import org.apache.commons.logging.Log;
 3 import org.apache.commons.logging.LogFactory;
 4 public class LogProducer {
 5     private static final Log log = LogFactory.getLog(LogProducer.class);
 6     /**
 7      * @param args
 8      */
 9     public static void main(String[] args) {
10         log.debug("this is a debug message.");
11         log.info("this is a info message.");
12         log.warn("this is a warn message.");
13         log.error("this is a error message");
14         System.exit(0);
15     }
16 }

说明:debug的内容不会发送到ActiveMQ。

测试


  1. 启动ActiveMQ
    cd到ActiveMQ的解压缩目录,在cmd执行bin\activemq start
  2. 部署Log Server到Tomcat并启动
  3. 运行Log Client的LogProducer main方法
  4. Log Server的Console会有:

 

http://www.cnblogs.com/ywjy/p/5299041.html

 

时间: 2024-10-16 04:19:27

ActiveMQ相关背景(转)的相关文章

交互设计的前奏:了解产品背景及限制条件

[编者按]本文作者@刘津legene ,一个再优秀的交互设计师,如果不了解项目的相关背景及特殊限制,也难以做出好的设计. 如演员在上场前都需要熟读剧本,不可能什么都不了解就完全凭经验临场发挥.优秀的演员除了读剧本,还会做一些其他工作,比如读一些相关历史书籍,体验角色生活等.交互设计师也是一样,好的交互设计师,在正式开始设计前也会去了解产品的相关信息,这样在开始设计时才会做到胸有成竹. 那么具体需要从哪几方面入手呢? 1.了解市场背景.收集相关资料 可以上网查询这方面的文章,理解产品所处的市场环境

浅谈 HTTPS 和 SSL/TLS 协议的背景与基础

浅谈 HTTPS 和 SSL/TLS 协议的背景与基础 相关背景知识 要说清楚 HTTPS 协议的实现原理,至少需要如下几个背景知识. 大致了解几个基本术语(HTTPS.SSL.TLS)的含义 大致了解 HTTP 和 TCP 的关系(尤其是"短连接"VS"长连接") 大致了解加密算法的概念(尤其是"对称加密与非对称加密"的区别) 大致了解 CA 证书的用途 考虑到很多技术菜鸟可能不了解上述背景,俺先用最简短的文字描述一下.如果你自认为不是菜鸟,请

财政部相关负责人就福利计入工资解疑答惑

财政部相关负责人就福利计入工资解疑答惑 企业不得为职工支付物业.旅游费 交通.住房.通讯等补贴计入工资,是否增加税负未回应 税务总局此前规定,企业发放交通通讯补贴将计征个税. 11月12日,财政部印发了<关于企业加强职工福利费财务管理的通知>(以下简称<通知>),明确了企业职工福利费的开支范围,其规定与以前相比有五个方面的调整.规定企业职工的住房补贴.交通补贴或车改补贴.通讯补贴以及饭费补贴等,应当纳入职工工资总额管理,并明确企业不得为职工支付物业费.旅游费以及职工个人娱乐.健身.

最受欢迎的5种工作

如今的初创企业们已经在快速的成长,他们开始了对人才的争夺,但是有几种工作对于从业者来说是最难完成的. 科技产业中的初创企业们在所有大城市几乎都存在着,尤其集中在旧金山,波士顿和纽约.虽然其中的很多公司还停留在A轮,甚至是种子轮融资的阶段,不管怎么说他们已经成为了创业者. 为何现在创业者的数量这么多?因为近些年来,由于云技术的发展,科技创业的门槛相比几年前有了明显的降低.对于拥有优秀的创业理念的团队来说,他们也能够较为轻松的获得资金. 另外,众筹网站的出现,也给创业者们提供了一种新的获得资本的方式

读源码时,我们到底在读什么?

村上春村有本关于跑步的书:当我谈跑步时我谈些什么 而我们软件工程师,经常会提到读源代码,读优秀开源作品的源代码.我们谈起读源码时,到底是读什么呢? 读者可能会说,你这不是装X,明知故问嘛,读源码,当然就是读源码了. 当然,源码是我们阅读的对象,我前面的文章也提到了一些源代码阅读相关的内容.我今天想谈的是,我认为源码阅读除了提高设计能力外,也是学习相应实现语方语法与最佳实践的好例子,以及简洁代码.类/方法/变量等命名.注释编写等方面的榜样. 代码是写给人看的.这句话在许多编程的书里面都提到过.我们

如何选择seo外包商从而不被忽悠

今天爆老师和大家分享的话题的是<如何选择SEO外包商而不被忽悠>.因为很多客户在选择seo供应商时的考量都比较不全面,特别是国内的一些企业,本身可能不具备供应商审核标准,而数字营销行业也比较新对于传统企业在选择上会出现很多的不确定因素导致后期合作上的各种问题. 爆老师在这里画了一个阶段性考评图,对于要找乙方seo公司的负责人来讲会有一定指导作用吧.首先当你接到要去负责找seo供应商的的任务时,应该先要去罗列评判标准,每个评判标准的重要性和先后顺序是怎么样的.很多时候,这些公司都会犯一个错误就是

交互设计师在设计前需要对产品做到胸有成竹

文章描述:一个再优秀的交互设计师,如果不了解项目的相关背景及特殊限制,也难以做出好的设计. 一个再优秀的交互设计师,如果不了解项目的相关背景及特殊限制,也难以做出好的设计. 举个例子:我们都知道,演员在上场前都需要熟读剧本,不可能什么都不了解就完全凭经验临场发挥(除非是导演特殊要求).优秀的演员除了读剧本,还会做一些其他工作,比如读一些相关历史书籍,体验角色生活等.交互设计师也是一样,好的交互设计师,在正式开始设计前也会去了解产品的相关信息,这样在开始设计时才会做到胸有成竹. 那么具体需要从哪几

Microsoft .NET Framework 1.1 和 2.0(测试版)兼容性

简介 Microsoft .NET Framework 2.0 是在 Microsoft .NET Framework 1.0 和 1.1 成功的基础上构建的,用于为 Web 和 Microsoft Windows 客户端应用程序提供最佳的运行库环境.对于 .NET Framework 1.1 应用程序,Microsoft 的兼容性目标是:这些应用程序能够在 .NET Framework 2.0 上顺利运行(除一组记录在案的更改之外).在 Beta 2 发布期间,我们还没有达到这个目标,并且正在

创建您自己的浏览器扩展:将您的触角延伸至Chrome

开始之前 对于本文,您需要下载和安装 Google Chrome V19 或更高版本(本文示例是基于 V19 的 ).您也需要一些可以编辑 HTML.CSS 和 JavaScript 的工具.如果您有使用 Chrome 或者 Chrome 扩展的 经验将会很有帮助的.花一点时间浏览 Chrome Web Store.看看提供的扩展并先行试用一番,这将为本文提 供一些相关背景. 为什么构建浏览器扩展? 您想要构建一个浏览器扩展有几个原因,浏览器扩 展的常见应用是在一个浏览器和另一应用程序或服务之间