package com.intrbiz.bergamot.updater.handler;
import java.util.UUID;
import org.apache.log4j.Logger;
import com.intrbiz.bergamot.model.message.api.error.APIError;
import com.intrbiz.bergamot.model.message.api.result.AdhocResultEvent;
import com.intrbiz.bergamot.model.message.api.result.RegisterForAdhocResults;
import com.intrbiz.bergamot.model.message.api.result.RegisteredForAdhocResults;
import com.intrbiz.bergamot.model.message.check.ExecuteCheck;
import com.intrbiz.bergamot.model.message.result.ResultMO;
import com.intrbiz.bergamot.queue.WorkerQueue;
import com.intrbiz.bergamot.queue.key.ResultKey;
import com.intrbiz.bergamot.queue.key.WorkerKey;
import com.intrbiz.bergamot.updater.context.ClientContext;
import com.intrbiz.queue.Consumer;
import com.intrbiz.queue.QueueException;
import com.intrbiz.queue.RoutedProducer;
public class RegisterForAdhocResultsHandler extends RequestHandler<RegisterForAdhocResults>
{
private Logger logger = Logger.getLogger(RegisterForAdhocResultsHandler.class);
public RegisterForAdhocResultsHandler()
{
super(new Class<?>[] { RegisterForAdhocResults.class });
}
@Override
public void onRequest(ClientContext context, RegisterForAdhocResults request)
{
// our adhoc id
UUID adhocId = context.var("adhocId");
if (adhocId == null)
{
adhocId = context.var("adhocId", context.getSite().randomObjectId());
// setup the adhoc results queue
try
{
// setup cleanup task
context.onClose((ctx) -> {
if (logger.isTraceEnabled()) logger.trace("Got disconnect, closing adhoc result queue");
Consumer<ResultMO, ResultKey> c = ctx.removeVar("adhocResultsConsumer");
if (c != null) c.close();
RoutedProducer<ExecuteCheck, WorkerKey> p = ctx.removeVar("adhocCheckProducer");
if (p != null) p.close();
WorkerQueue q = ctx.removeVar("workerQueue");
if (q != null) q.close();
});
// open the queue
WorkerQueue queue = context.var("workerQueue");
if (queue == null) queue = context.var("workerQueue", WorkerQueue.open());
// open the result consumer
context.var("adhocResultsConsumer", queue.consumeAdhocResults(adhocId, (headers, result) -> {
if (logger.isTraceEnabled()) logger.trace("Publishing adhoc result to client: " + result);
context.send(new AdhocResultEvent(result));
}));
// setup the producer while we are here
context.var("adhocCheckProducer", queue.publishChecks());
}
catch (QueueException e)
{
logger.warn("Failed to setup adhoc results queue", e);
context.send(new APIError(request, "Failed to setup queue"));
}
}
// respond
context.send(new RegisteredForAdhocResults(request, adhocId));
}
}