1.maven依赖
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-base</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v24</artifactId>
<version>2.3</version>
</dependency>
2.SocketApp-服务类
import ca.uhn.hl7v2.DefaultHapiContext;
import ca.uhn.hl7v2.HapiContext;
import ca.uhn.hl7v2.app.HL7Service;
import ca.uhn.hl7v2.app.ServerConfiguration;
import ca.uhn.hl7v2.llp.MinLowerLayerProtocol;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class SocketApp {
private static final Logger logger = LoggerFactory.getLogger(SocketApp.class);
/**
* 设置核心线程数
*/
private static final int CORE_POOL_SIZE = 50;
/**
* 设置最大线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
*/
private static final int MAX_POOL_SIZE = 100;
/**
* 设置缓冲队列大小
*/
private static final int QUEUE_CAPACITY = 100;
/**
* 设置线程的最大空闲时间,超过了核心线程数之外的线程,在空闲时间到达之后会被销毁
*/
private static final int KEEP_ALIVE_SECONDS = 60;
// 接收端口
private static int PORT_NUMBER = 30038;
private static HapiContext context = new DefaultHapiContext();
public static void start() {
//PORT_NUMBER = SocketProperties.getSocketPort();
try {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
CORE_POOL_SIZE, MAX_POOL_SIZE,
KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(QUEUE_CAPACITY));
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
MinLowerLayerProtocol mllp = new MinLowerLayerProtocol();
mllp.setCharset("UTF-8");
context.setLowerLayerProtocol(mllp);
context.setExecutorService(executor);
ServerConfiguration s = new ServerConfiguration();
boolean useSecureConnection = false; // are you using TLS/SSL?
HL7Service ourHl7Server = context.newServer(PORT_NUMBER,
useSecureConnection);
ourHl7Server.registerApplication(new MyReceivingApplication());
ourHl7Server.setExceptionHandler(new MyHl7ExceptionHandler());
ourHl7Server.startAndWait();
logger.info("socket 服务 启动成功 SUCCESS , port {}" ,PORT_NUMBER);
} catch (Exception e) {
e.printStackTrace();
}
}
2.MyReceivingApplication 消息处理类
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.AbstractGroup;
import ca.uhn.hl7v2.model.Group;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.model.Structure;
import ca.uhn.hl7v2.model.v24.group.OML_O21_ORDER;
import ca.uhn.hl7v2.model.v24.group.OML_O21_ORDER_GENERAL;
import ca.uhn.hl7v2.model.v24.message.ACK;
import ca.uhn.hl7v2.model.v24.message.OML_O21;
import ca.uhn.hl7v2.model.v24.segment.ERR;
import ca.uhn.hl7v2.model.v24.segment.MSA;
import ca.uhn.hl7v2.model.v24.segment.MSH;
import ca.uhn.hl7v2.protocol.ReceivingApplication;
import ca.uhn.hl7v2.protocol.ReceivingApplicationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class MyReceivingApplication implements ReceivingApplication {
private static final Logger logger = LoggerFactory.getLogger(MyReceivingApplication.class);
@Override
public boolean canProcess(Message message) {
return true;
}
@Override
public Message processMessage(Message message, Map<String, Object> map){
Message ack = null;
try {
if (!message.isEmpty()) {
logger.info("ip,{},port,{}" ,map.get("SENDING_IP"),map.get("SENDING_PORT"));
logger.info("接收成功,{}" ,message.toString());
return TestHL7.hl7Text2ObjMessage(message.toString(),message);
}
}catch (Exception e){
logger.error("处理HL7消息异常",e);
}
try {
ack = message.generateACK();
logger.info("返回处理结果ACK:{}",ack.toString());
}catch (Exception e){
e.printStackTrace();
}
return ack;
}
}
3. MyHl7ExceptionHandler-异常消息回复
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.HapiContext;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.protocol.ReceivingApplicationExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
/**
* HL7 异常信息处理
*/
public class MyHl7ExceptionHandler implements ReceivingApplicationExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(MyHl7ExceptionHandler.class);
@Override
public String processException(String s, Map<String, Object> map, String s1, Exception e) throws HL7Exception {
logger.error("接收HL7消息异常:{}" , e);
Message ack = Hl7Utils.createAck("接收HL7消息异常");
return ack.toString();
}
}
Hl7Utils
public class Hl7Utils {
public static DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
public static SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0);
public static Message createAck(String msg) throws HL7Exception {
String nowDate = fmt.format(LocalDateTime.now());
// 创建 ACK 消息
ACK ack = new ACK();
// 设置 ACK 消息的 MSH 字段
MSH msh = ack.getMSH();
// 分隔符
msh.getFieldSeparator().setValue("|");
// MSH-2
msh.getEncodingCharacters().setValue("^~\\&");
msh.getMsh3_SendingApplication().getHd1_NamespaceID().setValue("MediII");
msh.getMsh4_SendingFacility().getHd1_NamespaceID().setValue("MediInfo");
msh.getMsh5_ReceivingApplication().getHd1_NamespaceID().setValue("");
msh.getMsh6_ReceivingFacility().getHd1_NamespaceID().setValue("");
msh.getDateTimeOfMessage().getTimeOfAnEvent().setValue(nowDate);
msh.getMsh9_MessageType().getMsg1_MessageType().setValue("ACK");
msh.getMsh10_MessageControlID().setValue(SocketORMNW.getMD5(String.valueOf(SocketORMCA.idWorker.nextId())));
msh.getMsh11_ProcessingID().getProcessingID().setValue("P");
msh.getMsh12_VersionID().getVersionID().setValue("2.4");
// 设置 ACK 消息的 ERR 字段
MSA msa = ack.getMSA();
msa.getMsa2_MessageControlID().setValue(getMD5(String.valueOf(idWorker.nextId())));
if(StringUtils.isNotBlank(msg)){
msa.getAcknowledgementCode().setValue(SocketConstants.AE);
msa.getMsa3_TextMessage().setValue(msg);
}else {
msa.getAcknowledgementCode().setValue(SocketConstants.AA);
}
// 返回 ACK 消息
return ack;
}
/**
* 生成md5
* @param
* @return
*/
public static String getMD5(String str) {
return DigestUtils.md5DigestAsHex(str.getBytes());
}
}
如果需要解析部分代码的话,请移步:java解析HL7协议报文工具 HAPI(SpringBoot版本)_JAVA叶知秋的博客-CSDN博客