de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker Class Reference

Inheritance diagram for de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker:

de.fhg.fokus.diameter.DiameterPeer.EventListener List of all members.

Detailed Description

A TansactionWorker maintains a set of Diameter transactions for a Diameter Client.

Author:
Dragos Vingarzan vingarzan -at- fokus dot fraunhofer dot de

Definition at line 46 of file TransactionWorker.java.

Public Member Functions

 TransactionWorker (DiameterPeer dp, long timeout, long checkInterval)
 Construct a TransactionWorker.
boolean sendRequestTransactional (String peerFQDN, DiameterMessage req, TransactionListener tl)
 Sends a Diameter request.
boolean sendRequestTransactional (DiameterMessage req, TransactionListener tl)
 Sends a Diameter request.
DiameterMessage sendRequestBlocking (String peerFQDN, DiameterMessage req)
 Sends a Diameter request and blocks the thread until a Diameter answer returned or timeout.
DiameterMessage sendRequestBlocking (DiameterMessage req)
 Sends a Diameter request and blocks the thread until a Diameter answer returned or timeout.
void recvMessage (String FQDN, DiameterMessage msg)
 Handles the received Diameter answers.
void run ()
 Trigger transaction timeout event.
void shutdown ()
 Shutdown the TransactionLister.

Private Member Functions

synchronized DiameterTransaction addTransaction (DiameterMessage req, TransactionListener tl, boolean blocking)
synchronized DiameterTransaction takeTransaction (DiameterMessage ans)
synchronized DiameterTransaction getTransaction (DiameterMessage msg)
synchronized void timeoutExpired (long now)

Private Attributes

Semaphore sych = new Semaphore(0)
DiameterPeer dp
Vector< DiameterTransactiontransactions = new Vector<DiameterTransaction>()
long timeout = 30000
long checkInterval = 1000
boolean running = true


Constructor & Destructor Documentation

de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.TransactionWorker ( DiameterPeer  dp,
long  timeout,
long  checkInterval 
)

Construct a TransactionWorker.

Parameters:
dp DiameterPeer creating the worker.
timeout Transaction timeout.
checkInterval 

Definition at line 65 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.DiameterPeer.addEventListener(), and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.dp.

00066     {
00067         this.dp = dp;
00068         dp.addEventListener(this);
00069         this.timeout = timeout *1000;
00070         this.checkInterval = checkInterval*1000;
00071         this.start();
00072     }


Member Function Documentation

synchronized DiameterTransaction de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.addTransaction ( DiameterMessage  req,
TransactionListener  tl,
boolean  blocking 
) [private]

Definition at line 74 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.getTransaction(), and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.transactions.

Referenced by de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestBlocking(), and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestTransactional().

00075     {
00076         DiameterTransaction dt = getTransaction(req);
00077         if (dt!=null) return dt;
00078         dt = new DiameterTransaction(req,tl,blocking);
00079         transactions.add(dt);
00080         return dt;
00081     }

synchronized DiameterTransaction de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.takeTransaction ( DiameterMessage  ans  )  [private]

Definition at line 83 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.endToEndID, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.hopByHopID, de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.request, and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.transactions.

Referenced by de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.recvMessage(), de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestBlocking(), and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestTransactional().

00084     {
00085         int i;
00086         DiameterTransaction dt;
00087         for(i=0;i<transactions.size();i++){
00088             dt = transactions.get(i);
00089             if (dt.request.endToEndID == ans.endToEndID &&
00090                 dt.request.hopByHopID == ans.hopByHopID){
00091                     transactions.remove(i);
00092                     return dt;
00093             }
00094         }
00095         return null;
00096     }

synchronized DiameterTransaction de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.getTransaction ( DiameterMessage  msg  )  [private]

Definition at line 98 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.endToEndID, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.hopByHopID, de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.request, and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.transactions.

Referenced by de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.addTransaction().

00099     {
00100         int i;
00101         DiameterTransaction dt;
00102         for(i=0;i<transactions.size();i++){
00103             dt = transactions.get(i);
00104             if (dt.request.endToEndID == msg.endToEndID &&
00105                 dt.request.hopByHopID == msg.hopByHopID)
00106                     return dt;
00107         }
00108         return null;
00109     }

synchronized void de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.timeoutExpired ( long  now  )  [private]

