Spring3 and MDB Integration(II)Listener

本文详细介绍如何在Spring3环境中配置并使用MDB(Message Driven Bean),包括在JBoss中设置消息队列、调整Spring配置文件以添加监听器、修改Java源代码实现消息生产和消费,并提供单元测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring3 and MDB Integration(II)Listener

1. Configure the queue in JBOSS
JBOSS_HOME/server/default/deploy/messaging/destinations-service.xml:
<!-- Register User Send/Receive Queue1 -->
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=IUserQueue1">
<attribute name="JNDIName">queue/IUserQueue1</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
<!-- Register User Send/Receive Queue2 -->
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=IUserQueue2">
<attribute name="JNDIName">queue/IUserQueue2</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>

2. Change the Spring configurations, add listener to the XML jms-easymdbproxy-context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="jndiTemplate" />
</property>
<property name="jndiName">
<value>XAConnectionFactory</value>
</property>
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate102">
<property name="connectionFactory" ref="jmsConnectionFactory" />
<!--
true for Topic
false for Queue
-->
<property name="pubSubDomain">
<value>false</value>
</property>
<!-- message waiting time(ms) -->
<property name="receiveTimeout">
<value>30000</value>
</property>
<property name="messageConverter" ref="userMessageConverter" />
</bean>
<bean id="destinationQueue1" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="jndiTemplate" />
</property>
<property name="jndiName">
<value>queue/IUserQueue1</value>
</property>
</bean>
<bean id="destinationQueue2" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="jndiTemplate" />
</property>
<property name="jndiName">
<value>queue/IUserQueue2</value>
</property>
</bean>
<bean id="userMessageConverter" class="com.sillycat.easymdbproxy.mdb.UserMessageConverter" />
<!-- message producer -->
<bean id="messageProducer1" class="com.sillycat.easymdbproxy.mdb.UserMessageProducer">
<property name="jmsTemplate" ref="jmsTemplate" />
<property name="destination" ref="destinationQueue1" />
</bean>
<bean id="messageProducer2" class="com.sillycat.easymdbproxy.mdb.UserMessageProducer">
<property name="jmsTemplate" ref="jmsTemplate" />
<property name="destination" ref="destinationQueue2" />
</bean>
<bean id="messageConsumer" class="com.sillycat.easymdbproxy.mdb.UserMessageConsumer">
<property name="personManager" ref="personManager"/>
</bean>
<bean id="messageListener1"
class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<constructor-arg ref="messageConsumer" />
<property name="defaultListenerMethod" value="printUser" />
<property name="messageConverter" ref="userMessageConverter" />
</bean>
<bean id="messageListener2"
class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<constructor-arg ref="messageConsumer" />
<property name="defaultListenerMethod" value="alertUser" />
<property name="messageConverter" ref="userMessageConverter" />
</bean>
<bean id="listenerContainer1"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="concurrentConsumers" value="5"/>
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="destination" ref="destinationQueue1" />
<property name="messageListener" ref="messageListener1" />
</bean>
<bean id="listenerContainer2" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="concurrentConsumers" value="5"/>
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="destination" ref="destinationQueue2" />
<property name="messageListener" ref="messageListener2" />
</bean>
</beans>

3. Made some changes to java source code.
UserMessageProducer.java:
package com.sillycat.easymdbproxy.mdb;
import javax.jms.Queue;
import org.springframework.jms.core.JmsTemplate;
import com.sillycat.core.webservice.model.IUser;
public class UserMessageProducer
{
private JmsTemplate jmsTemplate;
private Queue destination;
public void setJmsTemplate(JmsTemplate jmsTemplate)
{
this.jmsTemplate = jmsTemplate;
}
public void setDestination(Queue destination)
{
this.destination = destination;
}
public void sendMessage(final IUser iUser)
{
jmsTemplate.convertAndSend(this.destination, iUser);
}
}

UserMessageConsumer.java:
package com.sillycat.easymdbproxy.mdb;
import java.util.List;
import com.sillycat.core.webservice.model.IUser;
import com.sillycat.easyjpa.manager.PersonManager;
import com.sillycat.easyjpa.model.Person;
public class UserMessageConsumer
{
private PersonManager personManager;
public void setPersonManager(PersonManager personManager)
{
this.personManager = personManager;
}
public void printUser(IUser iUser)
{
System.out.println("Id=" + iUser.getId() + " Name=" + iUser.getName() + " Email=" + iUser.getEmail());
}

public void alertUser(IUser iUser)
{
List<Person> list = personManager.getAll();
System.out.println("Id=" + iUser.getId() + " Name=" + iUser.getName() + " Email=" + iUser.getEmail() + " Persons=" + list.size());
}

}

One Util class, UserMessageConverter.java:
package com.sillycat.easymdbproxy.mdb;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;

import org.springframework.jms.support.converter.MessageConverter;

import com.sillycat.core.webservice.model.IUser;

public class UserMessageConverter implements MessageConverter
{

public Message toMessage(Object obj, Session session) throws JMSException
{
// check Type
if (obj instanceof IUser)
{
IUser iUser = (IUser) obj;
ObjectMessage message = session.createObjectMessage();
message.setObject(iUser);
return message;
}
else
{
throw new JMSException("Object:[" + obj + "] is not IUser");
}
}

public Object fromMessage(Message message) throws JMSException
{
if (message instanceof ObjectMessage)
{
ObjectMessage objectMessage = (ObjectMessage) message;
IUser iUser = null;
iUser = (IUser) objectMessage.getObject();
return iUser;
}
else
{
throw new JMSException("Msg:[" + message + "] is not ObjectMessage");
}
}

}

4. The junit test case MessageProducerTest.java:
package com.sillycat.easymdbproxy.mdb;

import com.sillycat.core.BaseTestCase;
import com.sillycat.core.webservice.model.IUser;

public class MessageProducerTest extends BaseTestCase
{

UserMessageProducer messageProducer1;
UserMessageProducer messageProducer2;

public void setUp() throws Exception
{
super.setUp();
messageProducer1 = (UserMessageProducer) ctx.getBean("messageProducer1");
messageProducer2 = (UserMessageProducer) ctx.getBean("messageProducer2");
}

public void tearDown() throws Exception
{
super.tearDown();
}

public void testSendMessage()
{
IUser iuser = new IUser();
iuser.setId(1);
iuser.setEmail("magic_dreamer@126.com");
iuser.setName("test");
messageProducer1.sendMessage(iuser);

iuser.setId(2);
iuser.setEmail("sillycat");
iuser.setName("sillycat");
messageProducer2.sendMessage(iuser);
}

}

References:
http://hi.baidu.com/luohuazju/blog/item/558938ec7f78092362d09fa3.html
http://hi.baidu.com/luohuazju/blog/item/1ef9350fead87de0ab6457e3.html
http://hi.baidu.com/luohuazju/blog/item/8f45d85459075b59564e00ec.html

http://blog.youkuaiyun.com/liuzhenwen/archive/2009/01/13/3768766.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值