package org.act.tstream.drpc; import java.util.Map.Entry; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicBoolean; import org.act.tstream.callback.RunnableCallback; import org.apache.log4j.Logger; import backtype.storm.Config; import backtype.storm.generated.DRPCExecutionException; import org.act.tstream.utils.JStormUtils; import org.act.tstream.utils.TimeUtils; public class ClearThread extends RunnableCallback { private static final Logger LOG = Logger.getLogger(ClearThread.class); private final int REQUEST_TIMEOUT_SECS; private static final int TIMEOUT_CHECK_SECS = 5; private Drpc drpcService; private AtomicBoolean active; public ClearThread(Drpc drpc) { drpcService = drpc; active = drpc.getIsActive(); REQUEST_TIMEOUT_SECS = JStormUtils.parseInt( drpcService.getConf().get(Config.DRPC_REQUEST_TIMEOUT_SECS), 60); LOG.info("Drpc timeout seconds is " + REQUEST_TIMEOUT_SECS); } @Override public void run() { for (Entry<String, Integer> e : drpcService.getIdtoStart().entrySet()) { if (TimeUtils.time_delta(e.getValue()) > REQUEST_TIMEOUT_SECS) { String id = e.getKey(); drpcService.getIdtoResult().put(id, new DRPCExecutionException( "Request timed out")); Semaphore s = drpcService.getIdtoSem().get(id); if (s != null) { s.release(); } drpcService.cleanup(id); LOG.info("Clear request " + id); } } JStormUtils.sleepMs(10); } public Object getResult() { if (active.get() == true ) { return TIMEOUT_CHECK_SECS; }else { LOG.info("Quit Drpc clear thread "); return -1; } } }