package org.jboss.resteasy.test.cdi.basic.resource; import java.util.concurrent.CountDownLatch; import javax.annotation.Resource; import javax.ejb.Schedule; import javax.ejb.SessionContext; import javax.ejb.Stateless; import javax.ejb.Timeout; import javax.ejb.Timer; import javax.ejb.TimerService; import javax.interceptor.AroundTimeout; import javax.interceptor.InvocationContext; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.core.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Path("timer") @Stateless public class OutOfBandResource implements OutOfBandResourceIntf { private static final Logger log = LoggerFactory.getLogger(OutOfBandResource.class); private static final String TIMER_INFO = "timerInfo"; private static CountDownLatch latch = new CountDownLatch(1); private static boolean timerExpired; private static boolean timerInterceptorInvoked; @Resource private SessionContext ctx; @Resource private TimerService timerService; @Override @GET @Path("schedule") public Response scheduleTimer() { timerService = ctx.getTimerService(); if (timerService != null) { timerService.createTimer(1000, TIMER_INFO); log.info("timer scheduled"); return Response.ok().build(); } else { return Response.serverError().build(); } } @Schedule(second = "1") public void automaticTimeout(Timer timer) { log.info("entering automaticTimeout()"); timerExpired = true; latch.countDown(); } @Override @GET @Path("test") public Response testTimer() throws InterruptedException { log.info("entering testTimer()"); latch.await(); if (!timerInterceptorInvoked) { return Response.serverError().entity("timerInterceptorInvoked == false").build(); } if (!timerExpired) { return Response.serverError().entity("timerExpired == false").build(); } return Response.ok().build(); } @Override @Timeout public void timeout(Timer timer) { log.info("entering timeout()"); if (TIMER_INFO.equals(timer.getInfo())) { timerExpired = true; latch.countDown(); } } @AroundTimeout public Object aroundTimeout(InvocationContext ctx) throws Exception { timerInterceptorInvoked = true; log.info("aroundTimeout() invoked"); return ctx.proceed(); } }