All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ca.uhn.hl7v2.protocol.Processor Maven / Gradle / Ivy

There is a newer version: 2.3
Show newest version
/*
 * Created on 16-Apr-2004
 */
package ca.uhn.hl7v2.protocol;

import ca.uhn.hl7v2.HL7Exception;

/**
 * Encapsulates both the client and server roles of the HL7-defined 
 * "original mode" and "enhanced mode" processing rules.  See 
 * HL7 v2.5 chapter 2 for specifications.    
 *  
 * @author Bryan Tripp
 * @version $Revision: 1.1 $ updated on $Date: 2007/02/19 02:24:38 $ by $Author: jamesagnew $
 */
public interface Processor {
    
    /**
     * Always send acknowledgement (in MSH-15 and 16)
     */
    public static final String AL = "AL";
    
    /**
     * Never send acknowledgement (in MSH-15 and 16)
     */
    public static final String NE = "NE";

    /**
     * Send acknowledgement only on error / reject (in MSH-15 and 16)
     */
    public static final String ER = "ER";
    
    /**
     * Send acknowledgement only on successful receipt (in MSH-15 and 16)
     */
    public static final String SU = "SU";
        
    
    /**
     * Original mode: Application Accept - Enhanced mode: Application acknowledgment: Accept
     */
    public static final String AA = "AA"; 
    
    /**
     * Original mode: Application Error - Enhanced mode: Application acknowledgment: Error 
     */
    public static final String AE = "AE"; 
    /**
     * Original mode: Application Reject - Enhanced mode: Application acknowledgment: Reject
     */
    public static final String AR = "AR";
    
    /**
     * Enhanced mode: Accept acknowledgment: Commit Accept
     */
    public static final String CA = "CA"; 
    
    /**
     * Enhanced mode: Accept acknow ledgment: Commit Error
     */
    public static final String CE = "CE";
    
    /**
     * Enhanced mode: Accept acknowledgment: Commit Reject
     */
    public static final String CR = "CR";
    
    
    /**
     * Sends a message to a remote system via an underlying 
     * TransportLayer.  
     * 
     * If the message specifies that an accept ACK is required (under enhanced mode 
     * processing rules) then this method may retry if transmission does not appear 
     * to be successful.  The call to this method blocks while this is happening.  
     * Retries are attempted if a CR message is received, or if no message is received
     * in the specified time frame.  If a CE is received, an exception is thrown.  If 
     * a CA is received, the call returns quietly.  
     * 
     * If no accept ack is required, this method returns immediately after attempting to 
     * send a message, throwing an exception only if there is an immediate problem (eg the
     * server can't be contacted).  
     * 
     * If an accept ack is required only on error, the method waits for maxRetries * 
     * retryItervalMillis for an error to be returned, and assumes that there is no error
     * if none appears in that time.  The message is not actually resent while waiting for an 
     * error ACK. 
     * 
     * @param theMessage the message to send 
     * @param maxRetries note that this should be a small value if you demand an accept ack only
     *      on error
     * @param retryIntervalMillis note that this should be a small value if you demand an accept ack only
     *      on error
     * @throws TransportException if there is an immediate problem trying to send the 
     *      message.  
     */
    public void send(Transportable theMessage, int maxRetries, long retryIntervalMillis) throws HL7Exception;
    
    /**
     * Indicates that the calling thread expects a message with a certain ack
     * ID.  If this message arrives within the specified period of time, it will 
     * be held in an inbound list instead of being passed on to an 
     * Application.  If a message is in this list it isAvailable()
     * and can be had via receive()
     * 
     * @param theAckId the acknowledgement ID of the message 
     * @param thePeriodMillis time span during which the message should be kept if received
     */
    public void reserve(String theAckId, long thePeriodMillis);
    
    /**
     * 

Performs a single iteration of the receiving-side * of the HL7 original mode or enhanced mode processing rules * (see HL7 Standard v2.5 Chapter 2; the choice of rules * is determined by message values). Steps in the process are * as follows:

* * 1. TransportLayer.receive() is called to get the next message
* 2. Validation is performed and the message is stored locally.
* 2. If the message requires an accept ACK, then an accept, reject, * or error message is returned as appropriate
* 3. If the message is an accept ack, it is added to a local list that * can be accessed by the send() method
* 4. If the message has been reserved, it is added to the available message * list.
* 5. Otherwise it is sent to an Application. * * @param expectingAck is passed to TransportLayer.receive(), and may determine * where the message is read from (eg different sockets may be used for * commit-level ACKs). Note that this call blocks until a message is ready * at the specified location, so to run the Processor continuously, * separate threads are needed to call cycle() with true and false args. */ public void cycle(boolean expectingAck) throws HL7Exception; /** * @param theAckId the acknowledgement ID of an expected message * @return true if the message has come in and has been saved in the * inbound message list */ public boolean isAvailable(String theAckId); /** * Gets the message with the given acknowledgement ID from * the incoming message list. This method blocks until the * message appears on the list. If you don't want to block, * call isAvailable() to see if it is there. * * Note also that the message has no way of arriving on the list * during this call unless the Processor is running * as a thread, or unless some other thread is calling cycle(). * * @param theAckId * @param theTimeoutMillis milliseconds until the call times out * and returns null if the desired message is not available. * @return the incoming message with the given ack ID, or null * if the call times out. */ public Transportable receive(String theAckId, long theTimeoutMillis) throws HL7Exception; /** * @return the operational context of this protocol instance */ public ProcessorContext getContext(); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy