Spring Jms入门实例

来源:互联网 发布:建筑软件大全 编辑:程序博客网 时间:2024/04/25 12:48
Spring JMS 
        Spring框架提供了一个模板机制来隐藏Java APIs的细节。开发人员可以使用JDBCTemplate和JNDITemplate类来分别访问后台数据库和JEE资源(数据源,连接池)。JMS也不例外,Spring提供JMSTemplate类,因此开发人员不用为一个JMS实现去编写样本代码。接下来是在开发JMS应用程序时Spring所具有一些的优势。 

提供JMS抽象API,简化了访问目标(队列或主题)和向指定目标发布消息时JMS的使用。 
开发人员不需要关心JMS不同版本(例如JMS 1.0.2与JMS 1.1)之间的差异。 
开发人员不必专门处理JMS异常,因为Spring为所有JMS异常提供了一个未经检查的异常,并在JMS代码中重新抛出。 
实战:下面是我在学习过程中的一个入门实例 

1.  在web.xml文件中配置一个spring用的上下文:

<context-param>      <param-name>contextConfigLocation</param-name>      <param-value>/WEB-INF/jmsconfig.xml</param-value>  </context-param>  <!-- 配置Spring容器 -->  <listener>      <listener-class>             org.springframework.web.context.ContextLoaderListener         </listener-class>  </listener>

2.  创建jmsconfig.xml用来装配jms,内容如下:

<?xml version="1.0" encoding="UTF-8"?>     <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"       "http://www.springframework.org/dtd/spring-beans.dtd">       <beans>      <bean id="jmsConnectionFactory"          class="org.springframework.jndi.JndiObjectFactoryBean">          <property name="jndiName">              <value>UIL2ConnectionFactory</value>          </property>      </bean>            <bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">          <property name="jndiName">              <value>topic/scJms</value>          </property>      </bean>            <!--  Spring JmsTemplate config -->      <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">          <property name="connectionFactory">              <bean                  class="org.springframework.jms.connection.SingleConnectionFactory">                  <property name="targetConnectionFactory"                      ref="jmsConnectionFactory"/>              </bean>          </property>      </bean>            <!-- POJO which send Message uses  Spring JmsTemplate --> <!--配置消息发送者-->      <bean id="messageProducer" class="co.transport.jms.MessageProducer">          <property name="template" ref="jmsTemplate"/>          <property name="destination" ref="destination"/>      </bean>            <!--  Message Driven POJO (MDP) -->      <bean id="messageListener" class="co.transport.jms.MessageConsumer"/>            <!--  listener container,MDP无需实现接口 -->      <bean id="listenerContainer"          class="org.springframework.jms.listener.DefaultMessageListenerContainer">          <property name="connectionFactory" ref="jmsConnectionFactory"/>          <property name="destination" ref="destination"/>          <property name="messageListener" ref="messageListener"/>      </bean>  </beans>  

其中: 
        1)   jmsConnectionFactory用的是Jboss自带的一个ConnectionFactory,可以在Jboss的deploy/jms目录下的uil2-service.xml文件中找到。 
      2)  destination使用自定义的,需要在Jboss加一个配置文件,下面会介绍。 
      3)  MessageProducer是消息发送方 
      4)  MessageConsumer实现了一个MessageListener,监听是否收到消息。 

3.  发送和接收消息的class如下: 

MessageProducer.java    public class MessageProducer {      private JmsTemplate template;        private Destination destination;        public void send(final String message) {          template.send(destination, new MessageCreator() {              public Message createMessage(Session session) throws JMSException {                  Message m = session.createTextMessage(message);                  return m;              }          });      }        public void setDestination(Destination destination) {          this.destination = destination;      }        public void setTemplate(JmsTemplate template) {          this.template = template;      }    }  MessageConsumer.java    public class MessageConsumer implements MessageListener {        public void onMessage(Message message) {          System.out.println("****************************************");          System.out.println(message);      }  }  

4.  写一个Servlet作为测试

JmsTest.java(不要忘记在web.xml中配置这个servlet哦!)

public class JmsTest extends HttpServlet {        public void service(HttpServletRequest request, HttpServletResponse response)              throws ServletException, IOException {          PrintWriter pw = response.getWriter();          pw.println("<html>");          pw.println("<head>");          pw.println("</head>");          pw.println("<body>");          try {              ServletContext servletContext = this.getServletContext();              WebApplicationContext wac = WebApplicationContextUtils                      .getRequiredWebApplicationContext(servletContext);              MessageProducer mp = (MessageProducer) wac.getBean("messageProducer");                mp.send("Message!!!!");              pw.println("<h3>success</h3>");          } catch (JmsException e) {              pw.println(e);          }          pw.println("</body>");          pw.println("</html>");      }    }  

5.  在Jboss的deploy/jms目录下创建sc-jms-service.xml 
<?xml version="1.0" encoding="UTF-8"?>     <server>         <mbean code="org.jboss.mq.server.jmx.Topic"              name="jboss.mq.destination:service=Topic,name=somcJms">             <depends optional-attribute-name="DestinationManager">              jboss.mq:service=DestinationManager          </depends>             <depends optional-attribute-name="SecurityManager">              jboss.mq:service=SecurityManager          </depends>             <attribute name="SecurityConf">                 <security>                     <role name="guest" read="true" write="true"/>                     <role name="publisher" read="true" write="true" create="false"/>                     <role name="durpublisher" read="true" write="true" create="true"/>                 </security>             </attribute>         </mbean>     </server>  

6.  将工程达成war包直接放到Jboss的deploy目录下即可,然后启动Jboss访问JmsTest这个Servlet,你会在控制台看到接受到的消息,至此,一个最简单的Jms实例完成了 

转载:http://zhangli-lisa.iteye.com/blog/464586

原创粉丝点击