如何将代理嵌入到连接中

在许多消息框架的拓扑图中都有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")


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