package org.jboss.resteasy.test.cdi.interceptors.resource; import javax.annotation.Resource; import javax.ejb.SessionContext; import javax.ejb.Stateless; import javax.ejb.Timeout; import javax.ejb.Timer; import javax.ejb.TimerService; import javax.inject.Inject; 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 java.util.concurrent.CountDownLatch; import java.util.logging.Logger; @Path("timer") @Stateless public class TimerInterceptorResource implements TimerInterceptorResourceIntf { private static final String TIMER_INFO = "timerInfo"; private static CountDownLatch latch = new CountDownLatch(1); private static boolean timerExpired; private static boolean timerInterceptorInvoked; @Inject private Logger log; @Resource private SessionContext ctx; private TimerService timerService; @Override @GET @Path("schedule") public Response scheduleTimer() { log.info("entering 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(); } } @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(); } }