如何在连接中嵌入代理
常见问题解答 > 使用 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.
代理将在建立第一个连接时创建。
可以通过将 VM 传输上的 create 属性设置为 false 来关闭自动创建
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://127.0.0.1?create=false");