如何在连接中嵌入代理

 常见问题解答 > 使用 Apache ActiveMQ Classic > 如何在连接中嵌入代理

在许多消息传递拓扑中,存在 JMS 代理(服务器端)和 JMS 客户端。通常将代理部署在您的 JVM 中是有意义的。这使您可以优化网络跳转;使 JMS 网络与纯 RMI 一样高效,但具有位置独立性、可靠性、负载平衡等所有通常的 JMS 特性。

根据您使用的是 Java、Spring、XBean 还是 ActiveMQConnectionFactory,在 ActiveMQ Classic 中嵌入代理有几种方法。

使用显式 Java 代码

以下 Java 代码将创建一个嵌入式代理

BrokerService broker = new BrokerService();

// configure the broker
broker.addConnector("tcp://127.0.0.1:61616");

broker.start();

如果要作为 start() 的一部分延迟绑定传输连接器,当 start() 会阻塞以等待存储锁(如从属启动)时很有用,可以使用以下代码

BrokerService broker = new BrokerService();

TransportConnector connector = new TransportConnector();
connector.setUri(new URI("tcp://127.0.0.1:61616"));
broker.addConnector(connector);
broker.start();

在同一个 JVM 中,客户端可以使用 vm:// 传输 连接到嵌入式代理 - 而外部客户端可以使用 tcp:// 协议

如果有多个嵌入式代理,请确保为它们指定唯一的名称和 - 例如

BrokerService broker = new BrokerService();
// configure the broker
broker.setBrokerName("fred");
broker.addConnector("tcp://127.0.0.1:61616");
broker.start();

然后,如果要从同一个 JVM 中连接到名为“fred”的代理,可以使用 uri vm://fred

可以通过应用程序代码完全配置代理,例如

BrokerService broker = new BrokerService();
broker.setBrokerName("fred");
broker.setUseShutdownHook(false);
//Add plugin
broker.setPlugins(new BrokerPlugin[]{new JaasAuthenticationPlugin()});
//Add a network connection
NetworkConnector connector = answer.addNetworkConnector("static://"+"tcp://somehost:61616");
connector.setDuplex(true);
broker.addConnector("tcp://127.0.0.1:61616");
broker.start();

请注意,您应该在连接器之前添加插件,否则它们将不会初始化

有关您可以指定的可用属性的更多详细信息,请参阅 BrokerService javadoc

使用 BrokerFactory

有一个名为 BrokerFactory 的辅助类,可用于通过 URI 为配置创建代理。

BrokerService broker = BrokerFactory.createBroker(new URI(someURI));

URI 的可用值为

URI 方案 示例 描述
xbean bean:activemq.xml 在类路径(和文件系统)中搜索具有给定 URI 的 XML 文档(在本例中为 activemq.xml),该文档将用作 Xml 配置
broker broker:tcp://127.0.0.1:61616 使用 代理配置 URI 配置代理

使用 Spring

有一个工厂 bean 可以引用外部 ActiveMQ Classic 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>

在这种情况下,使用通常的 Spring classpath:org/apache/activemq/xbean/activemq.xml 资源机制,以便在类路径上找到 activemq.xml 文件,方法是查看类路径上的所有目录,然后查找 org/apache/activemq/xbean/activemq.xml。当然,您可以将其更改为任何您喜欢的值。例如,如果您只想将其放在类路径中的目录中,请使用 classpath:activemq.xml;例如,在 Web 应用程序中使用 WEB-INF/classes

如果您愿意,可以使用 URL,使用 file:* 或 *http: 前缀。有关更多详细信息,请参阅 Spring 如何处理资源

使用 XBean

如果您已经在使用 XBean,那么您只需将 Spring/XBean XML 配置 与 ActiveMQ Classic 的配置混合匹配。

<beans 
  xmlns="http://www.springframework.org/schema/beans" 
  xmlns:amq="https://activemq.apache.org/schema/core"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  https://activemq.apache.org/schema/core https://activemq.apache.org/schema/core/activemq-core.xsd">

  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>

  <broker useJmx="true" xmlns="https://activemq.apache.org/schema/core">

    <persistenceFactory>
      <kahaDB directory="${basedir}/target" />
    </persistenceFactory>

    <transportConnectors>
      <transportConnector uri="tcp://127.0.0.1:61636" />
    </transportConnectors>

  </broker>
</beans>

使用 Spring 2.0

如果您使用的是 Spring 2.0 和 ActiveMQ Classic 4.1 或更高版本(以及 xbean-spring 2.5 或更高版本),您可以在任何常规的 Spring.xml 文件中嵌入 ActiveMQ Classic 代理 XML,而无需上述工厂 bean。例如,以下是一个 示例,它显示了 Spring 2.0 中一个常规的 Spring XML 文件,它也配置了一个代理。

<beans 
  xmlns="http://www.springframework.org/schema/beans" 
  xmlns:amq="https://activemq.apache.org/schema/core"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  https://activemq.apache.org/schema/core https://activemq.apache.org/schema/core/activemq-core.xsd">
  
  <!--  lets create an embedded ActiveMQ Classic Broker -->
  <amq:broker useJmx="false" persistent="false">
    <amq:transportConnectors>
      <amq:transportConnector uri="tcp://127.0.0.1:0" />
    </amq:transportConnectors>
  </amq:broker>

   <!--  ActiveMQ Classic destinations to use  -->
  <amq:queue id="destination"  physicalName="org.apache.activemq.spring.Test.spring.embedded"/>

  <!-- JMS ConnectionFactory to use, configuring the embedded broker using XML -->
  <amq:connectionFactory id="jmsFactory" brokerURL="vm://127.0.0.1"/>
  

  <!-- Spring JMS Template -->
  <bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory">
      <!-- lets wrap in a pool to avoid creating a connection per send -->
      <bean class="org.springframework.jms.connection.SingleConnectionFactory">
        <property name="targetConnectionFactory">
          <ref local="jmsFactory" />
        </property>
      </bean>
    </property>
  </bean>

  <bean id="consumerJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsFactory"/>
  </bean>

  <!-- a sample POJO which uses a Spring JmsTemplate -->
  <bean id="producer" class="org.apache.activemq.spring.SpringProducer">
    <property name="template">
      <ref bean="myJmsTemplate"></ref>
    </property>

    <property name="destination">
      <ref bean="destination" />
    </property>

    <property name="messageCount">
      <value>10</value>
    </property>
  </bean>

  <!-- a sample POJO consumer -->
  <bean id="consumer" class="org.apache.activemq.spring.SpringConsumer">
    <property name="template" ref="consumerJmsTemplate"/>
    <property name="destination" ref="destination"/>
  </bean>

</beans>

使用 ActiveMQConnectionFactory

也可以使用 ActiveMQConnectionFactory 并使用 vm 连接器作为 uri 创建嵌入式代理。例如

ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://127.0.0.1?broker.persistent=false");

使用查询参数“broker." 配置代理,其中匹配 BrokerService 上的 bean 属性。

代理将在建立第一个连接时创建。

可以通过将 VM 传输上的 create 属性设置为 false 来关闭自动创建

ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://127.0.0.1?create=false");

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 许可。