//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.consumers;
import java.util.Map;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.fit.descriptor.ConfigurationParameter;
import org.apache.uima.fit.descriptor.ExternalResource;
import org.apache.uima.jcas.JCas;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import uk.gov.dstl.baleen.consumers.utils.DefaultFields;
import uk.gov.dstl.baleen.consumers.utils.SingleDocumentConsumerFormat;
import uk.gov.dstl.baleen.resources.SharedActiveMQResource;
import uk.gov.dstl.baleen.uima.BaleenConsumer;
/**
* Convert the document into a JSON string,
* using the schema defined in {@link SingleDocumentConsumerFormat},
* and send it to an ActiveMQ endpoint
*/
public class ActiveMQ extends BaleenConsumer {
/**
* Connection to ActiveMQ
*
* @baleen.resource uk.gov.dstl.baleen.resources.SharedActiveMQResource
*/
public static final String KEY_ACTIVEMQ = "activemq";
@ExternalResource(key = KEY_ACTIVEMQ)
SharedActiveMQResource samr;
/**
* The ActiveMQ endpoint - topic to send data to
*
* @baleen.config output
*/
public static final String PARAM_ENDPOINT = "endpoint";
@ConfigurationParameter(name = PARAM_ENDPOINT, defaultValue = "VirtualTopic.Baleen.output")
private String endpoint;
/**
* Should a hash of the content be used to generate the ID?
* If false, then a hash of the Source URI is used instead.
*
* @baleen.config true
*/
public static final String PARAM_CONTENT_HASH_AS_ID = "contentHashAsId";
@ConfigurationParameter(name = PARAM_CONTENT_HASH_AS_ID, defaultValue = "true")
boolean contentHashAsId = true;
private static final ObjectMapper MAPPER = new ObjectMapper();
@Override
protected void doProcess(final JCas jCas) throws AnalysisEngineProcessException {
Map<String, Object> output = SingleDocumentConsumerFormat.formatCas(jCas, new DefaultFields(), contentHashAsId, getMonitor(), getSupport());
// Persist to ActiveMQ
try {
String json = MAPPER.writeValueAsString(output);
String id = (String) output.getOrDefault("externalId", "");
Message msg = samr.getSession().createTextMessage(json);
Destination destination = samr.getSession().createTopic(endpoint);
samr.getProducer().send(destination, msg);
getMonitor().debug("Document with id {} sent to ActiveMQ", id);
} catch (JsonProcessingException e) {
getMonitor().error("Unable to parse object to JSON - document will not be sent to ActiveMQ", e);
} catch (final JMSException e) {
getMonitor().error("Unable to send document to ActiveMQ", e);
}
}
}