когда закрывать и снова открывать сокет после отправки сообщения HL7 - PullRequest
3 голосов
/ 29 ноября 2010

Я пытаюсь открыть базовое соединение с сервером HL7, куда я отправляю запрос и получаю ответ ACK.Это будет выполняться непрерывно.

  1. Если это выполняется непрерывно, когда я закрываю розетку?Правильно ли я это делаю, в этом случае?
  2. Если я закрою сокет, как мне снова открыть его?Javadocs для ConnectionHub указывает следующее:
attach(java.lang.String host, int port, Parser parser, 
       java.lang.Class<? extends LowerLayerProtocol> llpClass) 

Возвращает Соединение по указанному адресу, открывая это Соединение при необходимости.

Однако в реальномlife, он не будет открывать новое соединение, если оно уже было закрыто.

Patient patient = appt.getPatient();
Parser parser = new GenericParser();
Message hl7msg = parser.parse(wlp.getORMString(appt));

//Connect to listening servers
ConnectionHub connectionHub = ConnectionHub.getInstance();
// A connection object represents a socket attached to an HL7 server
Connection connection = connectionHub.attach(serverIP, serverPort, 
                            new PipeParser(), MinLowerLayerProtocol.class);
if (!connection.isOpen()) {
   System.out.println("CONNNECTION is CLOSED");
   connection = connectionHub.attach(serverIP, serverPort, new PipeParser(),         
                                     MinLowerLayerProtocol.class);
  if (!connection.isOpen()) {
    System.out.println("CONNNECTION is still CLOSED");
  }
}
Initiator initiator = connection.getInitiator();
Message response = initiator.sendAndReceive(hl7msg);

String responseString = parser.encode(response);
System.out.println("Received response:\n" + responseString);
connection.close();

Результат: Первый проход прошел успешно, запрос отправлен и ACK получен.Любой последующий вызов этого метода приводит к java.net.SocketException: Socket closed "на стороне клиента. Если я удалю вызов connection.close(), то он будет работать нормально в течение определенного времени, затем сокет закроется сам.

1 Ответ

4 голосов
/ 29 ноября 2010

Если вы обмениваетесь данными через HL7 2.X, ожидаемое поведение сокета: никогда отключение - вы выделяете соединение и сохраняете сокет активным. Иными словами, приложение HL7 не действует как веб-браузер, в котором оно подключается по мере необходимости и отключается по завершении. Скорее, оба конца работают, чтобы держать сокет постоянно подключенным. Большинство приложений будут раздражены, если вы отключитесь. Кроме того, большинство механизмов интеграции имеют предупреждения, которые срабатывают, если вы отключены слишком долго.

После подключения сокета необходимо использовать протокол минимального нижнего уровня HL7 (MLLP или MLP) для передачи содержимого HL7 2.X. Если вы отправляете данные, вам следует дождаться подтверждения HL7, прежде чем отправлять следующее сообщение. Если вы получаете данные, вы должны сгенерировать HL7 Ack.

Ссылки:

MLP - http://www.hl7standards.com/blog/2007/05/02/hl7-mlp-minimum-layer-protocol-defined

Acks - http://www.corepointhealth.com/resource-center/hl7-resources/hl7-acknowledgement

...