ActiveMQ in Action-4.4 Connecting to ActiveMQ inside the virtual machine(VM connector)- 高飞网

4.4 Connecting to ActiveMQ inside the virtual machine(VM connector)

2016-05-23 15:45:15.0

4.4 ActiveMQ虚拟机内部连接(VM连接器)

    VM传输连接器,用来在java应用内部内嵌启动ActiveMQ服务端并连接到它。使用VM传输就意味着在客户端和内置服务端之间没有使用网络。通讯直接使用服务端方式调用来进行。由于网络消耗没有了,性能可以有明显的提升。当使用VM协议时,服务端会在第一个连接创建的时候会启动。随后在同一个虚拟机中的所有的VM协议的连接都会连接到相同的服务端。使用VM协议创建的服务端不会缺少任何ActiveMQ特性,例如服务端可以被配置与其他协议一起。当使用VM协议连接到服务端的所有客户端都关闭了连接时,服务端将自动关闭掉。

VM协议的URI语法如下:

vm://brokerName?key=value

    broker名称在VM传输连接器中扮演着非常重要的角色,它唯一标识了一个broker。例如,你可以指定不的broker名称创建两个不同的嵌入的服务端。这是仅有的要求不同的。传输的可选项也是与前面的一样,用URI的查询参数部分。该连接器的完整使用说明可以查看ActiveMQ官网(http://mng.bz/716b) 。

    VM传输连接器的关于可选项重要的一点是,在一定程序上你能使用它们配置服务端。带有borker前缀的可选项,用来调整服务端。例如,下面的url可以禁用消息持久化的(消息持久化在第5章展开讲):

vm://broker1?marshal=false&broker.persistent=false

还有一种可拱选择的配置语法:

vm:broker:(transportURI,network:networkURI)/brokerName?key=value


    完整的URI使用说明请参考(http://mng.bz/FNos) 。

    正如你所看到的,这种URI可以用于配置额外的传输连接哭喊中。看下下面的URI:

vm:broker:(tcp://localhost:6000)?brokerName=embeddedbroker&persistent=false

    在这,我们定义了一个内嵌的服务端铝为embeddedBroker,同时也配置了一个TCP传输连接器并监听在6000端口上。最后同样把持久化给禁用了。图4.4可以帮你更好地理解这个配置的示例。该示例演示了,客户端使用VM连接器连接到的嵌入在应用内部的服务端,而其他的客户端使用TCP连接器该服务端,就像任何情况下使用的单独服务端一样。

    嵌入的服务端可以通过协议选项使用外部的配置文件,通过uri指定activemq.xml文件。如:

vm://localhost?brokerConfig=xbean:activemq.xml

    使用xbean: protocol可以定位到activemq.xml文件。使用这种方式,可以像使用标准的服务端一样使用xml配置。

    现在可以通过下面的命令启动股票投资项目示例了:

$ mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Publisher \
-Dexec.args="vm://localhost CSCO ORCL"
...
Sending: {price=65.713356601409, stock=JAVA, offer=65.779069958011, up=true}
on destination: topic://STOCKS.JAVA

Sending: {price=66.071605671946, stock=JAVA, offer=66.137677277617, up=true}
on destination: topic://STOCKS.JAVA
Sending: {price=65.929035001620, stock=JAVA, offer=65.994964036622, up=false}
on destination: topic://STOCKS.JAVA
...
    注意,发布者不需要启动外部的服务端也可以工作的很好。VM传输的一个非常明显的优势就是,对于client-to-broker的通讯来说提高了性能。如果你只有一个java应用(一个JVM),而不是两个,使用这种方式可以使你的开发进程更方便。这也意味着,只有一个java进程需要管理。所以,如果你在一个应用中打算使用服务端的话,那个你应该考虑使用嵌入式服务端。第8章详细讲解嵌入式ActiveMQ。

另一方面,如果太多的java应用都使用嵌入式服务端,那么当试图维护一致的配置,和备份数据,成本都将陡升。在这种情况下,创建一个小的服务端集群而不是使用嵌入式服务端,一般来说会更容易。

一个服务端服务你所有的应用,在多数情况下都能很好地工作。但是有些环境,需要更好的特性,比如说高可用,易扩展。这通常就会使用的命为network of brokers(服务端网络)。在接下类的部分,你会学习到使用服务端网络和网络连接器(network of connectors)去配置这种网络的方法。.