注意:
- ActiveMQ允许客户端使用多种协议来连接,配置Transport Connector的文件在activeMQ安装目录的conf/activemq.xml中的<transportConnectors>标签之内。官方默认提供的:
<transportConnectors> <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> <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>
- ActiveMQ所有URI配置都基于java.net.URI类,该类不允许使用空格。因此,如果正在使用
failover:
或static:
URI,请不要在','
符号周围放置任何空格。 - ActiveMQ传输配置选项官网链接:https://activemq.apache.org/configuring-version-5-transports
- 在更改传输协议之前,必须保证ActiveMQ没有运行!
ActiveMQ的传输协议种类
1、TCP传输(The TCP Transport)
TCP传输允许客户端使用TCP套接字连接到远程ActiveMQ代理。这些配置选项可用于使用JMS客户端的连接URI字符串或在代理的传输连接器URI上调整客户端上的底层TCP传输。
- TCP是默认的Broker配置,TCP的Client监听端口61616
- 在网络传输数据前,必须要序列化数据,消息是通过一个叫wire protocol的来序列化成字节流。默认情况下,ActiveMQ把wire protocol叫做OpenWire,它的目的是促使网络上的效率和数据快速交互。
- TCP传输的优点:
TCP协议传输可靠性高,稳定性强
高效性:字节流方式传递,效率很高
有效性、可用性:应用广泛,支持任何平台 - 关于Transport协议的可配置参数,可以参加官网:http://activemq.apache.org/configuring-version-5-transports.html
注意:使用正确的前缀!
transport.*
在代理的传输连接器定义上使用时,下面的选项应该加上前缀。但是,在客户端,必须省略transport.*
前缀。
配置语法(后面的参数是可选)
tcp://hostname:port?key=value
例子
Broker方(in TransportConnector
):
tcp://localhost:61616?transport.threadName&transport.trace=false&transport.soTimeout=60000
客户端(in brokerURL
):
tcp://localhost:61616?threadName&trace=false&soTimeout=60000
传输选择项
选项名称 | 默认值 | 描述 |
---|---|---|
backlog | 5000 | 指定传输服务器套接字等待接受的最大连接数。 |
closeAsync | true | 如果true 套接字关闭调用是异步发生的。此参数应设置false 为STOMP等协议,这些协议通常用于为每次读取或写入创建新连接的情况。这样做可确保套接字关闭调用同步发生。同步关闭可防止代理由于连接的快速循环而耗尽可用套接字。 |
connectionTimeout | 30000 | 如果>=1 该值设置连接超时(以毫秒为单位)。值为0 表示没有超时。负值被忽略。 |
daemon | false | 如果true 传输线程将以守护进程模式运行。将此参数设置为true 将代理嵌入Spring容器或Web容器中以允许容器正确关闭。 |
dynamicManagement | false | 如果true 在TransportLogger 可以通过JMX进行管理。 |
ioBufferSize | 8 * 1024 | 指定在TCP层和wireFormat 基于编组的OpenWire层之间使用的缓冲区的大小。 |
jmxPort | 1099 | (仅限客户端)指定JMX服务器将用于管理的端口TransportLoggers 。这应仅由客户端生产者或消费者通过URI设置,因为代理创建自己的JMX服务器。指定备用JMX端口对于在同一台计算机上测试代理和客户端并且需要通过JMX控制这两者的开发人员非常有用。 |
keepAlive | false | 如果true ,在代理连接上启用TCP KeepAlive以防止连接在TCP级别超时。这不应该与使用的KeepAliveInfo 消息混淆InactivityMonitor 。 |
logWriterName | default | 设置org.apache.activemq.transport.LogWriter 要使用的实现的名称。名称映射到resources/META-INF/services/org/apache/activemq/transport/logwriters 目录中的类。 |
maximumConnections | Integer.MAX_VALUE | 此代理允许的最大套接字数。 |
minmumWireFormatVersion | 0 | wireFormat 将被接受的最小远程版本(请注意拼写错误)。注意:当远程wireFormat 版本低于配置的最低可接受版本时,将引发异常并且将拒绝连接尝试。值0 表示不检查远程wireFormat 版本。 |
socketBufferSize | 64 * 1024 | 设置接受的套接字读写缓冲区的大小(以字节为单位)。 |
soLinger | Integer.MIN_VALUE | soLinger 值为时设置套接字的选项> -1 。当设置-1 的soLinger 套接字选项被禁用。 |
soTimeout | 0 | 设置套接字的读取超时(以毫秒为单位)。值为0 表示没有超时。 |
soWriteTimeout | 0 | 设置套接字的写入超时(以毫秒为单位)。如果套接字写操作未在指定的超时之前完成,则套接字将被关闭。值0表示没有超时。 |
stackSize | 0 | 设置传输的后台读取线程的堆栈大小。必须以倍数指定128K 。值为0 表示忽略此参数。 |
startLogging | true | 如果传输堆栈true 的TransportLogger 对象最初将消息写入日志。除非,否则忽略此参数trace=true 。 |
tcpNoDelay | false | 如果设置true 了套接字选项 TCP_NODELAY 。这会禁用Nagle的小数据包传输算法。 |
threadName | N / A | 指定此参数时,将在调用传输期间修改线程的名称。附加远程地址,以便粘贴在传输方法中的调用将在线程名称中包含目标信息。当使用线程转储进行脱气时,这非常有用。 |
trace | false | 导致通过传输发送的所有命令都被记录。要查看记录的输出,请定义Log4j 记录器:log4j.logger.org.apache.activemq.transport.TransportLogger=DEBUG 。 |
trafficClass | 0 | 要在套接字上设置的流量类。 |
diffServ | 0 | (仅限客户端)要在传出数据包上设置的首选差分服务流量类,如RFC 2475中所述。有效整数值:[0,64] 。有效的字符串值:EF ,AF[1-3][1-4] 或CS[0-7] 。使用JDK 6时,仅在JVM使用IPv4堆栈时才有效。要使用IPv4堆栈,请设置系统属性java.net.preferIPv4Stack=true 。注意:同时指定' diffServ和typeOfService ' 是无效的,因为它们在TCP / IP包头中共享相同的位置 |
typeOfService | 0 | (仅限客户端)要在传出数据包上设置的首选服务类型值。有效的整数值:[0,256] 。使用JDK 6时,仅在JVM配置为使用IPv4堆栈时才有效。要使用IPv4堆栈,请设置系统属性java.net.preferIPv4Stack=true 。注意:同时指定' diffServ和typeOfService ' 是无效的,因为它们在TCP / IP包头中共享相同的位置。 |
useInactivityMonitor | true | 当false 该InactivityMonitor 被禁用,连接永不超时。 |
useKeepAlive | true | 在true KeepAliveInfo 空闲连接上发送消息时,防止其超时。如果此参数是false 连接,如果在指定的时间内没有在连接上收到任何数据,则连接仍将超时。 |
useLocalHost | false | 当true 本地连接将使用值进行localhost 的,而不是实际的本地主机名。在某些操作系统上,例如OS X ,无法以本地主机名连接,因此localhost 更好。 |
useQueueForAccept | true | 当true 接受的套接字被放置到队列上以使用单独的线程进行异步处理时。 |
wireFormat | default | wireFormat 要使用的工厂的名称。 |
wireFormat。* | N / A | 具有此前缀的属性用于配置wireFormat 。 |
OpenWire Wire Format
OpenWire是ActiveMQ使用的默认有线格式。它为高速消息传递提供了高效的二进制格式。可以在JMS客户端的连接URI或代理的传输绑定URI上配置OpenWire选项。
选项 | 默认 | 描述 |
---|---|---|
cacheEnabled | true | 是否应该缓存通常重复的值,以便减少编组? |
cacheSize | 1024 | 当 cacheEnabled=true ,则此参数用于指定值的数量被缓存。 |
maxInactivityDuration | 30000 | 最大不活动持续时间(在套接字被认为死亡之前),以毫秒为单位。在某些平台上,套接字可能需要很长时间才能消亡。因此,允许代理在配置的时间段内处于非活动状态时终止连接。某些传输使用它来启用保持心跳功能。设置为值时禁用不活动监视<= 0 。 |
maxInactivityDurationInitalDelay | 10000 | 开始不活动检查之前的初始延迟。是的,这个词 'Inital' 应该像那样拼写错误。 |
maxFrameSize | MAX_LONG | 允许的最大帧大小。可以帮助防止OOM DOS攻击。 |
sizePrefixDisabled | false | 在每个数据包被封送之前,是否应该为数据包的大小添加前缀? |
stackTraceEnabled | true | 是否应将代理上发生的异常堆栈跟踪发送到客户端? |
tcpNoDelayEnabled | true | 不影响有线格式,但提供TCP_NODELAY 应在通信套接字上启用的对等体的提示 。 |
tightEncodingEnabled | true | 电线尺寸是否应优于CPU使用? |
使用正确的前缀!
有线格式选项必须具有
wireFormat.
生效的前缀 ,例如wireFormat.maxInactivityDuration=10000
。缺少此前缀的选项将被忽略。
示例配置
Java的:
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616?wireFormat.cacheEnabled=false&wireFormat.tightEncodingEnabled=false");
Spring:
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:(tcp://localhost:61616?jms.optimizeAcknowledge=false&wireFormat.maxInactivityDuration=30000)"/>
<!-- other options... -->
</bean>
2、NIO传输(The NIO Transport)
NIO Transport与常规TCP传输非常相似。不同之处在于它是使用NIO API实现的,它可以帮助提高性能和可扩展性,不用将Java NIO包与IBM的AIO4J包混淆。。NIO仅是服务器端传输选项。尝试在客户端使用它将实例化常规TCP传输。要从TCP切换到NIO,只需更改URI的方案部分。这是在代理的XML配置文件中定义的示例。
<broker>
...
<transportConnectors>
<transportConnector name="nio" uri="nio://0.0.0.0:61616"/>
</<transportConnectors>
...
</broker>
NIO和TCP协议类似,但NIO更侧重于底层的访问操作,允许开发人员对同一资源可有更多的client调用和服务端有更多的负载。
适合使用NIO协议的场景:
- 可能有大量的Client去连接到Broker上,一般情况下,大量的Client去连接Broker是被操作系统的线程所限制的。因此,NIO的实现比TCP需要更少的线程去运行,所以建议使用NIO协议
- 可能对于Broker有一个很迟钝的网络传输,NIO比TCP提供更好的性能。
配置语法
nio://hostname:port?key=value
配置选项与TCP传输相同。
注意:原始NIO传输是使用OpenWire协议的tcp传输的替代品。其他网络协议,如AMQP,MQTT,Stomp等也有自己的NIO传输实现。它通常通过在协议前缀中添加“+ nio”后缀来配置,例如
mqtt+nio://localhost:1883
所有协议特定配置也应适用于NIO版本的传输。
调整NIO传输线程使用情况
使用NIO而不是常规版本的传输的一个主要优点是它可以更好地扩展并支持更多的连接。此方案的主要限制是系统使用的线程数。在阻塞传输的实现中,每个连接使用一个线程。在NIO实现中,有一个共享的线程池将占用负载,因此连接数与系统中使用的线程数没有直接关系。
您可以使用以下系统属性调整传输使用的线程数(自5.15.0起可用)
属性 | 默认值 | 描述 |
---|---|---|
org.apache.activemq.transport.nio.SelectorManager.corePoolSize | 10 | 即使它们处于空闲状态,也要保留在池中的线程数 |
org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize | 1024 | 池中允许的最大线程数 |
org.apache.activemq.transport.nio.SelectorManager.workQueueCapacity | 0 | 在增长池之前的最大工作队列深度 |
org.apache.activemq.transport.nio.SelectorManager.rejectWork | false | 当达到容量时,允许使用IOException拒绝工作,以便可以保留现有的QOS |
如果要扩展代理以支持数千个与它的连接,则需要首先找到允许JVM进程创建的线程数限制。然后,您可以将这些属性设置为低于该值的某个值(代理需要更多线程才能正常运行)。有关目标线程使用情况以及如何限制这些线程的更多信息,请查看Scaling Queues 或 此配置文件。例如,您可以添加以下内容
ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -Dorg.apache.activemq.transport.nio.SelectorManager.corePoolSize=2000 -Dorg.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=2000 -Dorg.apache.activemq.transport.nio.SelectorManager.workQueueCapacity=1024"
启动脚本(${ACTIVEMQ_HOME}/bin/env
例如)具有处理连接的2000个线程的常量池。使用这样的设置,代理应该能够接受最多达到系统限制的连接数。当然,接受连接只是故事的一部分,因此垂直扩展代理还有其他限制。
3、HTTP和HTTPS传输(The HTTP and HTTPS Transport)
HTTP和HTTPS传输用于使用XML有效负载通过HTTP或HTTPS进行隧道传输。这允许ActiveMQ客户端和代理通过HTTP进行隧道传输,从而避免任何防火墙问题。如果客户端不是JMS,您可能希望查看REST或Ajax支持。
像web和email等服务需要通过防火墙来访问,Http可以使用这种场合
注意:HTTP传输位于activemq-optional jar中。
ActiveMQ使用Jetty的Server和SslSocketConnector对象的组合通过HTTPS传输进行通信。使用HTTPS时,相应SSL证书和/或密钥的不正确配置可能会导致此nabble线程中描述的Jetty无限循环问题。可以在此处找到有关创建和配置密钥和证书的良好参考。
配置语法
1、http://host:port 或者 https://host:port
2、http://host:port?key=value 或者 https://host:port?key=value
示例URI
1、http://localhost 或者 https://localhost:8080
2、
<transportConnectors>
<transportConnector name="http" uri="http://localhost:8080?trace=true" />
</transportConnectors>
依赖
使用http(s)传输的客户端比tcp传输具有一些额外的依赖性。那些是
如果使用此传输,请确保在类路径中包含它们。此外,如果您使用http(s)传输配置代理网络,请确保将它们放在代理的类路径中(lib/
目录下的某个位置),因为在这种情况下代理将充当客户端。
其他的ActiveMQ的传输协议种类:
AUTO传输
从5.13.0开始,ActiveMQ支持通过TCP,SSL,NIO和NIO SSL进行自动有线协议检测。支持OpenWire,STOMP,AMQP和MQTT。有关详细信息,请参阅AUTOTransport Reference。
VM传输
VM传输允许客户端在VM内相互连接,而无需网络通信的开销。使用的连接不是套接字连接,而是使用直接方法调用来启用高性能嵌入式消息传递系统。第一个使用VM连接的客户端将引导嵌入式代理。后续连接将附加相同的代理。一旦关闭了与代理的所有VM连接,嵌入式代理将自动关闭。有关更多信息,请参阅VM传输参考
AMQP传输
从5.8.0开始,ActiveMQ支持AMQP。有关详细信息,请参阅AMQP传输参考。
MQTT传输
从5.6.0开始,ActiveMQ也支持MQTT。它是一种轻量级的发布/订阅消息传输。有关详细信息,请参阅MQTT传输参考。
SSL传输
这允许您使用SSL通过TCP进行通信。有关更多信息,请参阅SSL传输参考
NIO SSL传输
可用性
自5.6起可用
通过NIO实现SSL传输。这允许您将大量SSL客户端连接到单个代理实例。它只是服务器端传输选项
<broker>
...
<transportConnectors>
<transportConnector name="nio+ssl" uri="nio+ssl://0.0.0.0:61616"/>
</<transportConnectors>
...
</broker>
尝试nio+ssl
在客户端使用传输URL将实例化常规SSL传输。
Peer传输
对等传输提供与ActiveMQ的对等网络。实际发生的是对等传输使用VM传输来创建并连接到本地嵌入式代理,但是它配置嵌入式代理以建立与其他对等嵌入式代理的网络连接。有关更多信息,请参阅对等传输参考
UDP传输
这允许您通过UDP进行通信。有关更多信息,请参阅UDP传输参考
Multicast传输
这允许您通过多播进行通话。有关更多信息,请参阅多播传输参考
WebSockets传输
此传输使用新的HTML5 WebSockets与代理交换消息。有关更多信息,请参阅WebSockets传输参考
Stomp传输
可以与多种语言一起使用的纯文本传输。有关详细信息,请参阅 Stomp。
General Purpose URIs
您可以通过URI语法配置其他功能,如下所示......
Connection Configuration URI(连接配置URI)
可以使用URL或在ActiveMQConnection或ActiveMQConnectionFactory对象本身上显式设置属性来配置任何Apache ActiveMQ JMS连接。有关更多信息,请参阅连接配置URI
Destination Options
您可以使用目标选项配置各种与消费者相关的选项,这些选项允许您使用URI语法配置目标。
Broker Configuration URI
您可以使用Broker配置URI来配置嵌入式代理,可以使用Java中的BrokerFactory帮助程序类,也可以使用activemq shell脚本。有关更多详细信息,请参阅如何运行代理
Configuring Wire Formats
涉及将消息编组到某种网络传输(如TCP或UDP)上的任何传输通常都使用OpenWire格式。这可以配置为自定义事物在线上的显示方式。有关更多信息,请参阅配置Wire Formats
High Level Protocol URIs
可以通过URI配置以下更高级别的协议
Failover传输
故障转移传输层在任何其他传输之上重新连接逻辑。这曾经是ActiveMQ 3中的Reliable传输。它的配置语法允许您指定任意数量的复合URI。故障转移传输随机选择一个复合URI并尝试建立与它的连接。如果它不成功或随后失败,则会与列表中的其他URI之一建立新连接。有关更多信息,请参阅故障转移传输参考
Fanout传输
扇出传输层在任何其他传输之上重新连接和复制逻辑。它使用复制命令到多个代理。有关更多信息,请参阅扇出传输参考
Using Discovery
通常在使用TCP等传输时,您希望使用Discovery来查找可用的代理。这与使用多播不同 - 因为实际的主要通信是通过TCP进行的,但多播仅用于发现代理的位置。
Discovery传输
Discovery传输的工作方式与可靠传输类似,不同之处在于它使用发现代理来查找要连接的URI列表。有关更多信息,请参阅Discovery Transport Reference
ZeroConf传输
ZeroConf传输提供Discovery,它的工作方式与Discovery Transport类似,但不是使用我们自己的基于多播的发现机制(允许您配置确切的多播地址和端口等),而是使用ZeroConf传输。有关更多信息,请参阅ZeroConf传输参考
服务器端选项(Server side options)
有许多选项可用于TransportConnector
在ActiveMQ代理配置中更改服务器上的行为 。这些是:
财产名称 | 默认 | 描述 |
---|---|---|
allowLinkStealing | false | 这是MQTT传输的默认启用。链接窃取是指具有相同id的两个或多个连接中的最后一个(JMS的clientID)被视为有效连接,而较旧的连接被代理关闭。 |
discoveryURI| null` | 如果设置,则为客户端连接的多播发现地址以查找代理。 | |
enableStatusMonitor | false | 将监视连接以确定它们是否被阻止。 |
name | null | TransportConnector 实例的名称 。 |
rebalanceClusterClients | false | 将在拓扑更改时自动重新平衡群集中的客户端。 |
updateClusterClients | false | 如果启用,将更新failover:// 代理群集的更改的客户端连接(如果他们使用 传输)。 |
updateClusterClientsOnRemove | false | 如果从群集中删除代理,将更新客户端。 |
updateClusterFilter | null | 逗号分隔的正则表达式列表。名称与该模式匹配的代理将包含在客户端更新中。 |
uri | null | 传输的绑定地址。 |
`注意**:红色属性仅为5.10(及更高版本)选项。
配置示例:
<broker>
<!\-\- ... -->
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616" enableStatusMonitor="true"/>
</<transportConnectors>
<!\-\- ... -->
</broker>