《ActiveMQ In Action》Chapter 4 Connecting to ActiveMQ
2016-01-15 14:17
78 查看
本文加入了自己的理解,不是纯粹的读书笔记。有些内容跟原书不一致,注意区分!
比如有如下配置片段:
它表示的含义是配置了两个“transport connector”,表示提供了两种与该broker建立连接的方式:
一个“transport connector”,它的名称是“dslconnector1”,它的URI是“tcp://localhost:61616”。这个URI表示的含义是:broker监听tcp协议的61616端口,只允许来自localhost的client(客户端)请求。
另外一个“transport connector”,它的名称是“dslconnector2”,它的URI是“nio://localhost:61617”。这个URI表示的含义是:broker监听tcp协议的61617端口,只允许来自localhost的client(客户端)请求,底层处理时使用NIO接口,而不是普通的IO接口。
另外在配置transport connector的时候还有一个重要的属性“discoveryUri”(属性值形式为“multicast://广播地址”,广播地址为224.0.0.0-239.255.255.255范围内的一个IP地址,也可使用“default”来表示默认的广播地址),配置transport connector时设置“discoveryUri”属性的值,表示将该transport connector定义传递到特定的广播地址,client或者其他broker可从该特定的广播地址获取到上述定义的transport connector,从而可以使用该transport connector与该broker建立连接。
比如现在有brokerA,配置如下:
有brokerB,配置如下:
有brokerC,配置如下:
在以上例子中,brokerC中配置了一个network connector,它使用到了brokerA和brokerB中的transport connector,从而brokerC与“brokerA和brokerB”之间建立了连接。整个broker集群的示意图如图1所示。
图1
原书中介绍network connector时,提及有两种network connector:forwarding bridge和duplex connector。其实duplex connector本质上是互为反方向的两个forwarding bridge的组合而已。因而上述“network connector描述的连接是单向的”的论点是正确而没有冲突的。
如果在brokerA中配置表示与其他broker连接关系的network connector,那么这些连接的方向都为“从brokerA到其他这些broker” 。
另有一个较形象的拓扑结构图如图2所示。
图2
备注:关于“从指定的广播地址获取一个transport connector列表”可参见“2.3、配置transport connector”
比如有如下配置片段:
它表示的含义是配置了一个“network connector”,它的名称是“default-nc”,它的URI是“multicast://default”。这个URI表示的含义见“3.2、不同network connector”中的multicast network connector。
比如现在有brokerA,配置如下:
在生产者或者消费者程序中,有如下Java代码片段:
以上例子中,生产者或者消费者程序中创建了一个client connector,它使用到了brokerA的transport connector,从而使得该生产者或者消费者与brokerA之间建立了连接。
另外,生产者与broker之间所建立连接的方向是“生产者->broker”;消费者与broker之间所建立连接的方向是“broker->消费者”。
样例配置如下:
它表示的含义是:在本进程(生产者或者消费者进程)中建立运行一个名为“brokerName”的内嵌broker,本生产者或者消费者与其通信建立连接。
可以像对一般broker一样,对内嵌broker配置一般形式的transport connector,比如tcp transport connector。但是这个不太常用,不再介绍。
备注:
此处的“VM”是指“virtual machine”,而这个“virtual machine”不是指虚拟机,而是指JVM中的VM。因为内嵌broker是内嵌在Java进程中的,而Java进程是由JVM管控的。
它表示的含义是:在本进程(生产者或者消费者进程)中建立运行一个名为“brokerName”的内嵌broker,本生产者或者消费者与其通信建立连接。同时将该名为“brokerName”的内嵌broker的定义传递到“peergroup”这个内嵌broker组,并且可以从该内嵌broker组获取到其他内嵌broker的定义,并与这些内嵌broker进行通信建立连接。
分别编写生产者程序和消费者程序,各自创建一个client connector,在client connector中使用的都为上述transport connector。具体生产者程序和消费者程序代码见原书第4章例子源代码。
运行消费者程序命令如下:
运行生产者程序命令如下:
另有一个brokerA,配置一个transport connector和network connector,具体配置内容如下:
根据上述配置,brokerA与brokerB集群的拓扑结构如图3所示。
图3
分别编写生产者程序和消费者程序,各自创建一个client connector,在client connector中使用的都为上述transport connector。具体生产者程序和消费者程序代码见原书第4章例子源代码。
运行消费者程序命令如下:
运行生产者程序命令如下:
此时消息会被从brokerA传输到brokerB使得被顺利消费。示意图如图4所示。
图4
消费者运行命令如下:
生产者运行命令如下:
host2 broker的配置形如:
host3 broker的配置形如:
此时拓扑示意图如图5所示。
图5
host2 broker的配置形如:
host3 broker的配置形如:
此时拓扑示意图如图6所示。
图6
定义transport connector时的
以下举例说明:
有个brokerA,配置如下:
有个brokerB,配置如下:
brokerA配置中配置transport connector时的
图7
一、connector
“connector”表示连接机制,可分为“transport connector”,“network connector”和“client connector”3种。1.1、transport connector
transport connector表示broker提供的一种连接方式,在broker中配置。以下配置表示本broker提供两种连接方式。<transportConnectors> <transportConnector name="dslconnector1" uri="tcp://localhost:61616"/> <transportConnector name="dslconnector2" uri="nio://localhost:61617"/> </transportConnectors>
1.2、network connector
network connector表示broker与broker之间建立连接的具体方案,在broker中配置。以下配置表示本broker与tcp://remotehost1:61616表示的brokerA和与
nio://remotehost2:61616表示的brokerB建立连接,与brokerA建立连接采用
tcp://remotehost1:61616对应的transport connector,与brokerB建立连接采用
nio://remotehost2:61616对应的transport connector。
<networkConnectors> <networkConnector name="nc" uri="static:(tcp://remotehost1:61616,nio://remotehost2:61616)"/> </networkConnectors>
1.3、client connector
client connector表示client与broker之间建立连接的具体方案,在client(客户端,即生产者或者消费者)中配置。以下配置表示本client与tcp://localhost:61616表示的broker建立连接,采用的是
tcp://localhost:61616对应的transport connector。
ActiveMQConnectionFactory factory =new ActiveMQConnectionFactory("tcp://localhost:61616"); Connection connection = factory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
1.4、connector URI
用来指明监听端口,使用的通信协议,broker的地址等内容。比如如下两个“connector URI”。tcp://localhost:61616 static:(tcp://host1:61616,tcp://host2:61616)
二、transport connector
2.1、transport connector定义
transport connector表示broker提供的一种连接方式,client和其他broker可通过该broker提供的transport connector与该broker建立连接,一个broker可配置零到多个transport connector。2.2、不同transport connector
有以下几种transport connector:transport connector名称 | 使用协议 | 描述 | < transportConnector >标签内URI配置举例 |
---|---|---|---|
tcp transport connector | tcp | 默认的transport connector | uri=”tcp://localhost:61616”,uri=”tcp://0.0.0.0:61616” |
nio transport connector | tcp | 相对于tcp transport connector使用更少资源 | uri=”nio://localhost:61618”,uri=”nio://0.0.0.0:61618” |
udp transport connector | udp | 相对于tcp transport connector更快,有些情形只能通过UDP端口连接broker | uri=”udp://localhost:61619”,uri=”udp://0.0.0.0:61619” |
ssl transport connector | tcp | 相对于tcp transport connector更加安全 | uri=”ssl://localhost:61617”,uri=”ssl://0.0.0.0:61617” |
http transport connector | tcp | 有些情形只能通过HTTP端口连接broker | uri=”http://localhost:8080”,uri=”http://0.0.0.0:8080” |
2.3、配置transport connector
编辑conf/activemq.xml文件内容,在“transportConnectors”标签下,配置“transportConnector”标签内容,配置一个“transportConnector”标签内容,就相当于配置一个“transport connector”。配置“transportConnector”标签,必须配置“name”和“uri”这两个属性。“name”表示“transport connector”的名称,需要是全局唯一的;“uri”表示“transport connector”的URI,也需要是全局唯一的,URI的含义见“1.4、connector URI”。
比如有如下配置片段:
<transportConnectors> <transportConnector name="dslconnector1" uri="tcp://localhost:61616"/> <transportConnector name="dslconnector2" uri="nio://localhost:61617"/> </transportConnectors>
它表示的含义是配置了两个“transport connector”,表示提供了两种与该broker建立连接的方式:
一个“transport connector”,它的名称是“dslconnector1”,它的URI是“tcp://localhost:61616”。这个URI表示的含义是:broker监听tcp协议的61616端口,只允许来自localhost的client(客户端)请求。
另外一个“transport connector”,它的名称是“dslconnector2”,它的URI是“nio://localhost:61617”。这个URI表示的含义是:broker监听tcp协议的61617端口,只允许来自localhost的client(客户端)请求,底层处理时使用NIO接口,而不是普通的IO接口。
另外在配置transport connector的时候还有一个重要的属性“discoveryUri”(属性值形式为“multicast://广播地址”,广播地址为224.0.0.0-239.255.255.255范围内的一个IP地址,也可使用“default”来表示默认的广播地址),配置transport connector时设置“discoveryUri”属性的值,表示将该transport connector定义传递到特定的广播地址,client或者其他broker可从该特定的广播地址获取到上述定义的transport connector,从而可以使用该transport connector与该broker建立连接。
三、network connector
3.1、network connector定义
network connector表示broker与broker之间建立连接的具体方案,创建network connector的过程中需要使用transport connector,使用network connector描述的连接是单向的。比如现在有brokerA,配置如下:
<transportConnectors> <transportConnector name="A-tc" uri="tcp://0.0.0.0:61616"/> </transportConnectors>
有brokerB,配置如下:
<transportConnectors> <transportConnector name="B-tc" uri="nio://0.0.0.0:61616"/> </transportConnectors>
有brokerC,配置如下:
<!--A.IP表示brokerA的IP地址,B.IP表示brokerB的IP地址--> <networkConnectors> <networkConnector name="C-nc" uri="static:(tcp://A.IP:61616,nio://B.IP:61616)"/> </networkConnectors>
在以上例子中,brokerC中配置了一个network connector,它使用到了brokerA和brokerB中的transport connector,从而brokerC与“brokerA和brokerB”之间建立了连接。整个broker集群的示意图如图1所示。
图1
原书中介绍network connector时,提及有两种network connector:forwarding bridge和duplex connector。其实duplex connector本质上是互为反方向的两个forwarding bridge的组合而已。因而上述“network connector描述的连接是单向的”的论点是正确而没有冲突的。
如果在brokerA中配置表示与其他broker连接关系的network connector,那么这些连接的方向都为“从brokerA到其他这些broker” 。
另有一个较形象的拓扑结构图如图2所示。
图2
3.2、不同network connector
有以下几种不同的network connector:network connector名称 | 描述 | < networkConnector >标签内URI配置举例 |
---|---|---|
static network connector | 静态指定一个transport connector列表,当前broker使用列表中所有transport connector与相应的broker建立连接 | uri=”static:(tcp://220.10.20.92:61616,nio://220.10.20.93:61616)” |
multicast network connector | 从指定的广播地址获取一个transport connector列表,当前broker使用列表中所有transport connector与相应的broker建立连接 | uri=”multicast://default” |
3.3、配置network connector
编辑conf/activemq.xml文件内容,在“networkConnectors”标签下,配置“networkConnector”标签内容,配置一个“networkConnector”标签内容,就相当于配置一个“network connector”。配置“networkConnector”标签,必须配置“name”和“uri”这两个属性。“name”表示“network connector”的名称,需要是全局唯一的;“uri”表示“network connector”的URI,也需要是全局唯一的,URI的含义见“1.4、connector URI”。
比如有如下配置片段:
<networkConnectors> <networkConnector name="default-nc" uri="multicast://default"/> </networkConnectors>
它表示的含义是配置了一个“network connector”,它的名称是“default-nc”,它的URI是“multicast://default”。这个URI表示的含义见“3.2、不同network connector”中的multicast network connector。
四、client connector
4.1、client connector定义
client connector表示client与broker建立连接的具体方案,在创建client connector的过程中要使用到transport connector。比如现在有brokerA,配置如下:
<transportConnectors> <transportConnector name="A-tc" uri="tcp://0.0.0.0:61616"/> </transportConnectors>
在生产者或者消费者程序中,有如下Java代码片段:
ActiveMQConnectionFactory factory =new ActiveMQConnectionFactory("tcp://localhost:61616"); Connection connection = factory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
以上例子中,生产者或者消费者程序中创建了一个client connector,它使用到了brokerA的transport connector,从而使得该生产者或者消费者与brokerA之间建立了连接。
另外,生产者与broker之间所建立连接的方向是“生产者->broker”;消费者与broker之间所建立连接的方向是“broker->消费者”。
4.2、不同client connector
client connector名称 | 描述 | 生产者或者消费者程序URI配置举例 |
---|---|---|
简单client connector | 使用单一的transport connector | ActiveMQConnectionFactory(“tcp://localhost:61616”) |
failover client connector | 静态指定一个transport connector列表,随机选择一个使用,失败时,重新随机选取一个 | ActiveMQConnectionFactory(“failover:(tcp://localhost:61616,tcp://localhost:61617)”) |
discovery client connector | 从指定的广播地址动态获取一个transport connector列表,随机选择一个使用,失败时,重新随机选取一个 | ActiveMQConnectionFactory(“discovery:(multicast://default)”) |
fanout client connector | 这个client connector只能由生产者使用。生产者使用该client connector,可以将一份消息同时发送到多个broker。相应于这多个broker的transport connector列表的获取有两种途径:1)静态指定,使用static,注意不是failover;2)动态查找,使用multicast,注意不是discovery | ActiveMQConnectionFactory(“fanout:(static:(tcp://host1:61616,tcp://host2:61616))”),ActiveMQConnectionFactory(“fanout:(multicast://default)”) |
4.3、配置使用client connector
在生产者或者消费者程序中配置client connector,具体是作为参数传递给连接工厂类(ActiveMQConnectionFactory类)。样例配置如下:
ActiveMQConnectionFactory factory =new ActiveMQConnectionFactory("tcp://localhost:61616"); Connection connection = factory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
五、内嵌broker
一般来说,都是独立运行一个broker进程,但也可在生产者进程或者消费者进程中运行内嵌broker。生产者或者消费者与一般broker的通信通过通信协议进行,而与内嵌broker的通信通过直接调用进行,因而通信性能更加好。5.1、client connector和transport connector合二为一
在内嵌broker机制中,client connector和transport connector合二为一。生产者或者消费者使用的client connector,同时包含了内嵌broker的transport connector。此时client connector的语法如下:vm://brokerName?key=value
它表示的含义是:在本进程(生产者或者消费者进程)中建立运行一个名为“brokerName”的内嵌broker,本生产者或者消费者与其通信建立连接。
可以像对一般broker一样,对内嵌broker配置一般形式的transport connector,比如tcp transport connector。但是这个不太常用,不再介绍。
备注:
此处的“VM”是指“virtual machine”,而这个“virtual machine”不是指虚拟机,而是指JVM中的VM。因为内嵌broker是内嵌在Java进程中的,而Java进程是由JVM管控的。
5.2、client connector,transport connector和network connector合三为一
ActiveMQ提供了一个解决方案,可以快速使用多个内嵌broker构造一个broker集群。在这个方案中,生产者或者消费者使用的client connector,同时包含了内嵌broker的transport connector和network connector。此时client connector的语法如下:peer://peergroup/brokerName?key=value
它表示的含义是:在本进程(生产者或者消费者进程)中建立运行一个名为“brokerName”的内嵌broker,本生产者或者消费者与其通信建立连接。同时将该名为“brokerName”的内嵌broker的定义传递到“peergroup”这个内嵌broker组,并且可以从该内嵌broker组获取到其他内嵌broker的定义,并与这些内嵌broker进行通信建立连接。
六、实战
6.1、单点broker
现有brokerA,配置一个transport connector,具体配置内容如下:<transportConnectors> <transportConnector name="tcp" uri="tcp://localhost:61616"/> </transportConnectors>
分别编写生产者程序和消费者程序,各自创建一个client connector,在client connector中使用的都为上述transport connector。具体生产者程序和消费者程序代码见原书第4章例子源代码。
运行消费者程序命令如下:
mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Consumer -Dexec.args="tcp://localhost:61616 CSCO ORCL"
运行生产者程序命令如下:
mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Publisher -Dexec.args="tcp://localhost:61616 CSCO ORCL"
6.2、简单broker集群
现有brokerB,配置一个transport connector,具体配置内容如下:<transportConnectors> <transportConnector name="tcpB" uri="tcp://localhost:61617"/> </transportConnectors>
另有一个brokerA,配置一个transport connector和network connector,具体配置内容如下:
<transportConnectors> <transportConnector name="tcpA" uri="tcp://localhost:61616"/> </transportConnectors> <networkConnectors> <networkConnector name="nc" uri="static:(tcp://localhost:61617)"/> </networkConnectors>
根据上述配置,brokerA与brokerB集群的拓扑结构如图3所示。
图3
分别编写生产者程序和消费者程序,各自创建一个client connector,在client connector中使用的都为上述transport connector。具体生产者程序和消费者程序代码见原书第4章例子源代码。
运行消费者程序命令如下:
mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Consumer -Dexec.args="tcp://localhost:61617 CSCO ORCL"
运行生产者程序命令如下:
mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Publisher -Dexec.args="tcp://localhost:61616 CSCO ORCL"
此时消息会被从brokerA传输到brokerB使得被顺利消费。示意图如图4所示。
图4
6.3、生产者使用tcp transport connector,消费者使用nio transport connector
broker的配置内容如下:<transportConnectors> <transportConnector name="tcp" uri="tcp://localhost:61616"/> <transportConnector name="nio" uri="nio://localhost:61617"/> </transportConnectors>
消费者运行命令如下:
mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Consumer -Dexec.args="nio://localhost:61617 CSCO ORCL"
生产者运行命令如下:
mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Publisher -Dexec.args="tcp://localhost:61616 CSCO ORCL"
6.4、broker集群——拓扑形式举例1
host1 broker的配置形如:<networkConnectors> <networkConnector name="host1-nc" uri="static:(host2URI,host3URI)"/> </networkConnectors> <transportConnectors> <transportConnector name="host1-tc" uri="host1URI"/> </transportConnectors>
host2 broker的配置形如:
<networkConnectors> <networkConnector name="host2-nc" uri="static:(host1URI,host3URI)"/> </networkConnectors> <transportConnectors> <transportConnector name="host2-tc" uri="host2URI"/> </transportConnectors>
host3 broker的配置形如:
<networkConnectors> <networkConnector name="host3-nc" uri="static:(host1URI,host2URI)"/> </networkConnectors> <transportConnectors> <transportConnector name="host3-tc" uri="host3URI"/> </transportConnectors>
此时拓扑示意图如图5所示。
图5
6.5、broker集群——拓扑形式举例2
host1 broker的配置形如:<networkConnectors> <networkConnector name="host1-nc" uri="static:(host2URI,host3URI)"/> </networkConnectors> <transportConnectors> <transportConnector name="host1-tc" uri="host1URI"/> </transportConnectors>
host2 broker的配置形如:
<networkConnectors> <networkConnector name="host2-nc" uri="static:(host1URI,host3URI)"/> </networkConnectors> <transportConnectors> <transportConnector name="host2-tc" uri="host2URI"/> </transportConnectors>
host3 broker的配置形如:
<networkConnectors> <networkConnector name="host3-nc" uri="static:(host2URI)"/> </networkConnectors> <transportConnectors> <transportConnector name="host3-tc" uri="host3URI"/> </transportConnectors>
此时拓扑示意图如图6所示。
图6
6.6、multicast connector
跟static connector相对的是multicast connector,使用multicast connector可以动态发现所有可用的broker。配置multicast connector的语法形式如下:<networkConnectors> <networkConnector name="default-nc" uri="multicast://default"/> </networkConnectors>
<transportConnectors>
<transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>
</transportConnectors>
定义transport connector时的
discoveryUri="multicast://default"表示将定义得到的transport connector的信息广播到默认的广播地址;而定义network connector时的
uri="multicast://default"表示从默认的广播地址获取所有的transport connector定义信息,并使用这些transport connector与相应的broker建立连接。
以下举例说明:
有个brokerA,配置如下:
<networkConnectors> <networkConnector name="nc1" uri="multicast://default"/> </networkConnectors> <transportConnectors> <transportConnector name="tc1" uri="tcp://localhost:61616" discoveryUri="multicast://default"/> </transportConnectors>
有个brokerB,配置如下:
<networkConnectors> <networkConnector name="nc2" uri="multicast://default"/> </networkConnectors> <transportConnectors> <transportConnector name="tc2" uri="tcp://localhost:61617" discoveryUri="multicast://default"/> </transportConnectors>
brokerA配置中配置transport connector时的
discoveryUri="multicast://default"使得该transport connector定义被广播到默认广播地址,同理,brokerB配置中的transport connector的定义也被广播到相同广播地址。此时,brokerA配置中配置network connector时的
uri="multicast://default"使得可以通过默认广播地址得到brokerB的transport connector定义,同理,brokerB配置中配置network connector时的
uri="multicast://default"使得可以通过默认广播地址得到brokerA的transport connector定义。使用brokerA和brokerB构造broker集群,拓扑示意图如图7所示。
图7
相关文章推荐
- iOS开发 Xcode7 使用NSURLSession发送HTTP请求报错
- SecureCRT 多个会话显示在同一窗口
- 说说UI设计
- 9 abstract 和 Virtual 之间的差别
- 2016,QQ8.0手动去广告备忘
- JS中完美兼容各大浏览器的scrolltop方法
- VMTools将淡出江湖
- HDU 1056 HangOver (简单数学题)
- 项目小结
- hdu1075 字典树
- Android Studio开发工具的设置
- solaris 开发记录系列二--No space left on device
- python网络编程——IO多路复用总结(select/poll/epoll)
- vim molokai配色方案(调过)
- 使用gprof 或 valgrind查看函数调用频率及程序性能瓶颈调试
- ril进程源码阅读札记
- directsound抓取麦克风PCM数据封装类
- android 网络图片双缓存
- 利用arcgis modle定时更新图形
- 数据仓库架构设计