Spring JmsTemplateの設計と解析の実現
3212 ワード
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
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をカバーします.この方法は本当の論理を含みます.
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をカバーします.この方法は本当の論理を含みます.