diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientDaemon.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientDaemon.java index 859f37c..bacf615 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientDaemon.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/AccountingClientDaemon.java @@ -1,6 +1,7 @@ package org.gcube.portlets.admin.accountingmanager.server; import java.util.ArrayList; +import java.util.GregorianCalendar; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutionException; @@ -13,6 +14,7 @@ import java.util.concurrent.TimeoutException; import javax.servlet.ServletContextEvent; import org.gcube.portlets.admin.accountingmanager.server.amservice.cache.AccountingCache; +import org.gcube.portlets.admin.accountingmanager.server.util.TaskInProgress; import org.gcube.portlets.admin.accountingmanager.server.util.TaskRequest; import org.gcube.portlets.admin.accountingmanager.server.util.TaskStatus; import org.gcube.portlets.admin.accountingmanager.shared.Constants; @@ -32,13 +34,13 @@ public class AccountingClientDaemon implements Runnable { private ServletContextEvent sce; private volatile boolean running = true; private volatile AccountingCache accountingCache; - private ArrayList> workers; + private ArrayList tasks; public AccountingClientDaemon(ServletContextEvent sce, AccountingCache accountingCache) { this.sce = sce; this.accountingCache = accountingCache; - workers = new ArrayList<>(); + tasks = new ArrayList<>(); } public void terminate() { @@ -62,18 +64,21 @@ public class AccountingClientDaemon implements Runnable { taskRequest, accountingCache); Future futureResult = executorService .submit(accountingClientCallable); - workers.add(futureResult); - + TaskInProgress taskInProgress = new TaskInProgress( + new GregorianCalendar(), futureResult); + tasks.add(taskInProgress); } - if (!workers.isEmpty()) { - ArrayList> dones=new ArrayList<>(); - for (Future futureResult : workers) { + if (!tasks.isEmpty()) { + ArrayList dones = new ArrayList<>(); + for (TaskInProgress taskInProgress : tasks) { + Future futureResult = taskInProgress + .getFuture(); if (futureResult.isDone()) { TaskStatus result = null; try { result = futureResult - .get(Constants.SERVICE_CLIENT_TIMEOUT_DEFAULT_MINUTES, + .get(Constants.SERVICE_CLIENT_TIMEOUT_DEFAULT_MILLIS, TimeUnit.MINUTES); logger.info("AccountingClientTask: " + result); @@ -83,14 +88,23 @@ public class AccountingClientDaemon implements Runnable { + e.getLocalizedMessage(), e); } catch (TimeoutException e) { logger.error("AccountingClientTask No response after " - + Constants.SERVICE_CLIENT_TIMEOUT_DEFAULT_MINUTES + + Constants.SERVICE_CLIENT_TIMEOUT_DEFAULT_MILLIS + " minutes!"); futureResult.cancel(true); } - dones.add(futureResult); + dones.add(taskInProgress); + } else { + GregorianCalendar now = new GregorianCalendar(); + long diff = now.getTimeInMillis() + - taskInProgress.getStartTime() + .getTimeInMillis(); + if (diff > Constants.SERVICE_CLIENT_TIMEOUT_DEFAULT_MILLIS) { + futureResult.cancel(true); + dones.add(taskInProgress); + } } } - workers.removeAll(dones); + tasks.removeAll(dones); } diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/server/util/TaskInProgress.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/util/TaskInProgress.java new file mode 100644 index 0000000..dd4fe6d --- /dev/null +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/server/util/TaskInProgress.java @@ -0,0 +1,47 @@ +package org.gcube.portlets.admin.accountingmanager.server.util; + +import java.io.Serializable; +import java.util.Calendar; +import java.util.concurrent.Future; + +/** + * + * @author Giancarlo Panichi email: g.panichi@isti.cnr.it + * + */ +public class TaskInProgress implements Serializable { + + private static final long serialVersionUID = -1957012551318695316L; + private Calendar startTime; + private Future future; + + public TaskInProgress(Calendar startTime, Future future) { + super(); + this.startTime = startTime; + this.future = future; + } + + public Calendar getStartTime() { + return startTime; + } + + public void setStartTime(Calendar startTime) { + this.startTime = startTime; + } + + public Future getFuture() { + return future; + } + + public void setFuture(Future future) { + this.future = future; + } + + @Override + public String toString() { + return "TaskInProgress [startTime=" + startTime + ", future=" + future + + "]"; + } + +} diff --git a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/Constants.java b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/Constants.java index 00c2fbb..2d09ed7 100644 --- a/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/Constants.java +++ b/src/main/java/org/gcube/portlets/admin/accountingmanager/shared/Constants.java @@ -41,7 +41,7 @@ public class Constants { public static final String ACCOUNTING_CATEGORY = "AccountingProfile"; //TimeOut - public static final long SERVICE_CLIENT_TIMEOUT_DEFAULT_MINUTES = 30; + public static final long SERVICE_CLIENT_TIMEOUT_DEFAULT_MILLIS = 1800000; public static final int CLIENT_MONITOR_PERIODMILLIS = 2000; public static final int CLIENT_MONITOR_TIME_OUT_PERIODMILLIS = 1800000;