博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ActiveMQ相关背景(转)
阅读量:6879 次
发布时间:2019-06-27

本文共 8877 字,大约阅读时间需要 29 分钟。

概述


介绍中间件、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. 这里有一系列的文章,对JMS的技术做了详细的说明,只是没有代码

 

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

概述


以ActiveMQ + Log4j + Spring的技术组合,实现基于消息队列的统一日志服务。
参考:
 
本文提供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

你可以从 拿到源代码。

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.logserver11               |---- LogListener.java # 接收并输出log message

1.2.文件内容

1.2.1. pom.xml

1 
4
4.0.0
5
cn.sinobest.asj
6
log-servler
7
war
8
0.0.1-SNAPSHOT
9
amqlog-servler Maven Webapp
10
http://maven.apache.org
11
日志服务器,从ActiveMQ订阅主题,从而获取相关的日志数据
12
13
14
junit
15
junit
16
3.8.1
17
test
18
19
20
21
org.springframework
22
spring-web
23
4.2.4.RELEASE
24
25
26
org.springframework
27
spring-jms
28
4.2.4.RELEASE
29
30
31
32
org.apache.activemq
33
activemq-client
34
5.13.2
35
36
37
38
log4j
39
log4j
40
1.2.17
41
42
43
44
amqlog-servler
45
46

1.2.2. web.xml

1 
6
Archetype Created Web Application
7
8
contextConfigLocation
9
10 classpath:spring-beans.xml11
12
13
14
org.springframework.web.context.ContextLoaderListener
15
16

1.2.3. spring-beans.xml

装配图
说明:左上角标识由谁提供具体的实现,没有标识的由自己提供实现。
内容
1 
2
9
10
11
12
13
14
15
org.apache.log4j.spi
16
17
18
19
21
22
23
24
25
26
27
28
30
31
32
33
34
说明:
在targetConnectionFactory的属性中,指定了trustedPackages。ActiveMQ自5.12.2版本之后,强制用户指定一份可信任的packages白名单,以对付ObjectMessage存在的安全漏洞。具体内容可参考: 。

1.2.4. topic.properties

topic.brokerURL=tcp://localhost:61616topic.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 message12             // you must set org.apache.log4j.spi into the trusted packages list13             // see spring-beans.xml in classpath14             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来模拟,但是已经足够提供完整的核心代码。
你可以从 拿到源代码。

2.1.文件目录结构

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

2.2.文件内容

2.2.1. pom.xml

1 
4
4.0.0
5
cn.sinobest.asj
6
amqlog-client
7
0.0.1-SNAPSHOT
8
Simple app to send log to ActiveMQ
9
模拟一般的应用系统,通过log4j发送日志到ActiveMQ
10
11
12
13
log4j
14
log4j
15
1.2.17
16
17
18
commons-logging
19
commons-logging
20
1.1.1
21
22
24
25
org.apache.activemq
26
activemq-client
27
5.13.2
28
29
30

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:6161610 # TopicBindingName可以自由配置,只需要确保提供对应的jndi属性即可11 log4j.appender.jms.TopicBindingName=topicName12 # TopicConnectionFactoryBindingName目前不能自由配置13 log4j.appender.jms.TopicConnectionFactoryBindingName=ConnectionFactory14 15 # define the logger16 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

 

转载于:https://www.cnblogs.com/softidea/p/5330455.html

你可能感兴趣的文章
Hyper-V的备份与还原(PowerShell)
查看>>
MySQL MyISAM和InNodb备份与恢复技巧
查看>>
SplitContainer 控件扩展之收缩面板
查看>>
AD 重置密码完整脚本
查看>>
安卓的屏幕分辨率的设置
查看>>
Linux cpu性能问题排查
查看>>
linux下的端口扫描工具nmap
查看>>
AX负载均衡配置经验漫谈(1) - 健康检查
查看>>
Linux awk命令详解
查看>>
11.25 配置防盗链11.26 访问控制Directory11.27 访问控制FilesMatch
查看>>
Flask-Sqlalchemy设置时间默认值
查看>>
Android Log日志
查看>>
平面向量加法(10)
查看>>
在Linux系统中如何设置APACHE服务器里的后台页面只允许某个IP地址访问
查看>>
浅谈装饰模式
查看>>
11.PHP中的比较运算符
查看>>
Dispatcher与UI线程交互
查看>>
自动登陆抽屉(1)
查看>>
paloalto防火墙内存使用率高
查看>>
Effective_STL 学习笔记(十一) 理解自定义分配器的正确用法
查看>>