<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 33,  comments - 70,  trackbacks - 0

     

    說明: 本文并非基礎(chǔ)說明文章,如無基礎(chǔ),請先參閱:
    1. http://wiki.springside.org.cn/display/springside/ActiveMQ
    2. http://wiki.springside.org.cn/display/springside/ActiveMQ-part2
    僅以springside-2.0-RC1版本擴展


    由于為每個POJO類實現(xiàn)自己的MessageConverter ,所以配置xml和使用比較繁瑣。

    一.MessageConverter 擴展 

    springside-2.0-RC1版本中
    <!--  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>
    <!--  OrderMessage converter  -->
        
    <bean id="orderMessageConverter" class="org.springside.bookstore.components.activemq.OrderMessageConverter"/>

    orderMessageConverter MessageConverter實現(xiàn)類。

    但是如果在實際項目中應(yīng)用的話,如果為2個或2個以上的pojo 實現(xiàn)MessageConverter的話,那么就會發(fā)現(xiàn)jmsTemplate讓人比較尷尬的位置,啟動的注入messageConverter也不是,動態(tài)messageConverter也不是, 顯的不是那么平易近人了。

     

    自己的擴展

    <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>
            
    <property name="messageConverter" ref="messageConverter"/>
        
    </bean>

    <!--  Holder Message converter  -->
        
    <bean id="messageConverter" class="com.service.CoverterHolder" />

     

    通過通用的CoverterHolder分發(fā)messageConverter實現(xiàn),可以為多個pojo提供MessageConverter,并且有默認的messageConverter實現(xiàn),并且可以通過 set Map<String, MessageConverter> converters 注入,提供特殊的pojoMessageConverter的實現(xiàn),為真正項目中應(yīng)用提供必要的支持。


    com.service.CoverterHolder 代碼為:

    public class CoverterHolder implements MessageConverter {
        
    private MessageConverter defaultMessageConverter;
        
    private Map<String, MessageConverter> converters = new HashMap<String, MessageConverter>();
        
        
        
    public Message toMessage(Object obj, Session session) throws JMSException {
            String clz 
    = obj.getClass().getName();
            
    if(converters.containsKey(clz)){
                Message message 
    = converters.get(clz).toMessage(obj, session);
                message.setObjectProperty(
    "meta-class", clz);
                
    return message;
            }
    else{
                Message message
    =defaultMessageConverter.toMessage(obj,session);
                message.setObjectProperty(
    "default-meta-class", clz);
                
    return message;
            }

        }


        
        
    public Object fromMessage(Message msg) throws JMSException {
            
    if(msg.getObjectProperty("meta-class"!= null){
                String clz
    = msg.getObjectProperty("meta-class").toString();
                
    if(converters.containsKey(clz)){
                    
    return converters.get(clz).fromMessage(msg);
                }

            }
    else if(msg.getObjectProperty("default-meta-class"!= null){
                
    return defaultMessageConverter.fromMessage(msg);
            }
    else{
                
    throw new JMSException("Msg:[" + msg + "] is not Map");
            }

            
            
    return null;
        }


        
    public void setConverters(Map<String, MessageConverter> converters) {
            
    this.converters = converters;
        }


        
    public void setDefaultMessageConverter(MessageConverter defaultMessageConverter) {
            
    this.defaultMessageConverter = defaultMessageConverter;
        }


    }



    二.為大部分MessageConverter實現(xiàn)自己的默認功能

    DefaultMessageConverter 為默認的MessageConverter實現(xiàn),擺脫重復(fù)繁瑣的MessageConverter AG and AG,懶人的福音。哈哈

    如果沒有特殊的要求,DefaultMessageConverter足以滿足90%以上的要求 。

    DefaultMessageConverter代碼:

    public class DefaultMessageConverter implements MessageConverter {
        
    public Message toMessage(Object obj, Session session) throws JMSException {
            
    // check Type
            ActiveMQObjectMessage objMsg = (ActiveMQObjectMessage) session
                    .createObjectMessage();
            HashMap
    <String, byte[]> map = new HashMap<String, byte[]>();
            
    try {
                
    // POJO must implements Seralizable
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ObjectOutputStream oos 
    = new ObjectOutputStream(bos);
                oos.writeObject(obj);
                map.put(
    "POJO", bos.toByteArray());
                objMsg.setObjectProperty(
    "Map", map);

            }
     catch (IOException e) {
                e.printStackTrace();            
            }

            
    return objMsg;
        }


        
    public Object fromMessage(Message msg) throws JMSException {
            
    if (msg instanceof ObjectMessage) {
                HashMap
    <String, byte[]> map= (HashMap<String, byte[]>) ((ObjectMessage) msg).getObjectProperty("Map");
                 
    try {
                     
    //POJO must implements Seralizable
                     ByteArrayInputStream bis=new ByteArrayInputStream(map.get("POJO"));
                     ObjectInputStream ois
    =new ObjectInputStream(bis);
                     
    return ois.readObject();
                 }
     catch (IOException e) {
                    e.printStackTrace();
                }
     catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }

                 
    return null;
            }
     else {
                
    throw new JMSException("Msg:[" + msg + "] is not Map");
            }

        }



    在Spring中配置

    <!--  Holder Message converter  -->
        
    <bean id="messageConverter" class="com.service.CoverterHolder">        
            
    <property name="defaultMessageConverter">
                
    <bean class="com.service.DefaultMessageConverter"/>
            
    </property>
        
    </bean>

    messageConverter 入住默認的MessageConverter實現(xiàn)。


    三.為特殊的MessageConverter實現(xiàn)提供自己的選擇

    例如 ReportPerdayMessageConverter為特殊的 POJO Coverter。

    ReportPerdayMessageConverter代碼:

    public class ReportPerdayMessageConverter implements MessageConverter {
        
    public Message toMessage(Object obj, Session session) throws JMSException {
            
    //
        }

        
    public Object fromMessage(Message msg) throws JMSException {
            
    //
    }

    }

    com.domain.ReportPerday模型中注入特殊的自己消息轉(zhuǎn)換

    <!--  Holder Message converter  -->
        
    <bean id="messageConverter" class="com.service.CoverterHolder">
            
    <!-- 擴展自己實現(xiàn) converter -->        
            
    <property name="converters">
                
    <map>
                    
    <entry key="com.domain.ReportPerday">
                        
    <bean id="reportPerdayMessageConverter" class="com.service.ReportPerdayMessageConverter"/>                    
                    
    </entry>                
                
    </map>
            
    </property>    
            
    <property name="defaultMessageConverter">
                
    <bean class="com.service.DefaultMessageConverter"/>
            
    </property>
        
    </bean>

    四.Message Driven POJO (MDP) 擴展Adapter

    解決對多個消費者 MDP的分發(fā) 

    ss中配置

    <!--  Message Driven POJO (MDP) -->
        
    <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> 

    明顯感覺<constructor-arg>中對于多個消費者不實用的特性。

     

    自己擴展

    <!--  Message Driven POJO (MDP) -->
        
    <bean id="messageListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
            
    <!--  may be other method -->
            
    <constructor-arg>
                
    <bean class="com.service.MessageConsumerAdapter" >
                    
    <property name="reportPerdayMessageConsumer" ref="reportPerdayMessageConsumer"/>
                
    </bean>        
            
    </constructor-arg>
            
    <!--  may be other method -->
            
    <property name="defaultListenerMethod" value="receive"/>
            
    <!-- custom MessageConverter define -->
            
    <property name="messageConverter" ref="messageConverter"/>
        
    </bean>

    MessageConsumerAdapter代碼
    public class MessageConsumerAdapter {
        
    private ReportPerdayMessageConsumer reportPerdayMessageConsumer;
        
        
    public void receive(Object obj) {
            
    if (obj instanceof ReportPerday) {
                System.out.println((ReportPerday)obj);
            }
     else if (obj instanceof ReportPerday2) {
                System.out.println((ReportPerday2)obj);
            }

        }


        
    public void receive(ReportPerday reportPerday) throws Exception {
            reportPerdayMessageConsumer.sendEmail(reportPerday);
        }

        
    public void receive(ReportPerday2 reportPerday2) throws Exception {
            
    //do other service consumer
            System.out.println("ReportPerday2 Bean do other service consumer ");
        }


        
    public void setReportPerdayMessageConsumer(
                ReportPerdayMessageConsumer reportPerdayMessageConsumer) 
    {
            
    this.reportPerdayMessageConsumer = reportPerdayMessageConsumer;
        }

    }


    MessageConsumerAdapter中可以入住多個要分發(fā)的消費者或者業(yè)務(wù)方法,根據(jù)POJO對象不通而選擇自己的消費者類型。 

     

     

    后話: http://wiki.springside.org.cn ActiveMQ 實用已經(jīng)比較細致的入門講解和展示。再次重申,如果沒基礎(chǔ),請閱讀ss中的文檔。

    本文目的只在搭建更為實用的JMS基礎(chǔ)設(shè)施,如有不明之處,共同討論與學習 :)

    文中代碼如下
    http://www.tkk7.com/Files/hellboys/activemq-example-nojar.zip


    posted on 2007-04-01 21:56 地獄男爵(hellboys) 閱讀(3321) 評論(0)  編輯  收藏 所屬分類: 編程語言(c/c++ java python sql ......)
    <2007年4月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

    常用鏈接

    隨筆分類

    隨筆檔案

    文章檔案

    相冊

    連接

    最新隨筆

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产成人亚洲综合在线| 人人狠狠综合久久亚洲婷婷| 久久久久国产精品免费免费搜索| 亚洲AV无码一区二区乱子伦| 亚洲综合色视频在线观看| 午夜私人影院免费体验区| 9久9久女女免费精品视频在线观看 | 国产91在线|亚洲| 亚洲综合免费视频| 久久精品a亚洲国产v高清不卡 | 在线视频亚洲一区| 亚洲日韩一区精品射精| 亚洲综合一区无码精品| 亚洲欧洲日产国码久在线| 在线观看亚洲AV日韩A∨| 亚洲人成色77777在线观看| 亚洲熟妇自偷自拍另欧美| 亚洲中文字幕无码av永久| 亚洲偷自拍另类图片二区| 国产亚洲视频在线观看| 女人裸身j部免费视频无遮挡| 亚洲人成电影青青在线播放| 亚洲免费视频观看| 亚洲色图激情文学| 亚洲成在人线aⅴ免费毛片| 国产亚洲人成在线影院| 日亚毛片免费乱码不卡一区| 两个人看的www免费高清| 大地影院MV在线观看视频免费| 青娱乐在线免费观看视频| 男人扒开添女人下部免费视频| 亚洲色偷偷色噜噜狠狠99| 99亚洲精品卡2卡三卡4卡2卡| 亚洲欧洲日产韩国在线| 在线精品亚洲一区二区 | 皇色在线视频免费网站| 毛片免费观看的视频在线| 免费中文字幕在线观看| 狠狠亚洲狠狠欧洲2019| 亚洲精品成人久久| 色欲色欲天天天www亚洲伊|