ActiveMQ相关背景(转)
概述
中间件

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

附录
参考
- Sun Java System Message Queue 3.7 UR1 技术概述 — 第 1 章 消息传送系统:简介
这里有一系列的文章,对JMS的技术做了详细的说明,只是没有代码
http://www.cnblogs.com/ywjy/p/5330208.html
概述
与参考文章的比较
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的框架的搭建
技术版本
- ActiveMQ - 5.13.2
- Log4j - 1.2.17
- Spring - 4.2.4
结构图
1.节点拓扑图

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

1.2.4. topic.properties
topic.brokerURL=tcp://localhost:61616
topic.topicName=demo
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 }

2.Log 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
属性间的对应关系

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 }

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

http://www.cnblogs.com/ywjy/p/5299041.html
ActiveMQ相关背景(转)的更多相关文章
- .NET同步与异步之相关背景知识(六)
在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成T ...
- {前端CSS} 语法 Css的几种引入方式 css选择器 选择器的优先级 CSS属性相关 背景属性 边框 CSS盒子模型 清除浮动 overflow溢出属性 定位(position)z-index
前端CSS CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素,给HTML设置样式,让它更加美观. 当浏览器读到一个样式表,它就会按照这个样式表来对文 ...
- ActiveMQ相关API
一.Producer 1,发送消息 MessageProducer send(Message message)发送消息到默认目的地,就是创建Producer时指定的目的地. send(Destinat ...
- AMQ学习笔记 - 01. 相关背景
概述 介绍中间件.MOM.JMS.ActiveMQ,及相互的关系. 中间件 由于业务的不同.技术的发展.硬件和软件的选择有所差别,导致了异构组件或应用并存的局面.要使这些异构的组件协同工作,一个有效的 ...
- WEB相关背景知识(新手)
1.评估域名类型 .com——商业实体 .edu——仅限有学位或更高等学历授予资格的高等教育使用 .gov——仅限政府使用 .net——与Internrt网络支持相关的团体,通常是Internet服务 ...
- android 开发概述以及相关背景知识
参考链接:http://www.runoob.com/android/android-architecture.html http://www.runoob.com/android/android-a ...
- ActiveMQ相关:
MQ连接字符串:failover:tcp://127.0.0.1:61616 管理地址:http://localhost:8161/admin/
- JSP相关背景
-----------------siwuxie095 Sun Microsystems SUN 即 Stanford ...
- Android相关小知识搜集
adb devices得到????????????错误结果 问题: 执行adb devices后,得到如下结果:???????????? device 相关背景: AOSP:Androi ...
随机推荐
- [Win]进程间通信——邮槽Mailslot
进程间通信 进程的地址空间是私有的.出于安全性的目的,如果一个进程不具有特殊的权限,是无法访问另外一个进程的内存空间的,也无法知道内存中保存的数据的意义.但是在一些具体的应用情况下需要多个进行相互配合 ...
- pathload --有效的网络带宽估计方法
上一篇博客简述了现行的带宽估计的方法,分类,以及一些问题. 见:http://blog.csdn.net/ice110956/article/details/11071969 上文列出了13种现行的方 ...
- php session 管理
function do_login(){ //获取用户名和密码信息,和数据库中比对 echo 111111111; dump($_POST); dump($_SESSION); echo 222222 ...
- hdu1569find the safest road(floyd变形求最大安全值)
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Android开发之搜Ya项目说明(3)
项目 搜芽移动client ----seller,app,base三个包的简单说明 作者 曾金龙 Tel:18664312687 QQ :470910357@qq.com 时间 2014-10-14 ...
- openwrt 3g模块上网
硬件环境: 开发板为RT5053F 3G模块为中兴 MC2176 电信版 以下是操作步骤 加入VID .PID VID . PID 的获取方法是 将设备插入电脑在linux下执行 ...
- DTD学习笔记
1. DTD基本介绍 xml文件分为两种类型,一个是在好形式,这是well-formed,还有一个合法有效,这是valid. XML文件遵循-called"好形式"各种语法规则要 ...
- nginx+tomcat负载均衡策略
測试环境均为本地,測试软件为: nginx-1.6.0,apache-tomcat-7.0.42-1.apache-tomcat-7.0.42-2.apache-tomcat-7.0.42-3 利用n ...
- jvm调优经验分享
当Java程序申请内存,超出VM可分配内纯的时候,VM首先可能会GC,假设GC完还是不够,或者申请的直接超够VM可能有的,就会抛出内 存溢出异常.从VM规范中我们能够得到,一下几种异常. java.l ...
- Android内存管理
首先Android理机制相当复杂.想要讲清楚比較困难.其次对于绝大多数用户来说.仅仅关心内存够不够用,至于内存怎样管理的这样的技术细节,不是用户须要去考虑的,写这样一个专题有没有意义?毕竟我们是用手机 ...