activemq 配置

最近需要用到JMS做异步开发,于是就想到了使用ActiveMQ,当然,我们会使用Spring配置它,但是看到网上介绍的配置好长连篇,却不懂得其中的道理,特把自己的研究过程记录下,希望对后来者有所帮助:

1、Broker
什么是Broker呢?可以把JMS Brokers 看成是服务器端。这个服务器可以独立运行,可以参考
http://activemq.apache.org/run-broker.html

也可以随着其他容器以内嵌方式云心,如下配置:

使用显示的Java代码创建
BrokerService broker = new BrokerService();
// configure the broker
broker.addConnector(”tcp://localhost:61616″);
broker.start();

使用BrokerFacotry创建
BrokerService broker = BrokerFactory.getInstance().createBroker(someURI);

使用Spring Bean创建
<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>

还可以使用XBean或Spring 2.0等多种配置方式配置,
通过ActiveMQConnectionFactory还可以隐含的创建内嵌的broker,这个broker就不是一个独立的服务了。

ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory(”vm://localhost?broker.persistent=false”);

当然也可以在Spring中配置ActiveMQConnectionFactory的Bean,这样就不用另外配置borker了。
具体可以参考:
http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html


2、ConnectionFactory

上一讲说到Broker,也就是服务端,我们的代码怎样才能访问服务端呢?JMS定义了一个ConnectionFactory来获取服务端提供的服务。
首先,我们可以通过JNDI获取ConnectionFacotry和Destination,对于内嵌的JMS Brokers,我们还可以通过 VM Transport创建ConnectionFactory,自己直接定义Destination然后直接使用,而不是通过JNDI获取。

我们可以通过Spring配置ConnectionFacotory
<bean id=”jmsFacotry” class=”org.springframework.jms.connection.SingleConnectionFactory”>
    <property name=”targetConnectionFactory”>
        <ref local=”connectionFactory” />
    </property>    
</bean>

上面的connectionFactory可以通过JNDI查找,在使用ActiveMQ内嵌Broker时,也可以直接绑定。

接着定义jmsTemplate,通过jmsTemplate可以获取很多底层的操作

<bean id=”jmsTemplate” class=”org.springframework.jms.core.JmsTemplate”>
    <property name=”connectionFactory” ref=”jmsFactory”/>
    <property name=”defaultDestination” ref=”destination” />
    <property name=”destinationResolver” ref=”默认是DynamicDestionResolver” />
    <property name=”pubSubDomain”><value>true or false默认是false,
       false是QueneDestination, true是TopicDestination</value>
</bean>

上面的defaultDestination是指默认发送和接收的目的地,我们也可以不指定,而是通过目的地名称让jmsTemplate自动帮我 们创建,这个是通过 DynamicDestinationResolver来解决的。如果想通过JNDI获取Destination,可以使用 JndiDestinationResovler.

接着定义发送者
  发送着只要注入jmsTemplate就可以了

接着定义消费者
消费者要继承MessageListener接口,实现onMessage方法

<bean id=”transactionManager” class=”org.springframework.jms.connection.JmsTransactionManager”>
    <property name=”connectionFactory” ref=”jmsFactory” />
</bean>

<bean id=”listenerContainer” class=”org.springframework.jms.listener.DefaultMessageListenerContainer”>
    <property name=”concurrentConsumers” value=”5″ />
    <property name=”connectionFactory” ref=”jmsFactory” />
     <property name=”destinationResolver” ref=”…” />
    <property name=”destinationResolver” ref=”默认是DynamicDestionResolver” />
    <property name=”pubSubDomain”><value>true or false默认是false,     
     <property name=”destination” ref=”destination” />
     <property name=”messageListener” ref=”messageListener” />
     <property name=”transactionManager” ref=”transactionManager” />
</bean>


 
阅读更多
换一批

没有更多推荐了,返回首页