package org.mobicents.slee.resource; import java.util.Timer; import java.util.TimerTask; import org.apache.log4j.Logger; import org.mobicents.slee.container.SleeContainer; import org.mobicents.slee.runtime.activity.ActivityContext; import org.mobicents.slee.runtime.activity.ActivityContextHandle; import org.mobicents.slee.runtime.activity.ActivityType; import org.mobicents.slee.runtime.eventrouter.EventContextImpl; import org.mobicents.slee.runtime.transaction.SleeTransactionManager; public class EndAllActivitiesRAEntityTimerTask extends TimerTask { private static final Logger logger = Logger.getLogger(EndAllActivitiesRAEntityTimerTask.class); private static final long delay = 60000; private final ResourceAdaptorEntity raEntity; private final SleeContainer sleeContainer; private boolean canceled = false; // TODO replace by ft timer? private final static Timer timer = new Timer(); public EndAllActivitiesRAEntityTimerTask(ResourceAdaptorEntity raEntity,SleeContainer sleeContainer) { this.raEntity = raEntity; this.sleeContainer = sleeContainer; timer.schedule(this, delay); } @Override public boolean cancel() { canceled = true; return super.cancel(); } private void endAllActivities() { // end all activities SleeTransactionManager txManager = sleeContainer .getTransactionManager(); boolean rb = true; try { txManager.begin(); for (ActivityContextHandle handle : sleeContainer .getActivityContextFactory() .getAllActivityContextsHandles()) { if (handle.getActivityType() == ActivityType.RA && handle.getActivitySource().equals(raEntity.getName())) { try { if (logger.isDebugEnabled()) { logger.debug("Forcing the end of activity " + handle); } ActivityContext ac = sleeContainer .getActivityContextFactory() .getActivityContext(handle); if (ac != null) { // if it has a suspended event context then resume it EventContextImpl eventContextImpl = ac.getEventRouterActivity().getCurrentEventContext(); if (eventContextImpl != null && eventContextImpl.isSuspended()) { eventContextImpl.resumeDelivery(); } // end activity ac.endActivity(); } } catch (Exception e) { if (logger.isDebugEnabled()) { logger.debug("Failed to end activity " + handle, e); } } } } rb = false; } catch (Exception e) { logger.error("Exception while ending all activities for ra entity " + raEntity.getName(), e); } finally { try { if (rb) { txManager.rollback(); } else { txManager.commit(); } } catch (Exception e) { logger.error( "Error in tx management while ending all activities for ra entity " + raEntity.getName(), e); } } } @Override public synchronized void run() { if (!canceled) { cancel(); logger.info("Forcing the end of all activities for ra entity " + raEntity.getName()); try { endAllActivities(); } catch (Throwable e) { logger.error(e.getMessage(),e); } } } }