Definition at line 111 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.expires, de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.request, de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sych, de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionListener.timeout(), de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.tl, and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.transactions.

Referenced by de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.run().

00112     {
00113         int i;
00114         DiameterTransaction dt;
00115         for(i=0;i<transactions.size();i++){
00116             dt = transactions.get(i);
00117             if (dt.expires<=now){
00118                 if (dt.tl!=null) dt.tl.timeout(dt.request);
00119 //              synchronized(dt) {
00120                     sych.release();
00121 //                  dt.notifyAll();
00122 //          }
00123                 transactions.remove(i);
00124                 i--;
00125             }
00126         }
00127         
00128     }

boolean de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestTransactional ( String  peerFQDN,
DiameterMessage  req,
TransactionListener  tl 
)

Sends a Diameter request.

Parameters:
peerFQDN Destination host of peer.
req Diameter request to be sent.
tl TransactionListener that handles the corresponding Diameter answer within a transaction.
Returns:
true if Diameter request sent successfully.

Definition at line 139 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.addTransaction(), de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.dp, de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.expires, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagRequest, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.networkTime, de.fhg.fokus.diameter.DiameterPeer.DiameterPeer.sendMessage(), and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.takeTransaction().

Referenced by de.fhg.fokus.diameter.DiameterPeer.DiameterPeer.sendRequestTransactional().

00140     {
00141         boolean sent=false;
00142         DiameterTransaction dt;
00143         if (!req.flagRequest) {
00144             System.err.println("DiameterTransaction:sendMessageTransactional() is only for Requests!");
00145             return false;
00146         }
00147         dt = addTransaction(req,tl,false);
00148         sent = dp.sendMessage(peerFQDN,req);
00149         if (!sent){
00150             takeTransaction(req);
00151             return false;
00152         }
00153         dt.expires = req.networkTime + this.timeout;
00154 
00155         return sent;
00156     }

boolean de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestTransactional ( DiameterMessage  req,
TransactionListener  tl 
)

Sends a Diameter request.

Parameters:
req Diameter request to be sent.
tl TransactionListener that handles the corresponding Diameter answer within a transaction.
Returns:
true if Diameter request sent successfully.

Definition at line 166 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.addTransaction(), de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.dp, de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.expires, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagRequest, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.networkTime, de.fhg.fokus.diameter.DiameterPeer.DiameterPeer.sendMessage(), and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.takeTransaction().

00167     {
00168         boolean sent=false;
00169         DiameterTransaction dt;
00170         if (!req.flagRequest) {
00171             System.err.println("DiameterTransaction:sendMessageTransactional() is only for Requests!");
00172             return false;
00173         }
00174         dt = addTransaction(req,tl,false);
00175         sent = dp.sendMessage(req);
00176         if (!sent){
00177             takeTransaction(req);
00178             return false;
00179         }
00180         dt.expires = req.networkTime + this.timeout;
00181 
00182         return sent;
00183     }

DiameterMessage de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestBlocking ( String  peerFQDN,
DiameterMessage  req 
)

Sends a Diameter request and blocks the thread until a Diameter answer returned or timeout.

Parameters:
peerFQDN Destination host of peer.
req Diameter request to be sent.
Returns:
Diameter answer returned within the transaction; null if timeout.

Definition at line 194 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.addTransaction(), de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.answer, de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.dp, de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.expires, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagRequest, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.networkTime, de.fhg.fokus.diameter.DiameterPeer.DiameterPeer.sendMessage(), de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sych, and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.takeTransaction().

Referenced by de.fhg.fokus.diameter.DiameterPeer.DiameterPeer.sendRequestBlocking().

00195     {
00196         boolean sent;
00197         DiameterTransaction dt;
00198         if (!req.flagRequest) {
00199             System.err.println("DiameterTransaction:sendMessageBlocking() is only for Requests!");
00200             return null;
00201         }
00202         dt = addTransaction(req,null,true);
00203         sent = dp.sendMessage(peerFQDN,req);
00204         if (!sent){
00205             takeTransaction(req);
00206             return null;
00207         }
00208         dt.expires = req.networkTime + this.timeout;
00209         try {
00210 //          synchronized(dt) {
00211             sych.acquire(); 
00212 //          dt.wait();
00213 //          }
00214         } catch (InterruptedException e) {
00215             e.printStackTrace();
00216         }
00217         
00218         return dt.answer;
00219     }   

