ActiveMQ提供了一种连接机制,这种连接机制使用传输连接器(TransportConnector)实现客户端与代理(client - to - broker)之间的通信。

网络连接器(networkconnection)实现代理与代理之间的通信。(broker-to- broker);

一、TransportConnector支持的协议

ActiveMQ常用协议:

协议-描述-example

TCP-默认的协议性能相对来说还是可以的-tcp://host:port

NIO-基于TCP协议进行了扩展和优化,具有更好的扩展性-NIO://host:port

UDP-相比TCP性能更好,但是没有tcp可靠-udp://host:port

SSL-安全连接-ssl://host:port

Http(s)-基于http或https的链接-http://host:port

注意使用ssl时要证书Http(s)要导入httpclient相关jar包

具体demo见官网:http://activemq.apache.org/uri-protocols.html

这些传送协议都是在activemq.xml中配置的:

TCP: activemq.xml配置文件配置

<broker>
...
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</<transportConnectors>
...
</broker>

TCP:客户端代码:

connectionFactory = new ActiveMQConnectionFactory("admin", "admin","tcp://127.0.0.1:61616");  

NIO:activemq.xml配置文件配置

<broker>
...
<transportConnectors>
<transportConnector name="nio" uri="nio://0.0.0.0:61616"/>
</<transportConnectors>
...
</broker>

NIO:客户端代码:

connectionFactory = new ActiveMQConnectionFactory("admin", "admin","nio://127.0.0.1:61616");

其他的也都一样!!!

二、newworkConnector(网络连接器)支持的协议

协议 描述      example

Static         静态协议           static://(tcp://ip:port)

Multicast    多点传送协议    uri="multicast://default"

这里先看两种协议,但支持的协议不只这两种。

1、静态网络连接器

静态网络连接器用于为一个网络中多个代理创建静态配置.这种配置协议使用了一种复合的URI--即包含其他URI的URI.

静态协议是broker to broker的连接。

静态网络连接器activemq.xml配置文件配置:可以和多个代理进行通信,进行数据的拉取。

<networkConnectors>
<networkConnector name="local network" uri="static://(tcp://ip:61616,tcp://ip2:61616)"/>
</networkConnectors>

实例:

代理A的配置

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerA" dataDirectory="${activemq.data}">
<transportConnectors>
<transportConnector name="openwire" uri="tcp://127.0.0.1:61616" />
</transportConnectors>
</broker>

代理B的配置

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerB" dataDirectory="${activemq.data}">
<transportConnectors>
<transportConnector name="openwire" uri="tcp://127.0.0.1:61617" />
</transportConnectors>
<networkConnectors>
<networkConnector uri="static:(tcp://127.0.0.1:61616)" />
</networkConnectors>
</broker>

代理B中配置了和代理A的网络连接,这样配置后就能实现数据从B代理到A代理的流动,即使客户端将消息发送到了B代理,但消息消费端访问A代理也能获取并消费发送到B代理的消息,这是因为他们之间配了网络连接即networkConnection,当消费端来消费消息的时候,A代理从B代理哪里吧消息读取过来在给访问A代理的消费者。

2、动态网络连接器

这种动态技术可以实现让客户端和代理之间,代理和代理之间实现动态识别,而不是配置静态的IP组。

多点传送协议,代理会广播自己的服务,也会定位其他代理。同理客户端可以通过多点协议来接收广播,识别出代理。

多址传送协议的URI语法如下: 
multicast://ipadaddress:port?key=value

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="multicast" dataDirectory="${activemq.data}">
<networkConnectors>
<networkConnector name="default-nc" uri="multicast://default"/>
</networkConnectors> <transportConnectors>
<transportConnector name="openwire" uri="tcp://127.0.0.1:61616" discoveryUri="multicast://default"/>
</transportConnectors>
</broker>

在上面的例子中,使用群组名称"default"来替代具体的IP地址.上面的配置代码片段中有两个地方比较重要.首先,transport connector的discoveryUri属性用于暴露这个传输连接器的URI到名称为default的群组中.所有的希望查找可用代理的客户端都可以使用这个代理。

network connector的uri属性用于查找可用的代理并与之建立代理网络.这样配置后,代理就像客户端一样,使用多点传送协议来查找其他代理。 
移除discoveryUri属性,客户端就无法通过多点协议扫描到代理。

用多点传送协议的一个缺点是侦测是自动的.如果你不想把某个代理添加到群组中,你必须十分小心的设置。

客户端的自动侦测,通信语法是 
discovery:(discoveryAgentURI)?key=value
如connectionFactory = new ActiveMQConnectionFactory("admin", "admin","discovery:(multicast://default)");
将会自动侦测组名为default的代理。 
上面的配置 <transportConnectorname="openwire" uri="tcp://localhost:61616"discoveryUri="multicast://default"/>代理将会被侦测到。

三、Failover(失效重连协议)

