@Override public synchronized void start(final StartContext context) throws StartException { logger.debug("Starting timerservice for timedObjectId: " + getInvoker().getTimedObjectId()); final EJBComponent component = ejbComponentInjectedValue.getValue(); this.transactionManager = component.getTransactionManager(); this.tsr = component.getTransactionSynchronizationRegistry(); final TimedObjectInvoker invoker = timedObjectInvoker.getValue(); if (invoker == null) { throw MESSAGES.invokerIsNull(); } final List<ScheduleTimer> timers = new ArrayList<ScheduleTimer>(); for (Map.Entry<Method, List<AutoTimer>> entry : autoTimers.entrySet()) { for (AutoTimer timer : entry.getValue()) { timers.add( new ScheduleTimer( entry.getKey(), timer.getScheduleExpression(), timer.getTimerConfig())); } } // restore the timers started = true; restoreTimers(timers); // register ourselves to the TimerServiceRegistry (if any) if (timerServiceRegistry != null) { timerServiceRegistry.registerTimerService(this); } }
public void invokeTimeoutMethod(final Timer timer) { final EJBComponent component = (EJBComponent) getComponent(); final Method method = component.getTimeoutMethod(); if (method == null) { throw MESSAGES.componentTimeoutMethodNotSet(component.getComponentName()); } invokeTimeoutMethod(method, timer); }
@Override public Object getInstance() { // get the current invocation context and the EJBComponent out of it final InterceptorContext currentInvocationContext = CurrentInvocationContext.get(); final EJBComponent ejbComponent = (EJBComponent) currentInvocationContext.getPrivateData(Component.class); if (ejbComponent == null) { throw MESSAGES.failToGetEjbComponent(currentInvocationContext); } return ejbComponent.getTimerService(); }
@Override public void setRollbackOnly() throws IllegalStateException { // NOT_SUPPORTED and NEVER will not have a transaction context, so we can ignore those if (getCurrentTransactionAttribute() == TransactionAttributeType.SUPPORTS) { throw MESSAGES.setRollbackOnlyNotAllowedForSupportsTxAttr(); } super.setRollbackOnly(); }
@Override public void setRollbackOnly() throws IllegalStateException { // NOT_SUPPORTED and NEVER will not have a transaction context, so we can ignore those if (getCurrentTransactionAttribute() == TransactionAttributeType.SUPPORTS) { throw new IllegalStateException( "EJB 3.1 FR 13.6.2.9 getRollbackOnly is not allowed with SUPPORTS attribute"); } super.setRollbackOnly(); }
private EjbComponentInstance acquireInstance() { final EjbComponentInstance instance; if (pool != null) { instance = pool.get(); } else { instance = (EjbComponentInstance) ejbComponent.createInstance(); } return instance; }
@Override public synchronized void start(final StartContext context) throws StartException { if (logger.isDebugEnabled()) { logger.debug("Starting timerservice for timedObjectId: " + getInvoker().getTimedObjectId()); } final EJBComponent component = ejbComponentInjectedValue.getValue(); this.transactionManager = component.getTransactionManager(); this.tsr = component.getTransactionSynchronizationRegistry(); final TimedObjectInvoker invoker = timedObjectInvoker.getValue(); if (invoker == null) { throw EjbLogger.ROOT_LOGGER.invokerIsNull(); } started = true; // register ourselves to the TimerServiceRegistry (if any) if (timerServiceRegistry != null) { timerServiceRegistry.registerTimerService(this); } listenerHandle = timerPersistence .getValue() .registerChangeListener(getInvoker().getTimedObjectId(), new TimerRefreshListener()); }
@Override public void callTimeout(final TimerImpl timer, final Method timeoutMethod) throws Exception { final EjbComponentInstance instance = acquireInstance(); boolean discarded = false; try { instance.invokeTimeoutMethod(timeoutMethod, timer); } catch (Exception ex) { // Detect app exception if (ejbComponent.getApplicationException(ex.getClass(), timeoutMethod) != null) { // it's an application exception, just throw it back. throw ex; } if (ex instanceof ConcurrentAccessTimeoutException || ex instanceof ConcurrentAccessException) { throw ex; } if (ex instanceof RuntimeException || ex instanceof RemoteException) { discarded = true; if (pool != null) { pool.discard(instance); } } throw ex; } catch (final Error e) { discarded = true; if (pool != null) { pool.discard(instance); } throw e; } catch (final Throwable t) { discarded = true; if (pool != null) { pool.discard(instance); } throw new RuntimeException(t); } finally { if (!discarded) { releaseInstance(instance); } } }
@Override public ClassLoader getClassLoader() { return ejbComponent.getComponentClass().getClassLoader(); }
@Override public void callTimeout(final TimerImpl timer) throws Exception { callTimeout(timer, ejbComponent.getTimeoutMethod()); }
@Override public String getTimedObjectId() { return deploymentString + "." + ejbComponent.getComponentName(); }
/** * Returns true if the passed <code>exceptionClass</code> is an application exception. Else * returns false. * * @param ejbComponent The EJB component * @param exceptionClass The exception class * @return */ private boolean isApplicationException( final EJBComponent ejbComponent, final Class<?> exceptionClass, final Method invokedMethod) { return ejbComponent.getApplicationException(exceptionClass, invokedMethod) != null; }