Jhonney的专栏

   ----人见人爱
随笔 - 49, 文章 - 1, 评论 - 23, 引用 - 0
数据加载中……

Spring和Message Bean的整合

在日常的开发中,我们会经常使用MQ异步传递数据。在Java编程中,我们针对MQ使用JMS和Message Driven Bean。在EJB 2.0中引入了Message Bean,这也是EJB 2.0的得意之处,并且备受欢迎。在Spring中,我们引入JmsTemplate简化了MQ的客户操作,可以很方便地发布Message,但是Spring并未提供相关实现Message Bean的例子。如果Spring能够以POJO方式实现Message Bean,那将更加方便。我们知道EJB中的Message Bean虽然简单,但是步骤比较繁杂,你需要实现MessageDrivenBean, MessageListener接口,还需要设置EJB的配置信息等,然后是deploy,搞得很复杂。如果Spring能够提供POJO Message Bean,那就不一样了。你可以使用Spring的各种特性如IoC、AOP等等。在这里我们将Spring下的Message Bean称之为MDP(Message-Driven POJO),这也方便下面的引用。

在进行下一步操作之前,我们需要先进行环境设定,首先需要选择一款消息中间件软件,这里我们选择ActiveMQ。ActiveMQ是一款开源的消息中间件软件,实现了JMS 1.1规范,包含很多的特性,下面就是ActiveMQ的结构图:



同时我们需要使用SpringFramework框架,当前版本为1.2.5。准备好所有的开发包,我们要在IntelliJ IDEA创建一个新的项目,包含一个普通的模块即可,然后设定一下classpath即可,关于项目的详细信息,请下载附件中IntelliJ IDEA项目文件。

MDP的机制很简单,就是完成对指定的Message Queue或Topic的监听,所以我们需要在Spring的配置文件进行设定:

1 设定ConnectionFactory,这里我们采用嵌入式方式运行ActiveMQ:


<bean id="connectionFactory" class="org.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="vm://localhost"/>
<property name="useEmbeddedBroker" value="true"/>
</bean>

2 设定MDP,我们只需创建一个普通的JavaBean,然后实现MessageListener,最后在Spring配置文件中进行设定。


<bean id="HelloMDP" class="net.jetmaven.HelloMDP"/>

3 将MDP和Queue或Topic关联起来,以下是针对ActiveMQ的设定。其中HelloMDP是对MDP名称的引用。


<bean id="activeMQContainer" class="org.activemq.jca.JCAContainer">
<property name="workManager">
<bean id="workManager" class="org.activemq.work.SpringWorkManager"/>
</property>
<property name="resourceAdapter">
<bean id="activeMQResourceAdapter" class="org.activemq.ra.ActiveMQResourceAdapter">
<property name="serverUrl" value="vm://localhost"/>
</bean>
</property>
</bean>
<bean id="HelloQueueConsumer" factory-method="addConnector" factory-bean="activeMQContainer">
<property name="activationSpec">
<bean class="org.activemq.ra.ActiveMQActivationSpec">
<property name="destination" value="Hello.Queue"/>
<property name="destinationType" value="javax.jms.Queue"/>
</bean>
</property>
<property name="ref" value="HelloMDP"/>
</bean>

4 设定JmsTemplate,方便JMS客户段操作。


<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="defaultDestinationName" value="Hello.Queue"/>
<property name="connectionFactory" ref="connectionFactory"/>
</bean>

接下来我们需要创建一个Spring的JUnit测试用例,测试我们设定的功能,这里我们只需设定Spring配置文件位置,然后在测试方法中引用JmsTemplate,发送Message进行测试。


public class SpringTest extends AbstractDependencyInjectionSpringContextTests
{
protected String[] getConfigLocations()
{
return new String[]{"classpath*:applicationContext.xml"};
}
public void testSendMessage() throws Exception
{
JmsTemplate jmsTemplate = (JmsTemplate) applicationContext.getBean("jmsTemplate");
jmsTemplate.send(new MessageCreator()
{
public Message createMessage(Session session) throws JMSException
{
MapMessage message=session.createMapMessage(); message.setString("name","Jacky");
return message;
}
});
}
}

当你运行这个测试时,你会发现测试的结果。 总结:通过以上的设定,我们就可以完成Spring下的Message Driven Bean的设定,同EJB的MDB相比,MDP更加简单。在上例中,我们以JVM方式启动ActiveMQ,这对于单个应用(如web应用)是非常实用的,通过这种方式可以异步发送消息,这对应用中异步发送email,特定任务等,这种方式非常简单,原来比较复杂的问题现在可以很快解决啦。

posted on 2007-06-20 02:38 Jhonney 阅读(624) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: