目录结构:
在Windows或Linux下查看AactiveMQ的目录结构,在5.15.3版本下,目录结构如下:
bin:bin目录包含ActiveMQ启动脚本,包括Windows和Linux版本。
conf:conf目录包含ActiveMQ服务、安全、账号、日志等配置。
data:data目录存储ActiveMQ持久化数据以及日志文件,ActiveMQ使用Kahadb存储持久化消息。
docs:docs目录包含一份ActiveMQ简单的使用说明文档。
examples:examples目录是官方提供的示例,包括基于amqp、openwire、stomp等协议,java、python等语言的多协议多语言示例。
lib:lib目录提供ActiveMQ在几种应用场景下所需jar依赖。
webapps:webapps是ActiveMQ管理端Web实现,使用Jetty容器运行。
webapps-demo:webapps-demo是ActiveMQ Demo样例。
配置详解:
AactiveMQ的配置文件基本都集中在conf目录下,里面包含很多方面的配置,接下来一一对配置文件进行解释:
activemq.xml:
activemq.xml是消息中间件通信主要配置文件,打开配置文件,下面显示的是已经删除相关注释的内容以及配置块解释:
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
<!-- 加载credentials.properties文件,此文件中包含鉴权信息 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>file:${activemq.conf}/credentials.properties</value>
</property>
</bean>
<!-- 审计日志 -->
<bean id="logQuery" class="io.fabric8.insight.log.log4j.Log4jLogQuery"
lazy-init="false" scope="singleton"
init-method="start" destroy-method="stop">
</bean>
<!-- ActiveMQ代理配置 -->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" >
<pendingMessageLimitStrategy>
<!-- 内存中至多存储1000条消息,其余将会被删除或保存在temp store中 -->
<constantPendingMessageLimitStrategy limit="1000"/>
</pendingMessageLimitStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
<!-- 针对JMX进行配置 -->
<managementContext>
<managementContext createConnector="false"/>
</managementContext>
<!-- 持久化适配器,使用Kahdb进行消息持久化存储 -->
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
<!-- 系统使用情况 -->
<systemUsage>
<systemUsage>
<memoryUsage>
<!-- 内存使用情况 -->
<memoryUsage percentOfJvmHeap="70" />
</memoryUsage>
<storeUsage>
<!-- 存储最大可用. -->
<storeUsage limit="100 gb"/>
</storeUsage>
<tempUsage>
<!-- 临时存储可用大小 -->
<tempUsage limit="50 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
<!-- destroy the spring context on shutdown to stop jetty -->
<shutdownHooks>
<bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
</shutdownHooks>
</broker>
<import resource="jetty.xml"/>
</beans>
**Prefetch机制:**constantPendingMessageLimitStrategy标签相关,ActiveMQ通过Prefetch机制来提高性能,通过消息消费者端缓存消息来加速处理,如果消息消费者达到设置上限,则不会再接收消息,除非消息消费者主动对消息进行确认,再重新接收消息。
**transportConnectors:**该标签配置了ActiveMQ的传输链接,接下来一一介绍几种传输链接配置:
TCP协议:
ActiveMQ的Broker和Client之间,为了保证高稳定性的通信,可以使用TCP协议实现:
· 默认配置 tcp://hostname:port?key=value&key=value,默认端口61616
· 使用wire protocol进行序列化,ActiveMQ将wire protocol命名为OpenWire。
· 使用TCP,通过字节流方式传输保证高效性、应用广泛、支持任意平台、保证数据传输可靠性。
NIO协议:
NIO是JDK1.4引入的新一代IO,相较于传统的BIO,NIO提供了同步非阻塞解决方案,可以为服务端带来更大的吞吐量,并提高服务端可用性。
· 配置格式nio://hostname:port?key=value。
· 大量客户端连接到Broker时,NIO协议可以比TCP需要更少的线程,进而减轻Broker服务压力。
· NIO比TCP提供更好的性能,减少Broker服务延迟。
UDP协议:
UDP与TCP的区别:
· TCP面向连接,UDP无需连接。
· TCP提供可靠服务,保证数据传输无差错、不丢失、不重复,不乱序,UDP尽力保证交付,但不保证可靠性。
· TCP面向字节流,UDP面向报文。
· TCP通信是点对点,UDP支持一对一、一对多、多对一和多对多等交互。
· TCP的逻辑通信信道是全双工的可靠信道,UDP的逻辑信号是不可靠信道。
尽管在可靠性方面相比,TCP更加可靠,但是UDP亦可在很多场景中得到引用,ActiveMQ集成了UDP协议:
· 配置格式 udp://hostname:port?key=value。
· 穿透防火墙、减少传递延迟、快速传递数据时,可以使用UDP协议。
HTTP协议:
随着Web2.0的崛起,HTTP随着Web应用的推广,应用也随着变的越来越广泛,ActiveMQ可以很方便的集成HTTP协议。
· 配置格式 http://hostname:port?key=value。
· 基于http协议的Broker可以穿透防火墙。
SSL协议:
SSL协议构建在TCP协议之上,属于应用层协议,在HTTP协议外部提供安全可靠的通信管道,在对安全传输要求比较场合,可以使用基于SSL协议的ActiveMQ。
· 配置格式 ssl://hostname:port?key=value
· 除了配置协议链接外,需要配置SSL协议的证书
<sslContext>
<sslContext
keyStore="file:${activemq.base}/conf/sslcert.ks"
keyStorePassword="sslpwd"
trustStore="file:${activemq.base}/conf/sslcert.ks"
trustStorePassword="sslpwd"
/>
</sslContext>
VM协议:
ActiveMQ Broker可以内嵌到应用程序中,此时引用程序可以通过VM协议与Broker进行通信,此时通讯无需经过你网络,因而可以达到最高的性能。
· 配置格式 vm://brokerName?transportOptions
· 第一个创建VM连接的客户端会启动一个embed VM broker,之后所有使用相同broker name的VM连接都会使用这个broker。
· broker上所以连接都关闭时,broker亦会随之关闭。
AMQP协议:
AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是在JMS协议之上提出的工业级的消息中间件解决方案,ActiveMQ亦支持基于AMQP协议的消息处理。
· 配置格式 amqp://hostname:port?key=value,默认端口5672。
· 基于AMQP协议,遵循协议相关、实现无关性,可以轻易实现跨语言、跨平台。
STOMP协议:
STOMP(Streaming Text Orientated Message Protocol,流文本定向消息协议),提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,基于开发客户端,因此应用较广泛。
STOMP协议的前身是TTMP协议,一个简单的基于文本的协议,转为消息中间件设计。
配置格式 stomp://hostname:port?key=value,默认端口61613。
STOMP协议简单,服务端实现复杂,但客户端实现简单,集成简约、方便。
MQTT协议:
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使得其应用较为广泛。
· 配置格式 mqtt://hostname:port?key=value,默认端口1883。
WS协议:
WS协议是一种在单个TCP连接上进行全双工通信的协议,WS使得客户端和服务器之间的数据交换变得更加简单,允许服务器主动向客户端推送数据。
· 配置格式 ws://hostname:port?key=value,默认端口61614。
credentials.properties、credentials-enc.properties、users.properties、groups.properties:
credentials.properties保存着客户端建立连接需要的账号密码信息,使用这个信息前,需要在activemq.xml中broker节点内新增节点。
credentials.properties内容:
activemq.username=system
activemq.password=manager
guest.password=password
activemq.xml中broker内新增节点:
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser
username="{activemq.username}"
password="{activemq.password}" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
{activemq.username}和{activemq.password}引用的值即为credentials.properties中对应的值。
credentials-enc.properties内为credentials.properties内容的密文形式。
users.properties规定了ActiveMQ的当前账号。
groups.properties规定了ActiveMQ的当前账号角色。
jetty.xml、jetty-realm.properties:
jetty.xml和jetty-realm.properties是管理端页面Web容器Jetty的服务配置,作为ActiveMQ的辅助功能,只需简单了解即可。jetty-realm.properties保存着jetty账户密码信息。
jetty.xml中只需了解服务端口配置:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value="8161"/>
</bean>
jmx.access、jmx.password:
JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通过使用JMX可以监控ActiveMQ的运行状态和管理系统某些功能,比如清除缓存等。jmx.access定义了用户的使用权限,jmx.password定义了客户端使用JMX的账号密码。
log4j.properties、logging.properties:
log4j.properties和logging.properties是关于运行时ActiveMQ的日志配置。
以上就是ActiveMQ的主要配置,其中activemq.xml是最主要的配置,而transportConnectors则是activemq.xml中的重点。需要深入了解transportConnectors下各种链接协议的应用场景以及配置方式。