Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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<KnowledgeInteractionWithId> kis = restKb.getKnowledgeInteractions();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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.";
Expand All @@ -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();
Expand Down Expand Up @@ -177,7 +165,7 @@ public Response scHandlePost(

if (kb.hasKnowledgeInteraction(knowledgeInteractionId)) {
// knowledge interaction exists

if (responseBody.getHandleRequestId() != null) {
if (kb.hasHandleRequestId(responseBody.getHandleRequestId())) {

Expand Down Expand Up @@ -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();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
});
Expand Down Expand Up @@ -220,8 +214,6 @@ protected boolean removeEldestEntry(Map.Entry<Integer, HandleRequest> 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.",
Expand Down Expand Up @@ -309,7 +301,6 @@ public boolean hasAsyncResponse() {

public void resetAsyncResponse() {
this.asyncResponse = null;
this.resetInactivityTimeout();
}

public void waitForHandleRequest(AsyncResponse asyncResponse) {
Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -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);
}

Expand All @@ -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);
Expand Down Expand Up @@ -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();
}
Expand Down
Loading
Loading