diff --git a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/KnowledgeInteractionLifeCycleApiServiceImpl.java b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/KnowledgeInteractionLifeCycleApiServiceImpl.java index 85bab1e0..9c37f6a5 100644 --- a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/KnowledgeInteractionLifeCycleApiServiceImpl.java +++ b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/KnowledgeInteractionLifeCycleApiServiceImpl.java @@ -46,22 +46,13 @@ public Response scKiPost(String knowledgeBaseId, KnowledgeInteractionBase knowle var restKb = manager.getKB(knowledgeBaseId); if (restKb == null) { - if (manager.hasSuspendedKB(knowledgeBaseId)) { - manager.removeSuspendedKB(knowledgeBaseId); - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage( - "This knowledge base has been suspended due to inactivity. Please reregister the knowledge base and its knowledge interactions."); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } else { - LOG.info("Someone tried to add a KI to KB {}, but it does not exist.", knowledgeBaseId); - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage(String.format( - "Could not add knowledge interaction, because the given knowledge base ID (%s) is unknown.", - knowledgeBaseId)); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } + LOG.debug("Someone tried to add a KI to KB {}, but it does not exist.", knowledgeBaseId); + var response = new ResponseMessage(); + response.setMessageType("error"); + response.setMessage(String.format( + "Could not add knowledge interaction, because the given knowledge base ID (%s) is unknown.", + knowledgeBaseId)); + return Response.status(Status.NOT_FOUND).entity(response).build(); } String kiId; @@ -109,19 +100,10 @@ public Response scKiDelete(String knowledgeBaseId, String knowledgeInteractionId var restKb = manager.getKB(knowledgeBaseId); if (restKb == null) { - if (manager.hasSuspendedKB(knowledgeBaseId)) { - manager.removeSuspendedKB(knowledgeBaseId); - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage( - "This knowledge base has been suspended due to inactivity. Please reregister the knowledge base and its knowledge interactions."); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } else { - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage("Knowledge base not found, because its knowledge base ID is unknown."); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } + var response = new ResponseMessage(); + response.setMessageType("error"); + response.setMessage("Knowledge base not found, because its knowledge base ID is unknown."); + return Response.status(Status.NOT_FOUND).entity(response).build(); } if (knowledgeInteractionId == null) { @@ -151,19 +133,10 @@ public Response scKiGet(String knowledgeBaseId, SecurityContext securityContext) var restKb = manager.getKB(knowledgeBaseId); if (restKb == null) { - if (manager.hasSuspendedKB(knowledgeBaseId)) { - manager.removeSuspendedKB(knowledgeBaseId); - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage( - "This knowledge base has been suspended due to inactivity. Please reregister the knowledge base and its knowledge interactions."); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } else { - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage("Knowledge base not found, because its knowledge base ID is unknown."); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } + var response = new ResponseMessage(); + response.setMessageType("error"); + response.setMessage("Knowledge base not found, because its knowledge base ID is unknown."); + return Response.status(Status.NOT_FOUND).entity(response).build(); } Set kis = restKb.getKnowledgeInteractions(); diff --git a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/ProactiveApiServiceImpl.java b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/ProactiveApiServiceImpl.java index d1592788..a7afc6ac 100644 --- a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/ProactiveApiServiceImpl.java +++ b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/ProactiveApiServiceImpl.java @@ -85,21 +85,11 @@ public void scAskPost( var kb = this.manager.getKB(knowledgeBaseId); if (kb == null) { - if (this.manager.hasSuspendedKB(knowledgeBaseId)) { - this.manager.removeSuspendedKB(knowledgeBaseId); - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage( - "This knowledge base has been suspended due to inactivity. Please reregister the knowledge base and its knowledge interactions."); - asyncResponse.resume(Response.status(Status.NOT_FOUND).entity(response).build()); - return; - } else { - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage("Smart connector not found, because its ID is unknown."); - asyncResponse.resume(Response.status(Status.NOT_FOUND).entity(response).build()); - return; - } + var response = new ResponseMessage(); + response.setMessageType("error"); + response.setMessage("Smart connector not found, because its ID is unknown."); + asyncResponse.resume(Response.status(Status.NOT_FOUND).entity(response).build()); + return; } try { @@ -256,21 +246,11 @@ public void scPostPost( var kb = this.manager.getKB(knowledgeBaseId); if (kb == null) { - if (this.manager.hasSuspendedKB(knowledgeBaseId)) { - manager.removeSuspendedKB(knowledgeBaseId); - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage( - "This knowledge base has been suspended due to inactivity. Please reregister the knowledge base and its knowledge interactions."); - asyncResponse.resume(Response.status(Status.NOT_FOUND).entity(response).build()); - return; - } else { - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage("Smart connector not found, because its ID is unknown."); - asyncResponse.resume(Response.status(Status.NOT_FOUND).entity(response).build()); - return; - } + var response = new ResponseMessage(); + response.setMessageType("error"); + response.setMessage("Smart connector not found, because its ID is unknown."); + asyncResponse.resume(Response.status(Status.NOT_FOUND).entity(response).build()); + return; } try { diff --git a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/ReactiveApiServiceImpl.java b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/ReactiveApiServiceImpl.java index 902326f9..4f9e163b 100644 --- a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/ReactiveApiServiceImpl.java +++ b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/ReactiveApiServiceImpl.java @@ -60,7 +60,6 @@ public void scHandleGet( if (this.manager.hasKB(knowledgeBaseId)) { RestKnowledgeBase kb = manager.getKB(knowledgeBaseId); - kb.resetInactivityTimeout(); // handler that returns status code 202 TimeoutHandler handler = new TimeoutHandler() { @@ -72,8 +71,7 @@ public void handleTimeout(AsyncResponse ar) { aBuilder = Response.status(Status.ACCEPTED); String message = String.format( - "This is a heartbeat message that the server is still alive, please renew your long polling request within %d seconds.", - RestKnowledgeBase.INACTIVITY_TIMEOUT_SECONDS); + "This is a heartbeat message that the server is still alive, please renew your long polling request to be notified of future KI activations."); if (!kbHasAnswerOrReactKnowledgeInteraction(kb)) { message += " Knowledge Base '" + kb.getKnowledgeBaseId().toString() + "' does not have any Answer or React Knowledge Interaction registered. Only those two types of Knowledge Interactions require the usage of this long polling method."; @@ -100,21 +98,11 @@ public void handleTimeout(AsyncResponse ar) { return; } } else { - if (this.manager.hasSuspendedKB(knowledgeBaseId)) { - this.manager.removeSuspendedKB(knowledgeBaseId); - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage( - "This knowledge base has been suspended due to inactivity. Please reregister the knowledge base and its knowledge interactions."); - asyncResponse.resume(Response.status(Status.NOT_FOUND).entity(response).build()); - return; - } else { - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage("A Knowledge Base for the given Knowledge-Base-Id cannot be found."); - asyncResponse.resume(Response.status(Status.NOT_FOUND).entity(response).build()); - return; - } + var response = new ResponseMessage(); + response.setMessageType("error"); + response.setMessage("A Knowledge Base for the given Knowledge-Base-Id cannot be found."); + asyncResponse.resume(Response.status(Status.NOT_FOUND).entity(response).build()); + return; } } catch (URISyntaxException e) { var response = new ResponseMessage(); @@ -177,7 +165,7 @@ public Response scHandlePost( if (kb.hasKnowledgeInteraction(knowledgeInteractionId)) { // knowledge interaction exists - + if (responseBody.getHandleRequestId() != null) { if (kb.hasHandleRequestId(responseBody.getHandleRequestId())) { @@ -212,19 +200,10 @@ public Response scHandlePost( return Response.status(Status.BAD_REQUEST).entity(response).build(); } } else { - if (manager.hasSuspendedKB(knowledgeBaseId)) { - manager.removeSuspendedKB(knowledgeBaseId); - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage( - "This knowledge base has been suspended due to inactivity. Please reregister the knowledge base and its knowledge interactions."); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } else { - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage("A Knowledge Base for the given Knowledge-Base-Id cannot be found."); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } + var response = new ResponseMessage(); + response.setMessageType("error"); + response.setMessage("A Knowledge Base for the given Knowledge-Base-Id cannot be found."); + return Response.status(Status.NOT_FOUND).entity(response).build(); } } diff --git a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/RestKnowledgeBase.java b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/RestKnowledgeBase.java index 2ad22dbe..8a05b90c 100644 --- a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/RestKnowledgeBase.java +++ b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/RestKnowledgeBase.java @@ -63,8 +63,6 @@ public class RestKnowledgeBase implements KnowledgeBase { private static final Logger LOG = LoggerFactory.getLogger(RestKnowledgeBase.class); - public static int INACTIVITY_TIMEOUT_SECONDS = 60; - private String knowledgeBaseId; private String knowledgeBaseName; private String knowledgeBaseDescription; @@ -177,10 +175,6 @@ public BindingSet react(ReactKnowledgeInteraction aRKI, ReactExchangeInfo aReact */ private final Integer leaseRenewalTime; - private Timer inactivityTimer; - - private boolean suspended = false; - private Thread shutdownHook = new Thread(() -> { this.stop(); }); @@ -220,8 +214,6 @@ protected boolean removeEldestEntry(Map.Entry eldest) { this.onReady = onReady; this.leaseRenewalTime = scModel.getLeaseRenewalTime(); - assert RestKnowledgeBase.INACTIVITY_TIMEOUT_SECONDS > ReactiveApiServiceImpl.LONGPOLL_TIMEOUT; - if (this.leaseRenewalTime != null) { // Issue the initial lease. LOG.info("Creating REST Knowledge Base with lease that must be renewed every {} seconds.", @@ -309,7 +301,6 @@ public boolean hasAsyncResponse() { public void resetAsyncResponse() { this.asyncResponse = null; - this.resetInactivityTimeout(); } public void waitForHandleRequest(AsyncResponse asyncResponse) { @@ -509,12 +500,6 @@ public String register(KnowledgeInteractionBase ki) { type)); } - // If this is a reactive knowledge interaction we set the inactivity timout - // timer at the moment of registration. Note that this will not overwrite - // any existing timers (it may not be the first reactive KI of this KB). - if (type.equals("AnswerKnowledgeInteraction") || type.equals("ReactKnowledgeInteraction")) - this.setInactivityTimeout(false); - return kiId.toString(); } @@ -756,11 +741,6 @@ public void smartConnectorConnectionRestored(SmartConnector aSC) { @Override public void smartConnectorStopped(SmartConnector aSC) { - if (this.inactivityTimer != null) { - this.inactivityTimer.cancel(); - LOG.info("canceled inactivity timer for {} because its smart connector stopped.", - this.getKnowledgeBaseId()); - } LOG.debug("SC of KB '{}' has stopped.", this.knowledgeBaseId); } @@ -780,7 +760,7 @@ private void cancelAsyncResponse() { public void stop() { if (this.hasAsyncResponse()) this.cancelAsyncResponse(); - this.cancelInactivityTimeout(); + try { this.sc.stop().get(); Runtime.getRuntime().removeShutdownHook(this.shutdownHook); @@ -850,51 +830,6 @@ public SmartConnectorLease getLease() { return this.lease; } - public synchronized void resetInactivityTimeout() { - cancelInactivityTimeout(); - setInactivityTimeout(true); - } - - private synchronized void setInactivityTimeout(boolean overwrite) { - if (!overwrite && this.inactivityTimer != null) { - return; - } - - this.inactivityTimer = new Timer(); - - this.inactivityTimer.schedule(new TimerTask() { - @Override - public void run() { - // It could happen that the inactivity timer has been cancelled in the - // mean time, and this task still happily runs in another thread, so we - // check if the intactivity timer is still non-null here. - if (inactivityTimer != null) { - LOG.warn("Suspending KB {} because of inactivity.", knowledgeBaseId); - suspend(); - } - } - }, RestKnowledgeBase.INACTIVITY_TIMEOUT_SECONDS * 1000); - LOG.debug("(re)scheduled inactivity timer. KB {} will be suspended if it does not repoll within {} seconds.", - this.knowledgeBaseId, RestKnowledgeBase.INACTIVITY_TIMEOUT_SECONDS); - } - - private synchronized void cancelInactivityTimeout() { - if (this.inactivityTimer != null) { - LOG.debug("inactivity timer is being canceled for {}.", this.knowledgeBaseId); - this.inactivityTimer.cancel(); - this.inactivityTimer = null; - } - } - - private void suspend() { - this.stop(); - this.suspended = true; - } - - public boolean isSuspended() { - return this.suspended; - } - public int getReasonerLevel() { return this.sc.getReasonerLevel(); } diff --git a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/RestKnowledgeBaseManager.java b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/RestKnowledgeBaseManager.java index 563d8e10..8ac0f1be 100644 --- a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/RestKnowledgeBaseManager.java +++ b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/RestKnowledgeBaseManager.java @@ -18,7 +18,6 @@ public class RestKnowledgeBaseManager { private static final Logger LOG = LoggerFactory.getLogger(RestKnowledgeBaseManager.class); private Map restKnowledgeBases = new ConcurrentHashMap<>(); - private Map suspendedRestKnowledgeBases = new ConcurrentHashMap<>(); private final ScheduledThreadPoolExecutor leaseExpirationExecutor; @@ -56,19 +55,9 @@ public static RestKnowledgeBaseManager newInstance() { } public boolean hasKB(String knowledgeBaseId) { - this.checkSuspendedSmartConnectors(); return restKnowledgeBases.containsKey(knowledgeBaseId); } - public boolean hasSuspendedKB(String knowledgeBaseId) { - this.checkSuspendedSmartConnectors(); - return suspendedRestKnowledgeBases.containsKey(knowledgeBaseId); - } - - public void removeSuspendedKB(String knowledgeBaseId) { - this.suspendedRestKnowledgeBases.remove(knowledgeBaseId); - } - /** * Creates a new KB with a smart connector. Once the smart connector has * received the 'ready' signal, the future is completed. @@ -77,11 +66,6 @@ public void removeSuspendedKB(String knowledgeBaseId) { * @return */ public CompletableFuture createKB(eu.knowledge.engine.rest.model.SmartConnector scModel) { - this.checkSuspendedSmartConnectors(); - - // Make sure we don't keep a suspended KB while we also have a valid one. - this.removeSuspendedKB(scModel.getKnowledgeBaseId()); - var f = new CompletableFuture(); this.restKnowledgeBases.put(scModel.getKnowledgeBaseId(), new RestKnowledgeBase(scModel, () -> { f.complete(null); @@ -99,18 +83,14 @@ public CompletableFuture createKB(eu.knowledge.engine.rest.model.SmartConn } public RestKnowledgeBase getKB(String knowledgeBaseId) { - this.checkSuspendedSmartConnectors(); return this.restKnowledgeBases.get(knowledgeBaseId); } public Set getKBs() { - this.checkSuspendedSmartConnectors(); return Collections.unmodifiableSet(new HashSet<>(this.restKnowledgeBases.values())); } public boolean deleteKB(String knowledgeBaseId) { - this.checkSuspendedSmartConnectors(); - // Note: We first stop the knowledge base before removing it from our list. // (Because in the meantime (while stopping) we cannot have that someone // tries to register the same ID) @@ -141,14 +121,4 @@ private void removeExpiredSmartConnectors() { this.deleteKB(kbId); }); } - - private void checkSuspendedSmartConnectors() { - this.restKnowledgeBases.entrySet().stream().filter(entry -> entry.getValue().isSuspended()) - .collect(Collectors.toSet()) // Collect it so we don't mutate the list while iterating over it. - .forEach(entry -> { - LOG.info("Moving suspended KB {} to the suspended list.", entry.getKey()); - this.restKnowledgeBases.remove(entry.getKey()); - this.suspendedRestKnowledgeBases.put(entry.getKey(), entry.getValue()); - }); - } } diff --git a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/SmartConnectorLeaseApiServiceImpl.java b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/SmartConnectorLeaseApiServiceImpl.java index f321b6a5..7b610096 100644 --- a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/SmartConnectorLeaseApiServiceImpl.java +++ b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/SmartConnectorLeaseApiServiceImpl.java @@ -37,19 +37,10 @@ public Response scLeaseRenewPut(@NotNull String knowledgeBaseId, SecurityContext var restKb = manager.getKB(knowledgeBaseId); if (restKb == null) { - if (manager.hasSuspendedKB(knowledgeBaseId)) { - manager.removeSuspendedKB(knowledgeBaseId); - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage( - "This knowledge base has been suspended due to inactivity. Please reregister the knowledge base and its knowledge interactions."); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } else { - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage("Knowledge base not found. (Has its lease already expired?)"); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } + var response = new ResponseMessage(); + response.setMessageType("error"); + response.setMessage("Knowledge base not found. (Has its lease already expired?)"); + return Response.status(Status.NOT_FOUND).entity(response).build(); } if (restKb.getLease() == null) { diff --git a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/SmartConnectorLifeCycleApiServiceImpl.java b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/SmartConnectorLifeCycleApiServiceImpl.java index 6530b9f8..51c1a406 100644 --- a/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/SmartConnectorLifeCycleApiServiceImpl.java +++ b/smart-connector-rest-server/src/main/java/eu/knowledge/engine/rest/api/impl/SmartConnectorLifeCycleApiServiceImpl.java @@ -235,19 +235,10 @@ public Response scKnowledgePost( var restKb = manager.getKB(knowledgeBaseId); if (restKb == null) { - if (manager.hasSuspendedKB(knowledgeBaseId)) { - manager.removeSuspendedKB(knowledgeBaseId); - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage( - "This knowledge base has been suspended due to inactivity. Please reregister the knowledge base and its knowledge interactions."); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } else { - var response = new ResponseMessage(); - response.setMessageType("error"); - response.setMessage("Knowledge base not found. (Has its lease already expired?)"); - return Response.status(Status.NOT_FOUND).entity(response).build(); - } + var response = new ResponseMessage(); + response.setMessageType("error"); + response.setMessage("Knowledge base not found. (Has its lease already expired?)"); + return Response.status(Status.NOT_FOUND).entity(response).build(); } try {