/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.hl7;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.api.context.Context;
import org.springframework.transaction.annotation.Transactional;
import ca.uhn.hl7v2.HL7Exception;
/**
* Processes message in the HL7 inbound queue. Messages are moved into either the archive or error
* table depending on success or failure of the processing. You may, however, set a global property
* that causes the processor to ignore messages regarding unknown patients from a non-local HL7
* source. (i.e. those messages neither go to the archive or the error table.)
*
* @version 1.0
*/
@Transactional
public class HL7InQueueProcessor /* implements Runnable */{
private final Log log = LogFactory.getLog(this.getClass());
private static Boolean isRunning = false; // allow only one running
private static Integer count = 0;
// processor per JVM
/**
* Empty constructor (requires context to be set using <code>setContext(Context)</code> method
* before any other calls are made)
*/
public HL7InQueueProcessor() {
}
/**
* Process a single queue entry from the inbound HL7 queue
*
* @param hl7InQueue queue entry to be processed
*/
public void processHL7InQueue(HL7InQueue hl7InQueue) {
if (log.isDebugEnabled())
log.debug("Processing HL7 inbound queue (id=" + hl7InQueue.getHL7InQueueId() + ",key="
+ hl7InQueue.getHL7SourceKey() + ")");
try {
Context.getHL7Service().processHL7InQueue(hl7InQueue);
}
catch (HL7Exception e) {
log.error("Unable to process hl7 in queue", e);
}
if (++count > 25) {
// clean up memory after processing each queue entry (otherwise, the
// memory-intensive process may crash or eat up all our memory)
try {
Context.getHL7Service().garbageCollect();
}
catch (Exception e) {
log.error("Exception while performing garbagecollect in hl7 inbound processor", e);
}
}
}
/**
* Transform the next pending HL7 inbound queue entry. If there are no pending items in the
* queue, this method simply returns quietly.
*
* @return true if a queue entry was processed, false if queue was empty
*/
public boolean processNextHL7InQueue() {
boolean entryProcessed = false;
HL7Service hl7Service = Context.getHL7Service();
HL7InQueue hl7InQueue = hl7Service.getNextHL7InQueue();
if (hl7InQueue != null) {
processHL7InQueue(hl7InQueue);
entryProcessed = true;
}
return entryProcessed;
}
/**
* Starts up a thread to process all existing HL7InQueue entries
*/
public void processHL7InQueue() throws HL7Exception {
synchronized (isRunning) {
if (isRunning) {
log.warn("HL7 processor aborting (another processor already running)");
return;
}
isRunning = true;
}
try {
log.debug("Start processing hl7 in queue");
while (processNextHL7InQueue()) {
// loop until queue is empty
}
log.debug("Done processing hl7 in queue");
}
finally {
isRunning = false;
}
}
}