使用Spring的MDP,我們可以與JMS服務提供者通信,向隊列或是主題發送或消費JMS消息,下面是兩個示例程序,分別是與隊列和主題通信,兩個程序大同小異,主要是配置上有些許區別,其中Weblogic中的JMS相關配置部分請見“
Weblogic9.2中JMS的相關配置”。
為了減少體積,這兩個程序去除了庫,這些庫是commons-logging-1.0.4.jar,dom4j-1.6.1.jar,log4j-1.2.14.jar,mysql-connector-java-5.0.6-bin.jar,spring.jar,weblogic.jar,其中mysql-connector-java-5.0.6-bin.jar不是必要的,因為與數據庫連接的部分程序已經刪除。大家可以自行尋找這些jar包加入工程中。
與隊列通信的程序下載地址如下:
http://www.tkk7.com/Files/heyang/SpringJMS_Topic20090924103204.rar
此程序的Spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- jndiTemplate 配置 -->
<bean id="jndiTemplate"
class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
weblogic.jndi.WLInitialContextFactory
</prop>
<prop key="java.naming.provider.url">
t3://localhost:7001
</prop>
<prop key="java.naming.factory.url.pkgs">
weblogic.jndi.factories
</prop>
</props>
</property>
</bean>
<!-- JMS隊列 配置 -->
<bean id="destination"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>MyJmsQueue</value>
</property>
<property name="jndiTemplate">
<ref local="jndiTemplate"></ref>
</property>
</bean>
<!-- JMS連接工廠 配置 -->
<bean id="connectionFactory"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>MyJmsConnectionFactory</value>
</property>
<property name="jndiTemplate">
<ref local="jndiTemplate"></ref>
</property>
</bean>
<!-- jmsTemplate 配置 -->
<bean id="jmsTemplate"
class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref local="connectionFactory" />
</property>
<property name="defaultDestination">
<ref local="destination" />
</property>
</bean>
<!-- JMS 消息發送者 配置-->
<bean id="jmsQueueSender"
class="com.heyang.sender.JmsQueueSender">
<property name="connectionFactory" ref="connectionFactory" />
<property name="queue" ref="destination" />
</bean>
<!-- JMS 消息監聽容器 -->
<bean id="listenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="concurrentConsumers" value="1" />
<property name="destination" ref="destination" />
<property name="messageListener" ref="messageListener" />
</bean>
<!-- Message Driven POJO (MDP 消息驅動POJO) -->
<bean id="messageListener" class="com.heyang.receiver.JmsQueueListener" />
</beans>
消息發送者源碼:
package com.heyang.sender;
import java.io.File;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.Session;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.JmsTemplate102;
import org.springframework.jms.core.MessageCreator;
public class JmsQueueSender{
private JmsTemplate jmsTemplate;
private Queue queue;
public void setConnectionFactory(ConnectionFactory cf) {
this.jmsTemplate = new JmsTemplate102(cf, false);
}
public void setQueue(Queue queue) {
this.queue = queue;
}
public void sendMsg(final String msg) {
this.jmsTemplate.send(this.queue, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(msg);
}
});
}
public static void main(String[] args) throws Exception{
ApplicationContext appContext = new ClassPathXmlApplicationContext("bean.xml");
JmsQueueSender jmsSender = (JmsQueueSender)appContext.getBean("jmsQueueSender");
jmsSender.sendMsg(readProvinceMsgFromXMl("msg.xml"));
System.out.println("消息發送完畢");
}
/**
* 從XML文件中讀取文本
* @param xmlFile
* @throws DocumentException
*/
public static String readProvinceMsgFromXMl(String xmlFile) throws DocumentException{
SAXReader reader=new SAXReader();
Document document=reader.read(new File(xmlFile));
Element root=document.getRootElement();
return root.asXML();
}
}
消息消費者源碼:
package com.heyang.receiver;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class JmsQueueListener implements MessageListener {
public void onMessage(Message message) {
if (message instanceof TextMessage) {
try {
String msg=((TextMessage) message).getText();
System.out.print("已經收到消息:"+msg);
Document document=DocumentHelper.parseText(msg);
Element root=document.getRootElement();
System.out.println(root.asXML());
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
}
與主題通信的程序下載地址如下:
http://www.tkk7.com/Files/heyang/SpringJMS_Queue20090924103214.rar
此程序的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- jndiTemplate 配置 -->
<bean id="jndiTemplate"
class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
weblogic.jndi.WLInitialContextFactory
</prop>
<prop key="java.naming.provider.url">
t3://localhost:7001
</prop>
<prop key="java.naming.factory.url.pkgs">
weblogic.jndi.factories
</prop>
</props>
</property>
</bean>
<!-- JMS主題 配置 -->
<bean id="destination"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>MyJmsTopic</value>
</property>
<property name="jndiTemplate">
<ref local="jndiTemplate"></ref>
</property>
</bean>
<!-- JMS連接工廠 配置 -->
<bean id="connectionFactory"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>MyJmsConnectionFactory</value>
</property>
<property name="jndiTemplate">
<ref local="jndiTemplate"></ref>
</property>
</bean>
<!-- jmsTemplate 配置 -->
<bean id="jmsTemplate"
class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory">
<ref local="connectionFactory" />
</property>
<property name="defaultDestination">
<ref local="destination" />
</property>
</bean>
<!-- JMS 消息發送者 配置-->
<bean id="jmsSender"
class="com.heyang.sender.JmsSender">
<property name="connectionFactory" ref="connectionFactory" />
<property name="topic" ref="destination" />
</bean>
<!-- JMS 消息監聽容器 -->
<bean id="listenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="concurrentConsumers" value="2" />
<property name="destination" ref="destination" />
<property name="messageListener" ref="messageListener" />
</bean>
<!-- Message Driven POJO (MDP 消息驅動POJO) -->
<bean id="messageListener" class="com.heyang.receiver.JmsListener" />
</beans>
消息發布者源碼:
package com.heyang.sender;
import java.io.File;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.Topic;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.JmsTemplate102;
import org.springframework.jms.core.MessageCreator;
public class JmsSender{
private JmsTemplate jmsTemplate;
private Topic topic;
public void setConnectionFactory(ConnectionFactory cf) {
this.jmsTemplate = new JmsTemplate102(cf, true);
}
public void setTopic(Topic queue) {
this.topic = queue;
}
public void sendMsg(final String msg) {
this.jmsTemplate.send(this.topic, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(msg);
}
});
}
public static void main(String[] args) throws Exception{
ApplicationContext appContext = new ClassPathXmlApplicationContext("bean.xml");
JmsSender jmsSender = (JmsSender)appContext.getBean("jmsSender");
jmsSender.sendMsg(readProvinceMsgFromXMl("msg.xml"));
System.out.println("消息發送完畢");
}
/**
* 從XML文件中讀取文本
* @param xmlFile
* @throws DocumentException
*/
public static String readProvinceMsgFromXMl(String xmlFile) throws DocumentException{
SAXReader reader=new SAXReader();
Document document=reader.read(new File(xmlFile));
Element root=document.getRootElement();
return root.asXML();
}
}
消息訂閱者源碼:
package com.heyang.receiver;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class JmsListener implements MessageListener {
public void onMessage(Message message) {
if (message instanceof TextMessage) {
try {
String msg=((TextMessage) message).getText();
System.out.print("已經收到消息:"+msg);
Document document=DocumentHelper.parseText(msg);
Element root=document.getRootElement();
System.out.println(root.asXML());
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
}