ActiveMQ——如何将代理嵌入到连接中
如何将代理嵌入到连接中在许多消息框架的拓扑图中都有JMS代理和JMS客户端。通常在你的java虚拟机中配置代理它才起作用。这允许你优化网络;使JMS网络象纯粹的RMI一样有效率,但是会牺牲位置的独立性,可靠性和负载均衡。有许多不同的方法将代理嵌入到ActiveMQ中,这取决于你使用的是纯java、Spring、XBean还是ActiveMQConnectionFactory。使用jav
如何将代理嵌入到连接中
在许多消息框架的拓扑图中都有JMS代理和JMS客户端。通常在你的java虚拟机中配置代理它才起作用。这允许你优化网络;使JMS网络象纯粹的RMI一样有效率,但是会牺牲位置的独立性,可靠性和负载均衡。
有许多不同的方法将代理嵌入到ActiveMQ中,这取决于你使用的是纯java、Spring、XBean还是ActiveMQConnectionFactory。
使用java代码
下面的java代码将建立一个嵌入的代理。
BrokerService broker = new BrokerService();
// configure the broker
broker.addConnector("tcp://localhost:61616");
broker.start();
如果你想设置连接器参数,使用下面的代码:
BrokerService broker = new BrokerService();
TransportConnector connector = newTransportConnector();
connector.setUri(new URI("tcp://localhost:61616"));
broker.addConnector(connector);
broker.start();
在同一个java虚拟机的客户使用vm://transport连接到嵌入的代理中,同时外部客户使用能够使用tcp://protocol连接。
如果要嵌入多个代理,你需要为每一个代理指定唯一的名字:
BrokerService broker = new BrokerService();
// configure the broker
broker.setBrokerName("fred");
broker.addConnector("tcp://localhost:61616");
broker.start();
如果你在同一个虚拟机连接到fred,使用vm://fred。
使用代码来完全配置代理也是可以的:
BrokerService broker = new BrokerService();
broker.setBrokerName("fred");
broker.setUseShutdownHook(false);
//Add plugin
broker.setPlugins(new BrokerPlugin[]{newJaasAuthenticationPlugin()});
//Add a network connection
NetworkConnector connector =answer.addNetworkConnector("static://"+"tcp://somehost:61616");
connector.setDuplex(true);
broker.addConnector("tcp://localhost:61616");
broker.start();
请注意:你应该在增加连接器之前增加插件,否则它不会初始化。
更详细属性设置请参阅BrokerServicejavadoc。
使用BrokerFactory
通过URI来进行配置,使用BrokerFactory类建立代理将会非常有帮助的。
BrokerService broker = BrokerFactory.createBroker(newURI(someURI));
有效的URI参数如下所示:
URI 方案 | 示例 | 描述 |
xbean | xbean:activemq.xml | 在类路径中查找此XML配置文件,这个配置文件进行Xml配置。 |
broker | broker:tcp://localhost:61616 | 使用Broker配置URI来配置代理。 |
使用Spring
有一个工厂Bean可以引用到外部的ActiveMQ的XML配置文件:
<bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
<property name="config" value="classpath:org/apache/activemq/xbean/activemq.xml"/>
<property name="start" value="true" />
</bean>
在这个示例中,Sping使用classpath:org/apache/activemq/xbean/activemq.xml来指定配置文件的位置,它会查找类路径org/apache/activemq/xbean/activemq.xml,直到找到activemq.xml这个文件,你也可以更改这个路径,例如使用classpath:activemq.xml这个配置,则它会在WEB-INF/classes目录中查找。
如果你想使用URL,你可以使用file:*或者*http:前缀。更详细的内容请查阅Spring如何处理他的资源。
使用XBean
如果你已经准备使用XBean,那么你可以将ActiveMQ的配置组合到Sping/XBean的XML配置文件中。
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://activemq.apache.org/schema/corehttp://activemq.apache.org/schema/core/activemq-core.xsd">
<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<brokeruseJmx="true"xmlns="http://activemq.apache.org/schema/core">
<networkConnectors>
<!--
<networkConnector uri="multicast://default?initialReconnectDelay=100"/>
<networkConnector uri="static://(tcp://localhost:61616)"/>
-->
</networkConnectors>
<persistenceFactory>
<journalPersistenceAdapterFactory journalLogFiles="5"dataDirectory="${basedir}/target/foo" />
<!-- To use a different dataSource, use the following syntax : -->
<!--
<journalPersistenceAdapterFactory journalLogFiles="5"dataDirectory="${basedir}/activemq-data"dataSource="#mysql-ds"/>
-->
</persistenceFactory>
<transportConnectors>
<transportConnector uri="tcp://localhost:61636" />
</transportConnectors>
</broker>
<!--MySql DataSource Sample Setup -->
<!--
<beanid="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
<propertyname="driverClassName" value="com.mysql.jdbc.Driver"/>
<propertyname="url"value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
<propertyname="username" value="activemq"/>
<propertyname="password" value="activemq"/>
<propertyname="poolPreparedStatements" value="true"/>
</bean>
-->
</beans>
使用Spring 2.0
如果你使用Sping 2.0和ActiveMQ 4.1以上的版本(和xbean-spring 2.5以上的版本),你可以将ActiveMQ代理的XML配置嵌入到通常的Spring.xml文件中,而不需要以上的工厂Bean。下面是一个配置这样代理的示例:
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://activemq.apache.org/schema/corehttp://activemq.apache.org/schema/core/activemq-core.xsd">
<!-- lets create an embedded ActiveMQ Broker-->
<amq:brokeruseJmx="false" persistent="false">
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:0" />
</amq:transportConnectors>
</amq:broker>
<!-- ActiveMQ destinations to use -->
<amq:queueid="destination" physicalName="org.apache.activemq.spring.Test.spring.embedded"/>
<!--JMS ConnectionFactory to use, configuring the embedded broker using XML -->
<amq:connectionFactoryid="jmsFactory" brokerURL="vm://localhost"/>
<!--Spring JMS Template -->
<beanid="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<propertyname="connectionFactory">
<!-- lets wrap in a pool to avoid creating a connection per send-->
<beanclass="org.springframework.jms.connection.SingleConnectionFactory">
<property name="targetConnectionFactory">
<ref local="jmsFactory" />
</property>
</bean>
</property>
</bean>
<beanid="consumerJmsTemplate"class="org.springframework.jms.core.JmsTemplate">
<propertyname="connectionFactory" ref="jmsFactory"/>
</bean>
<!--a sample POJO which uses a Spring JmsTemplate -->
<beanid="producer"class="org.apache.activemq.spring.SpringProducer">
<propertyname="template">
<ref bean="myJmsTemplate"></ref>
</property>
<propertyname="destination">
<ref bean="destination" />
</property>
<propertyname="messageCount">
<value>10</value>
</property>
</bean>
<!--a sample POJO consumer -->
<beanid="consumer"class="org.apache.activemq.spring.SpringConsumer">
<propertyname="template" ref="consumerJmsTemplate"/>
<propertyname="destination" ref="destination"/>
</bean>
</beans>
使用ActiveMQConnectionFactory
一个被嵌入的代理可以使用ActiveMQConnectionFaction来建立,并使用虚拟机连接器作为uri,例如:
ActiveMQConnectionFactory cf = newActiveMQConnectionFactory("vm://localhost?broker.persistent=false")
使用“broker.<property>来配置代理。
代理将会在建立连接后创建。
你可以设置创建虚拟机端口为false来自动关闭创建。:
ActiveMQConnectionFactory cf = newActiveMQConnectionFactory("vm://localhost?create=false")
更多推荐
所有评论(0)