DiameterMessage de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestBlocking ( DiameterMessage  req  ) 

Sends a Diameter request and blocks the thread until a Diameter answer returned or timeout.

Parameters:
req Diameter request to be sent.
Returns:
Diameter answer returned within the transaction; null if timeout.

Definition at line 228 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.addTransaction(), de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.answer, de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.dp, de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.expires, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagRequest, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.networkTime, de.fhg.fokus.diameter.DiameterPeer.DiameterPeer.sendMessage(), de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sych, and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.takeTransaction().

00229     {
00230         boolean sent;
00231         DiameterTransaction dt;
00232         if (!req.flagRequest) {
00233             System.err.println("DiameterTransaction:sendMessageBlocking() is only for Requests!");
00234             return null;
00235         }
00236         dt = addTransaction(req,null,true);
00237         sent = dp.sendMessage(req);
00238         if (!sent){
00239             takeTransaction(req);
00240             return null;
00241         }
00242         dt.expires = req.networkTime + this.timeout;
00243         try {
00244 //          synchronized(dt) {
00245             sych.acquire(); 
00246 //          dt.wait();
00247 //          }
00248         } catch (InterruptedException e) {
00249             e.printStackTrace();
00250         }
00251         
00252         return dt.answer;
00253     }   

void de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.recvMessage ( String  FQDN,
DiameterMessage  msg 
) [virtual]

Handles the received Diameter answers.

They will be handled by corresponding TransactionListeners.

Parameters:
FQDN FQDN of the origin host.
msg Received Diameter message.

Implements de.fhg.fokus.diameter.DiameterPeer.EventListener.

Definition at line 262 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.answer, de.fhg.fokus.diameter.DiameterPeer.data.DiameterMessage.flagRequest, de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionListener.receiveAnswer(), de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.request, de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sych, de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.takeTransaction(), and de.fhg.fokus.diameter.DiameterPeer.transaction.DiameterTransaction.tl.

00263     {
00264         if (msg.flagRequest) return;
00265         DiameterTransaction dt; 
00266         dt = takeTransaction(msg);
00267         if (dt==null) return;
00268         dt.answer = msg;
00269 //      synchronized(dt) {
00270             sych.release();
00271 //          dt.notifyAll();
00272 //      }
00273         if (dt.tl!=null) dt.tl.receiveAnswer(FQDN,dt.request,msg);
00274     }

void de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.run (  ) 

Trigger transaction timeout event.

Definition at line 279 of file TransactionWorker.java.

References de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.checkInterval, de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.running, and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.timeoutExpired().

00280     {
00281         while(running){
00282             timeoutExpired(System.currentTimeMillis());
00283             try {
00284                 Thread.sleep(checkInterval);
00285             } catch (InterruptedException e) {
00286                 e.printStackTrace();
00287             }
00288         }
00289     }

void de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.shutdown (  ) 

Shutdown the TransactionLister.

Definition at line 296 of file TransactionWorker.java.

Referenced by de.fhg.fokus.diameter.DiameterPeer.DiameterPeer.shutdown().

00297     {
00298         this.running = false;
00299     }


Member Data Documentation

Semaphore de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sych = new Semaphore(0) [private]

Definition at line 48 of file TransactionWorker.java.

Referenced by de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.recvMessage(), de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestBlocking(), and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.timeoutExpired().

DiameterPeer de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.dp [private]

Definition at line 50 of file TransactionWorker.java.

Referenced by de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestBlocking(), de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.sendRequestTransactional(), and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.TransactionWorker().

Vector<DiameterTransaction> de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.transactions = new Vector<DiameterTransaction>() [private]

Definition at line 52 of file TransactionWorker.java.

Referenced by de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.addTransaction(), de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.getTransaction(), de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.takeTransaction(), and de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.timeoutExpired().

long de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.timeout = 30000 [private]

Definition at line 54 of file TransactionWorker.java.

long de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.checkInterval = 1000 [private]

Definition at line 55 of file TransactionWorker.java.

Referenced by de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.run().

boolean de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.running = true [private]

Definition at line 56 of file TransactionWorker.java.

Referenced by de.fhg.fokus.diameter.DiameterPeer.transaction.TransactionWorker.run().


The documentation for this class was generated from the following file:
Generated on Thu Oct 23 04:07:37 2008 for Open IMS Core JavaDiameterPeer by  doxygen 1.5.2