Thank you for this supersonic response. I will try it for sure. Thanks again Marcin Skladaniec On 13/10/2004, at 4:32 PM, Jason Wyatt wrote: > Hi Marcin, >   > I had a similar problem with xmlrpc, no way to set the timeout, so I > wrote a utility class to add this. The other thing I wanted was for > any exceptions that were caught in the thread that actually performs > the xmlrpc.execute to be passed to the object that created the thread, > and then rethrown. I don't know if there was an easier way to do this, > but it seems to work OK. I've been using this in production on several > projects with no major problems so far. >   > Code follows... forgive the lack of docco :) >   > Regards > Jason >   > -- > Falun Gong: A peaceful meditation practice under persecution in China > http://www.falundafa.org > > > Truth - Compassion - Forbearance >   >   > package common.util.xmlrpc; >   > /** >  *

Title:  TimedXmlRpcClient

>  *

Description: This XmlRpcClient simply adds a connection timeout, > after >  *  which if the XML-RPC call did not complete, an IOException is > thrown.

>  *

Copyright: Copyright (c) 2002

>  *

Company:

>  * @author  Jason Wyatt >  * @version 1.0 >  */ > > import java.util.Vector; > import java.io.IOException; > import java.net.MalformedURLException; >   > import org.apache.xmlrpc.*; >   > public class TimedXmlRpcClient implements Runnable > { >   private XmlRpcClient xmlRpcClient; >   private String hostname; >   private int ip; >   private int connectTimeout=30000; // 30 seconds default >   private String remoteFunction; >   private Vector params; >   private Object returnValue=null; >   private XmlRpcException xmlRpcException=null; >   private IOException ioException=null; >   private MalformedURLException malformedURLException=null; >   >   TimedXmlRpcClient(String hostname, int ip, int connectTimeout, > String remoteFunction, Vector params) >   { >     this.hostname=hostname; >     this.ip=ip; >     this.connectTimeout=connectTimeout; >     this.remoteFunction=remoteFunction; >     this.params=params; >   } >   >   >  public static Object execute(String hostname, int ip, int > connectTimeout, String remoteFunction, Vector params) throws > XmlRpcException, >     IOException, MalformedURLException >   { >     TimedXmlRpcClient client=new > TimedXmlRpcClient(hostname,ip,connectTimeout,remoteFunction,params); >   >     Thread t = new Thread(client); >     t.start(); >     try >     { >       t.join(connectTimeout); // exit the thread once it > has completed, or after timeout >     } >     catch (InterruptedException ex) >     { >     } >   >     // if an exception occurred while executing the remote call, throw > it again >     // from here >     IOException ex=client.getIOException(); >     if(ex!=null) >       throw ex; >   >     XmlRpcException ex2=client.getXmlRpcException(); >     if(ex2!=null) >       throw ex2; >   >     MalformedURLException ex3=client.getMalformedURLException(); >     if(ex3!=null) >       throw ex3; >   >     Object returnVal=client.getReturnVal(); >     if(returnVal==null) >      throw new IOException("Operation timed out"); >   >     return returnVal; >   } >   >   >   public void run() >   { >     try >     { >       xmlRpcClient=new XmlRpcClient(hostname, ip); >       returnValue=xmlRpcClient.execute(remoteFunction, params); >     } >     catch (MalformedURLException ex) >     { >       malformedURLException=ex; >     } >     catch (IOException ex2) >     { >       ioException=ex2; >     } >     catch(XmlRpcException ex3) >     { >       xmlRpcException=ex3; >     } >   } >   >   public Object getReturnVal() >   { >     return returnValue; >   } >   >   public XmlRpcException getXmlRpcException() >   { >     return xmlRpcException; >   } >   >   public IOException getIOException() >   { >     return ioException; >   } >   >   public MalformedURLException getMalformedURLException() >   { >     return malformedURLException; >   } > >   public static void main(String[] args) >   { >     try >     { >       Vector params=new Vector(); >       params.add( "select table_name from all_tables"); >       > TimedXmlRpcClient.execute("localhost",32000,5,"queryHandler.sqlQuery",p > arams); >     } >     catch (Exception ex) >     { >       System.err.println("Error calling TimedXmlRpcClient:"); >       ex.printStackTrace(); >     } >   } > } >   >   >   >   > > > From: Marcin Skladaniec [mailto:marcin@ish.com.au] > Sent: Wednesday, 13 October 2004 4:02 PM > To: xmlrpc-user@ws.apache.org > Subject: XmlRpc Client won't die ... > > Hello ! > I have a XmlRpcClient executing an rpc method on very unreliable > server. I have to force quit XmlRpcClient.execute() from time to time, > but I can't. I have even created a separate Thread for it, and I'm > quitting the Thread after timeout. It is working but not always, when > server receives xmlrpc request and freezes without any sign of life my > thread is uninterruptible. Is my approach to this problem right or am > I missing something ? Does anyone created some other workaround for > missing timeout in XmlRpc framework ? > > > This is the impoortant part of my code: > > > public SpacialThread(String pRemoteDatabaseURL, String pXmlRpcMethod, > Vector pXmlRpcParameters) { > super(); > > xmlRpcResponse = null; > > xmlRpcMethod = pXmlRpcMethod; > xmlRpcParameters = pXmlRpcParameters; > // See setResponse > hasReceivedResponse = false; > hasBeenInterrupted = false; > > try { > client = new XmlRpcClient(pRemoteDatabaseURL); > } catch (java.net.MalformedURLException e) { > logger.error("(hash: " + hashCode() + "): > java.net.MalformedURLException thrown:\n" > + e); > } > > start(); > } > > > public void run() { > try { > // This is a blocking call... > logger.debug("(hash: " + hashCode() + "): Attempting Xml Rpc > transaction."); > // Set response explicitly (this should be thread safe?) > Object response = client.execute(xmlRpcMethod, xmlRpcParameters); > setResponse(response); > > if (isInterrupted()) { > hasBeenInterrupted = true; > logger.error("(hash: " + hashCode() + "): Xml Rpc transaction > interrupted explicitly. Exiting. (Communication with remote > abandoned)"); > } else { > logger.debug("(hash: " + hashCode() + "): Returned from Xml Rpc > transaction."); > } > > } catch (Exception e) { > // Something else gone wrong... log the error and leave the exception > for reference. > logger.error("(hash: " + hashCode() + "): Xml Rpc transaction > interrupted abormally. Exiting. (Communication with remote > abandoned)"); > setException(e); > } finally { > // Regardless of the situation, clean up and release the network > resources (hopefully) > logger.debug("(hash: " + hashCode() + "): Xml Rpc transaction > finilizing - releasing resources."); > client = null; > } > } > > Cheers > Marcin Skladaniec >