花钱的年华

--今天开始成为主站

用户操作
[即时聊天] [发私信] [加为好友]
江南白衣ID:calvinxiu
691007次访问,排名53好友0人,关注者38
calvinxiu的文章
原创 161 篇
翻译 0 篇
转载 0 篇
评论 646 篇
江南白衣的公告

肖桦,江南白衣,
开源项目SpringSide
春天的旁边
发起者

最近评论
calvinxiu:
发版本最痛苦的事情,就是刚发完之后忽然又有了一个比较重要的更新。

推荐大家下载3.0.3.1 (2mb)

1.简化了目录结构,感觉又清爽了不少。
2.消除了最后一块需要逐个Class写配置文件的地方(applicationContext.xml中的sessionFactory的mapping class)。
dreaming:恭喜~
hongyi:还是一头雾水,郁闷,为啥有这么多东东,叫人头大
suncheng_hong:用过appfuse,但springside还没有尝试过。
suncheng_hong:很想尝试一下。
文章分类
    收藏
      相册
      Blog用图
      Friends
      @_@
      Anders小明
      buaawhl
      cac
      canonical
      cctvx1
      david.turing
      femto
      g9
      JohnsonQu
      Michael Chen
      Raimundox
      robbin
      SimonLei
      totodo
      wuyu
      周爱民
      孟岩
      差沙
      庄表伟
      落魄的程序员
      透明
      郁也风
      铁手
      银狐999
      飞云小侠
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 ActiveMQ4.1+Spring2.0的Message Driven POJO收藏

      新一篇: SpringSide的Coding Standards | 旧一篇: Spring2.0,Struts2.0,SpringSide 2.0--SpringSide 2.0M1 Release Notes

      作者:cctvx1江南白衣

      本文来自SpringSide WIki,请留意Wiki上的更新

      1.概述

      1.1 JMS与ActiveMQ特性  

         JMS始终在JavaEE五花八门的协议里,WebService满天飞的时候占一位置,是因为它可以:

      • 可以把不影响用户执行结果又比较耗时的任务(比如发邮件通知管理员)异步的扔给JMS 服务端,而尽快的把屏幕返还给用户,且服务端能够多线程排队响应高并发的请求。
      • 可以在Java世界里达到最高的解耦。客户端与服务端无需直连,甚至无需知晓对方是谁、在哪里、有多少人,只要对流过的信息作响应就行了,在企业应用环境复杂时作用明显。

          ActiveMQ 的特性:

      • 完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,也是Apache Geronimo默认的JMS provider。
      • POJO withdout EJB Container,不需要实现EJB繁琐复杂的Message Bean接口和配置。
      • Spring Base,可以使用Spring的各种特性如IOC、AOP 。
      • Effective,基于Jencks的JCA Container实现 pool connection,control transactions and manage security。 

      1.2 SpringSide 的完全POJO的JMS方案   

        SpringSide在BookStore示例中,演示了用户下订单时,将发通知信到用户邮箱的动作,通过JMS交给JMS服务端异步完成,避免了邮件服务器的堵塞而影响用户的下订。

        全部代码于examples\bookstore\src\java\org\springside\bookstore\components\activemq 目录中。

        一个JMS场景通常需要三者参与:

      • 一个POJO的的Message Producer,负责使用Spring的JMS Template发送消息。
      • 一个Message Converter,负责把Java对象如订单(Order)转化为消息,使得Producer能够直接发送POJO。
      • 一个MDP Message Consumer,负责接收并处理消息。

        SpringSide 2.0采用了ActiveMQ 4.1-incubator-SNAPSHOT 与Spring 2.0 集成,比SS 1.0M3版本有三个值得留意的特点,使得代码中几乎不见一丝JMS的侵入代码:

      1. 采用Spring2.0的Schema式简化配置。
      2. 实现Message Converter转化消息与对象,使得Producer能够直接发送POJO而不是JMS Message。
      3. 使用了Spring的DefaultMessageListenerContainer与MessageListenerAdapter,消息接收者不用实现MessageListener 接口。

      2.引入ActiveMQ的XSD

        ActiveMQ4.1 响应Spring 2.0号召,支持了引入XML Schema namespace的简单配置语法,简化了配置的语句。 

        在ApplicationContext.xml(Spring的配置文件)中引入ActiveMQ的XML Scheam 配置文件),如下:

      <beans
        
      xmlns="http://www.springframework.org/schema/beans"
        xmlns:amq
      ="http://activemq.org/config/1.0"
        xmlns:xsi
      ="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation
      ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://activemq.org/config/1.0 http://people.apache.org/repository/org.apache.activemq/xsds/activemq-core-4.1-incubator-SNAPSHOT.xsd"
      >
      由于ActiveMQ的那个XSD有部分错误,因此使用的是自行修改过的XSD,配置ClassPath中的schema.

      在ClassPath 下面建立META-INF\spring.schemas 内容如下。这个spring.schemas是spring自定义scheam的配置文件,请注意"http:\://"部分写法

      http\://people.apache.org/repository/org.apache.activemq/xsds/activemq-core-4.1-incubator-SNAPSHOT.xsd=/activemq-core-4.1-incubator-SNAPSHOT.xsd

      3. 配置方案

      3.1 基础零件 

      1. 配置ActiveMQ Broker  

         暂时采用在JVM中嵌入这种最简单的模式,  当spring初始化时候,ActiveMQ embedded Broker 就会启动了。

      <!--  lets create an embedded ActiveMQ Broker -->
       
      <amq:broker useJmx="false" persistent="false">
            
      <amq:transportConnectors>
                  
      <amq:transportConnector uri="tcp://localhost:0"/>
           
      </amq:transportConnectors>
       
      </amq:broker>

       

      2. 配置(A)ConnectionFactory

        由于前面配置的Broker是JVM embedded 所以URL为:vm://localhost

      <!--  ActiveMQ connectionFactory to use  -->
       
      <amq:connectionFactory id="jmsConnectionFactory" brokerURL="vm://localhost"/>

      3 配置(B)Queue

      <!--  ActiveMQ destinations to use  -->
       
      <amq:queue name="destination" physicalName="org.apache.activemq.spring.Test.spring.embedded"/>

       

      4. 配置(C)Converter

         配置Conveter,使得Producer能够直接发送Order对象,而不是JMS的Message对象。

      <!--  OrderMessage converter  -->
       
      <bean id="orderMessageConverter" class="org.springside.bookstore.components.activemq.OrderMessageConverter"/>  

       

      3.2  发送端 

      1 配置JmsTemplate

         Spring提供的Template,绑定了(A)ConnectionFactory与(C)Converter。

      <!--  Spring JmsTemplate config -->
       
      <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        
      <property name="connectionFactory">
         
      <!--  lets wrap in a pool to avoid creating a connection per send -->
         
      <bean class="org.springframework.jms.connection.SingleConnectionFactory">
          
      <property name="targetConnectionFactory" ref="jmsConnectionFactory"/>
         
      </bean>
        
      </property>
        
      <!-- custom MessageConverter -->
        
      <property name="messageConverter" ref="orderMessageConverter"/>
       
      </bean>

       

      2.Producer

         消息发送者,使用JmsTemplate发送消息,绑定了JmsTemplate(含A、C 与(B)Queue。

      <!-- POJO which send Message uses  Spring JmsTemplate,绑定JMSTemplate 与Queue -->
       
      <bean id="orderMessageProducer" class="org.springside.bookstore.components.activemq.OrderMessageProducer">
        
      <property name="template" ref="jmsTemplate"/>
        
      <property name="destination" ref="destination"/>
       
      </bean>

       

      3.3 接收端

        1.接收处理者(MDP)

          使用Spring的MessageListenerAdapter,指定负责处理消息的POJO及其方法名,绑定(C)Converter。

       

        <!--  Message Driven POJO (MDP),绑定Converter -->
       
      <bean id="messageListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
        
      <constructor-arg>
         
      <bean class="org.springside.bookstore.components.activemq.OrderMessageConsumer">
          
      <property name="mailService" ref="mailService"/>
         
      </bean>
        
      </constructor-arg>
        
      <!--  may be other method -->
        
      <property name="defaultListenerMethod" value="sendEmail"/>
        
      <!-- custom MessageConverter define -->
        
      <property name="messageConverter" ref="orderMessageConverter"/>
       
      </bean> 

       

      2. listenerContainer

          负责调度MDP, 绑定(A) connectionFactory, (B)Queue和接收处理者(MDP)。

       

      <!--  this is the attendant message listener container -->
       
      <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>

       

        互相绑定的关系有点晕,发送端和接收端都以不同形式绑定了(A) connectionFactory, (B)Queue和 (C)Converter.

       


       

       上半章完,关于Jencks(JCA Server)与持久化请等待下半章。

      发表于 @ 2006年12月01日 10:14:00|评论(loading...)|编辑

      新一篇: SpringSide的Coding Standards | 旧一篇: Spring2.0,Struts2.0,SpringSide 2.0--SpringSide 2.0M1 Release Notes

      评论

      #Jamsa 发表于2006-12-01 17:23:00  IP: 220.168.30.*
      白衣大哥,我现在也正在学习ActiveMQ
      http://jamsa.javaeye.com/blog/31100
      我一直没有找到Hibernate+ActiveMQ时JTA事务配置的方法。
      你能否在这个方案中介绍一下这方面的配置,谢谢
      发表评论  


      登录
      Csdn Blog version 3.1a
      Copyright © 江南白衣