Spring JmsTemplateの設計と解析の実現


SpringにおけるJmsTemplateは包装Producr/SenderにおけるSend方法及びSubscriber/Consmerにおけるreceive方法により、発送過程におけるConnectionとSessionの作成及びJMSプロバイダとの接続を引き継いだ.ここはSession CallbackとJmsTemplateの関係に関連しています.Session Callbackはorg.springframe ebook.jms.comの一つのインターフェースで定義されています.中には一つの方法Object doInJms(Session session)throws JMSExceptionだけが定義されています.
public
インターフェースSession Callback{
  
/**    * Execute any number of operations against the supplied JMS    * @@link Session、possibly returning a relt.    * @param session the JMS Session    * @return a result object from working with the Session、if any(so can be null)        * @throws javax.jms.JMSException if thrown by JMS API methods    */
  Object doInJms(Session session)
throws JMSException;
)
JmsTemplateではObject execute(Session Callback action)throws JMSExceptionという方法を定義していますが、この方法はObject execute(Session Callback action、booton startCon)throws JMSExceptionを呼び出します.
public Object execute(Session Callback action、
bootlean startConnection)
throws JmsException{
    Asert.notNull(action)
「Callback object must not be null」);
    Connection conToClose=
null
    Session session ToClose=
null
    
try{
      Session session ToUse=Connection FactoryUtils.doGet Transation alSession
          get Connection Factory()
this.tractional Resource Factory,startConnection);
      
if(session ToUse==
null){
        conToClose=createConnection();
        session ToClose=createSession;
        
if(startConnection){
          コンサートToClose.start()
        }
        session ToUse=session ToClose;
      }
      
if(logger.isDebugEnbaled){
        logger.debug(
「Executing calback on JMS Session:」+session ToUse);
      }
      
return action.doInJms(session ToUse);
    }
    
catch(JMSException ex){
      
throw convertJmsAcception(ex)
    }
    
finally{
      JmsUtils.closeSession(session ToClose)
      Connection FactoryUtils.release Connection;
    }
  }
主にsend()とreceive()の方法のために必要なConnectionとSessionの接続を準備し、send()/receive()のメソッドを呼び出すたびに、このexecute()のメソッドを呼び出す.
public
void send(Message Creator message Creator)
throws JmsException{
    Destination default Destination=get Default Destination()
    
if(default Destination!=
null){
      send(default Destination、message Creator)
    }
    
else{
      send(get RequiredDefault Destination Name(),message Creator);
    }
  }
  
public
void send(
final Destination destination、
final Message Creator Message Creator)
throws JmsException{
    execute(
new Session Callback(){
      
public Object doInJms(Session session)
throws JMSException{
        doSend(session、destination、message Creator);
        
return
null
      }
    },
false;
  }
send(final Destination)で、final Message Creator Message Creator)throws JmsExceptionメソッドでexecute()メソッドを呼び出すと匿名のクラスに入ります.この匿名クラスはSession Callbackインターフェースを実現し、doInJmsをカバーします.この方法は本当の論理を含みます.