failover:(uri1,...,uriN)?key=value 
或者failover:uri1,...,uriN,如 
failover:(tcp://primary:61616,tcp://secondary:61616)?randomize=false 
详细查看http://activemq.apache.org/failover-transport-reference.html 
默认情况是先随机选择一个连接器,如果该连接器无效,那么会选择下一个。 
失效转移连接器URI:是在客户端方面的协议,客户端在链接代理时需要保证链接的可用和可靠。实际上就算客户端只会连接一个代理,也应该使用failover配置通信协议,保证网络中断等问题时会自动重连。

失效重连协议是客户端方面的额协议,所以activemq.xml配置文件中就不用配置什么了……

实例:

connectionFactory = new ActiveMQConnectionFactory("admin", "admin","failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617)?randomize=false&priorityBackup=true");  

首先连接61616 如果连接失败则连接61617

设置连接优先级:

failover:(tcp://local1:61616,tcp://local2:61616,tcp://remote:61616)?randomize=false&priorityBackup=true&priorityURIs=tcp://local1:61616,tcp://local2:61616  

其他配置见管网.

总结:

1、传输连接器:主要是用户客户端到消息服务端的连接,在activemq的传输连接器<TransportConnector> 中配置,同时客户端ConnectionFactory中也配置同样的协议!

2、网络连接器:主要是代理和代理之间通信的,通信的目的就是数据的拉取!

3、失效重连协议:这个协议是客户端的协议,在创建ConnectionFactory 对象的时候可以指定多个JMS服务,并且可以指定优先级,这样就会按照优先级进行连接,如果优先级最高的能连上则连接他如果优先级最高的机器连接不上则连接连接优先级次高的以此类推。

参考文章:http://blog.csdn.net/vtopqx/article/details/51787717

JMS学习十(ActiveMQ支持的传输协议)的更多相关文章

  1. ActiveMQ学习笔记(7)----ActiveMQ支持的传输协议

    1. 连接到ActiveMQ Connector: Active提供的,用来实现连接通讯的功能,包括:client-to-broker,broker-to-broker.ActiveMQ允许客户端使用 ...

  2. 分布式-信息方式-ActiveMQ支持的传输协议和配置

                             ActiveMQ支持的传输协议和配置■ Connector: ActiveMQ提供的,用来实现连接通讯的功能.包括: client-to-broker ...

  3. ActiveMQ支持的传输协议

    ------------------------------------------------------ ActiveMQ支持的client-broker通讯协议有:TCP.NIO.UDP.SSL ...

  4. 消息中间件-ActiveMQ支持的消息协议

    package com.study.mq.a1_example.helloworld.queue; import org.apache.activemq.ActiveMQConnectionFacto ...

  5. JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系

    一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...

  6. ActiveMQ支持的消息协议

    ActiveMQ支持哪些协议 ActiveMQ支持多种协议传输和传输方式,允许客户端使用多种协议连接ActiveMQ支持的协议:AUTO,OpenWire,AMQP,Stomp,MQTT等Active ...

  7. 在window平台下,自己DIY编译OpenSSL,Libcurl ,来支持HTTPS传输协议

    1 缘起 原来就了解些libcurl,一直没有机会在项目实际使用libcurl.   恰好最近一个云存储的项目,服务器使用openstack 恰好我负责现在的一个云存储SDK c++版本的开发中. 与 ...

  8. FastSocket学习笔记~制定自已的传输协议~续~制定基于FastSocket的协议

    FastSocket这个东西上次我已经说过,它使用简单,功能强大,扩展灵活,目前在新浪的生产环境中已经被广泛使用,所以它的性能,安全等各方面我们绝对可以信赖,今天我们来说一个话题,和上一讲有关,这次我 ...

  9. FastSocket学习笔记~制定自已的传输协议

    对于TCP或者UDP来说,它们作于传输层的协议,有着自己的标准,或者叫格式,在我们看TCP格式之前先了解一下计算机的基础知识,字节,它是计算机世界的一个小单位,也是我们可以理会到的,如一个utf-8英 ...

随机推荐

  1. CSS3与页面布局学习总结——多种页面布局

    一.负边距与浮动布局 1.1.负边距 所谓负边距就是margin取负值的情况,如margin:-40px:margin-left:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见 ...

  2. React同构起步

    React同构从0到1 前言 如果你想快速做react同构的新项目建议你去了解next.js等成熟框架,本教程仅限于想了解如何从0开始实现一个同构环境过程的同学,对于想改造现有spa项目的同学也很有帮 ...

  3. thread 多线程2

    ###24.04_多线程(多线程程序实现的方式1)(掌握) * 1.继承Thread * 定义类继承Thread * 重写run方法 * 把新线程要做的事写在run方法中 * 创建线程对象 * 开启新 ...

  4. JS中property与attribute的区别

    property与attirbute都是属性的意思,在JS中很容易混淆,但实际上二者有很大的区别.简单来说, property:是DOM中的属性,是JavaScript中的对像 attribute:是 ...

  5. 字符集详解 ASCII码、Unicode、UTF-8 (转)

    认识字符集 对于计算机而言,它仅认识两个0和1,不管是在内存中还是外部存储设备上,我们所看到的文字.图片.视频等等“数据”在计算机中都是已二进制形式存在的.不同字符对应二进制数的规则,就是字符的编码. ...

  6. 【iOS】正則表達式抓取网页数据制作小词典

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xn4545945/article/details/37684127 应用程序不一定要自己去提供数据. ...

  7. picgo+typora优化markdown体验

    picgo+typora优化markdown体验 写markdown的时候许多图片的存放的上传是一个大问题,之前一直都是使用先截图,在commit之后,再将线上图片地址粘贴到相应的位置 现在知道了pi ...

  8. oracle函数nvl,nvl2的区别,nullif函数,coalesce函数

    在oracle中用nvl和nvl2函数来解决为空的情况,例如,如果奖金为空,则为它指定一个数.也就是nvl(奖金字段,指定的奖金),但是两个的类型要一致. 1)nvl()函数 SQL> sele ...

  9. 启动angular项目,端口被占用

    启动项目,npm start,报如下错误: 解决:1.win+R,输入CMD,启动命令行窗口. 2.输入netstat -ano或者netstat -ano|findstr 8080,查看8080端口 ...

  10. python全栈开发教程目录

    python入门到进阶 Python基础2——数据类型的操作 Python基础——函数入门 Python基础——函数进阶 Python基础——函数的装饰器 Python基础——函数的装饰器 Pytho ...