Honestly, this sounds like something that should be handled at the application server level. What server are you using?
If you're using Tomcat via the Tomcat connector, take a look at reply timeouts on [1]. If you're not using Tomcat, I'm sure there are similar options in other app servers. -Brian [1] - http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html On Mon, Jan 11, 2010 at 12:48 PM, Jorge Sousa <jorge.so...@wit-software.com>wrote: > Hi, > > First of all sorry for my bad english :) > I need to implement a feature in my application, that will enable me to > define the timeout of every request. > I tried to create a Interceptor and put the main thread on wait, while > other 2 threads, one will handle the time, and the other will make the > invocation.invoke(). The first of this two threads to complete, will call > the notify of the main thread and the correspondent result is returned. > > I tried this approach, but i get a null pointer exception in the thread > that tried to execute the invocation.invoke(). > > Is there any suggestions? > > If some one need more explanations, please let me know. > You can find the code bellow. > > Thanks in advance, > Jorge Sousa from Portugal > > Code: > > public class TimeoutInterceptor extends AbstractInterceptor { > > private static final ExecutorService threadPool = > Executors.newCachedThreadPool(); > > @Override > public String intercept(ActionInvocation invocation) throws Exception { > Invocator invocator = new Invocator(invocation, this); > TimeoutWatcher timeoutWatcher = new TimeoutWatcher(this); > > threadPool.execute(invocator); > threadPool.execute(timeoutWatcher); > > this.wait(); > if (invocator.getResult().equalsIgnoreCase("running")) { > throw new TimeOutException(); > } else { > return invocator.getResult(); > } > > } > > private class TimeoutWatcher implements Runnable { > > private AbstractInterceptor abstractInterceptor; > > public TimeoutWatcher(AbstractInterceptor abstractInterceptor) { > this.abstractInterceptor = abstractInterceptor; > } > > @Override > public void run() { > try { > Thread.sleep(10000); > } catch (InterruptedException e) { > } > synchronized (abstractInterceptor) { > abstractInterceptor.notify(); > } > } > } > > private class Invocator implements Runnable { > > private ActionInvocation invocation; > private String result = "running"; > private AbstractInterceptor abstractInterceptor; > > public Invocator(ActionInvocation invocation, AbstractInterceptor > abstractInterceptor) { > this.invocation = invocation; > this.abstractInterceptor = abstractInterceptor; > } > > @Override > public void run() { > try { > result = invocation.invoke(); > synchronized (abstractInterceptor) { > abstractInterceptor.notify(); > } > } catch (Exception e) { > result = "error"; > } > } > > public String getResult() { > return result; > } > } > > } > > > > > >