Search code examples
javajakarta-eetimeoutstateless

How to set timeout value for a @WebMethod in a @Stateless bean?


I am trying to figure out if it is possible to set the timeout value for a web method in a @Stateless bean. Or even if it is possible. I have searched quite a bit and found nothing related to this question.

Example:

@WebService
@Stateless
public class Test {

    @WebMethod
    @WebResult(name = "hello")
    public String sayHello(){
        return "Hello world";
    }
}

Thanks a lot in advance for any answers.


Solution

  • So after searching and learning a little bit I have solved this problem by doing the following: I have created a stateless Bean that contains an @Asynchronous method:

    @Asynchronous
    public Future<String> sayHelloAsync() 
    {
         //do something time consuming ...
         return new AsyncResult<String>("Hello world");
    }
    

    Then in a second bean exposing its method as Web Services I have done the following:

    @WebService
    @Stateless
    public class Test {
    
         @EJB
         FirstBean myFirstBean;//first bean containing the Async method.
    
        /**
         * Can be used in futher methods to follow
         * the running web service method
         */
        private Future<String> myAsyncResult;
    
        @WebMethod
        @WebResult(name = "hello")
        public String sayHello(@WebParam(name = "timeout_in_seconds") long timeout)
        {
            myAsyncResult = myFirstBean.sayHelloAsync();
            String myResult = "Service is still running";
            if(timeout>0)
            {
                try {
                    myResult= myAsyncResult.get(timeout, TimeUnit.SECONDS);
                } catch (InterruptedException e) {
                    myResult="InterruptedException occured";
                } catch (ExecutionException e) {
                    myResult="ExecutionException occured";
                } catch (TimeoutException e) {
                    myResult="The timeout value "+timeout+" was reached."+ 
                                     " The Service is still running.";
                }
            }
            return myResult;
        }
    }
    

    If the timeout is set, then the client will wait this amount of time until it is reached. The process still has to run in my case. I hope it will help others.