You can subscribe to this list here.
| 2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
(6) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2002 |
Jan
(2) |
Feb
(1) |
Mar
|
Apr
(4) |
May
(5) |
Jun
(6) |
Jul
(3) |
Aug
(13) |
Sep
(28) |
Oct
(33) |
Nov
(8) |
Dec
(1) |
| 2003 |
Jan
(6) |
Feb
(2) |
Mar
|
Apr
(25) |
May
(21) |
Jun
(13) |
Jul
(12) |
Aug
(14) |
Sep
(6) |
Oct
(6) |
Nov
(16) |
Dec
(6) |
| 2004 |
Jan
(5) |
Feb
(7) |
Mar
(13) |
Apr
(17) |
May
(24) |
Jun
(14) |
Jul
(14) |
Aug
(8) |
Sep
(3) |
Oct
(8) |
Nov
(14) |
Dec
(26) |
| 2005 |
Jan
(18) |
Feb
(12) |
Mar
(29) |
Apr
(9) |
May
(4) |
Jun
(12) |
Jul
(17) |
Aug
(9) |
Sep
(12) |
Oct
|
Nov
(12) |
Dec
|
| 2006 |
Jan
(46) |
Feb
(18) |
Mar
(11) |
Apr
(13) |
May
(12) |
Jun
(27) |
Jul
(34) |
Aug
(45) |
Sep
(27) |
Oct
(13) |
Nov
(26) |
Dec
(22) |
| 2007 |
Jan
(21) |
Feb
(29) |
Mar
(32) |
Apr
(6) |
May
(11) |
Jun
(13) |
Jul
(14) |
Aug
(11) |
Sep
(15) |
Oct
(7) |
Nov
(30) |
Dec
(16) |
| 2008 |
Jan
(11) |
Feb
(14) |
Mar
(5) |
Apr
(18) |
May
(12) |
Jun
(11) |
Jul
(5) |
Aug
(12) |
Sep
(3) |
Oct
(2) |
Nov
(15) |
Dec
(2) |
| 2009 |
Jan
(18) |
Feb
(6) |
Mar
(9) |
Apr
(10) |
May
(29) |
Jun
(16) |
Jul
(44) |
Aug
(49) |
Sep
(14) |
Oct
(21) |
Nov
(11) |
Dec
(22) |
| 2010 |
Jan
(12) |
Feb
(13) |
Mar
(5) |
Apr
(6) |
May
(15) |
Jun
(15) |
Jul
(14) |
Aug
(20) |
Sep
(17) |
Oct
(36) |
Nov
(19) |
Dec
(7) |
| 2011 |
Jan
(8) |
Feb
(14) |
Mar
(21) |
Apr
(12) |
May
(6) |
Jun
(12) |
Jul
(17) |
Aug
(6) |
Sep
(13) |
Oct
(15) |
Nov
(26) |
Dec
(9) |
| 2012 |
Jan
(25) |
Feb
(13) |
Mar
(31) |
Apr
(10) |
May
(16) |
Jun
(21) |
Jul
(61) |
Aug
(38) |
Sep
(16) |
Oct
(13) |
Nov
(37) |
Dec
(26) |
| 2013 |
Jan
(20) |
Feb
(26) |
Mar
(34) |
Apr
(32) |
May
(27) |
Jun
(56) |
Jul
(16) |
Aug
(38) |
Sep
(35) |
Oct
(17) |
Nov
(11) |
Dec
(7) |
| 2014 |
Jan
(36) |
Feb
(13) |
Mar
(25) |
Apr
|
May
(27) |
Jun
(33) |
Jul
(34) |
Aug
|
Sep
(4) |
Oct
(11) |
Nov
(42) |
Dec
(2) |
| 2015 |
Jan
(5) |
Feb
(6) |
Mar
(11) |
Apr
(3) |
May
|
Jun
(1) |
Jul
(2) |
Aug
(5) |
Sep
(5) |
Oct
(5) |
Nov
(8) |
Dec
(19) |
| 2016 |
Jan
(8) |
Feb
(12) |
Mar
(6) |
Apr
(5) |
May
(5) |
Jun
(3) |
Jul
(1) |
Aug
|
Sep
(9) |
Oct
(1) |
Nov
(2) |
Dec
(5) |
| 2017 |
Jan
(2) |
Feb
|
Mar
(3) |
Apr
(6) |
May
(8) |
Jun
(7) |
Jul
(14) |
Aug
(10) |
Sep
(6) |
Oct
(2) |
Nov
|
Dec
|
| 2018 |
Jan
|
Feb
(9) |
Mar
(2) |
Apr
(3) |
May
(1) |
Jun
(1) |
Jul
(1) |
Aug
(8) |
Sep
(4) |
Oct
(3) |
Nov
(1) |
Dec
(1) |
| 2019 |
Jan
(10) |
Feb
(2) |
Mar
(6) |
Apr
(1) |
May
(2) |
Jun
|
Jul
(5) |
Aug
|
Sep
(1) |
Oct
(1) |
Nov
|
Dec
|
| 2020 |
Jan
(9) |
Feb
|
Mar
|
Apr
(6) |
May
|
Jun
(1) |
Jul
(1) |
Aug
|
Sep
(9) |
Oct
(1) |
Nov
(11) |
Dec
|
| 2021 |
Jan
|
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
(7) |
Nov
|
Dec
|
| 2022 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
(2) |
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
(1) |
| 2023 |
Jan
|
Feb
|
Mar
(3) |
Apr
|
May
(2) |
Jun
(4) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2024 |
Jan
|
Feb
(7) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(6) |
Nov
|
Dec
|
| 2025 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
|
Dec
|
|
From: Walter k. <wa...@co...> - 2025-10-12 13:06:31
|
I suggest you check out the following post as it may provide a clue for your issue. https://sourceforge.net/p/hl7api/mailman/message/3794081/ Sent from my iPad > On Oct 11, 2025, at 6:50 PM, Shreeja J <mai...@gm...> wrote: > > ca.uhn.hl7v2.HL7Exception: Can't find ZRT as a direct child |
|
From: Shreeja J <mai...@gm...> - 2025-10-12 01:49:49
|
Hello Team,
I am encountering an issue while parsing HL7 messages with a custom segment
(ZRT) .I am using:
-
*Java 21*
-
*Spring Boot 3.3.3*
-
*GenericParser* from HAPI HL7 v2
-
Supporting HL7 versions *v23 through v28*
When I try to access the custom segment using Terser, I get the following
exception:
```
ca.uhn.hl7v2.HL7Exception: Can't find ZRT as a direct child
at ca.uhn.hl7v2.util.SegmentFinder.getStructure(SegmentFinder.java:141)
at ca.uhn.hl7v2.util.SegmentFinder.getSegment(SegmentFinder.java:108)
at ca.uhn.hl7v2.util.Terser.getSegment(Terser.java:358)
at ca.uhn.hl7v2.util.Terser.get(Terser.java:324)
at
org.techbd.ingest.service.ZrtSegmentParserTest.assertZrtFields(ZrtSegmentParserTest.java:63)
at
org.techbd.ingest.service.ZrtSegmentParserTest.testCustomSegmentAfterPID(ZrtSegmentParserTest.java:49)
```
I am including the full *JUnit test* file for reference.
```
package org.service;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.parser.GenericParser;
import ca.uhn.hl7v2.util.Terser;
import ca.uhn.hl7v2.validation.impl.NoValidation;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class ZrtSegmentParserTest {
private final GenericParser parser;
public ZrtSegmentParserTest() {
parser = new GenericParser();
parser.setValidationContext(new NoValidation()); // Disable HL7
validation
}
// ---------------------------
// Sample HL7 Messages
// ---------------------------
private static final String HL7_PUSH =
"MSH|^~\\&||DUMMYHOSP|||||ORU^R01|||2.5\r" +
"PID||123456^^^DUMMY:FACID^MRN|123456^^^DUMMY:FACID^MRN||Doe^John^A||19800101|M\r"
+
"ZRT||ORU|R01|PUSH|||||123456^dummy:ABC~654321^dummy:XYZ|abcdef123456|userId^Test^User|add";
private static final String HL7_PBRD_ZRT_AFTER_MSH =
"MSH|^~\\&||DUMMYHOSP|||||ORU^R01|||2.5\r" +
"ZRT||ORU|R01|PBRD|||A1^DOE^JANE^ABC^ATT~B2^DOE^JANE^XYZ^CON|dummy:FAC|987654^dummy:ABC~456789^dummy:XYZ|abcdef987654||\r"
+
"PID||123456^^^DUMMY:FACID^MRN|123456^^^DUMMY:FACID^MRN||Doe^John^A||19800101|M";
// ---------------------------
// Tests
// ---------------------------
@Test
@DisplayName("Test ZRT segment after MSH")
void testCustomSegmentAfterMSH() throws HL7Exception {
assertZrtFields(HL7_PBRD_ZRT_AFTER_MSH, "PBRD", "dummy:FAC", "ORU");
}
@Test
@DisplayName("Test ZRT segment after PID")
void testCustomSegmentAfterPID() throws HL7Exception {
assertZrtFields(HL7_PUSH, "PUSH", "dummy:ABC", "ORU");
}
// ---------------------------
// Helper Method
// ---------------------------
private void assertZrtFields(String hl7Message, String
expectedDeliveryType,
String expectedFacility, String
expectedMessageCode) throws HL7Exception {
Message message = parser.parse(hl7Message);
Terser terser = new Terser(message);
String messageCode = terser.get("/ZRT-2");
String triggerEvent = terser.get("/ZRT-3");
String deliveryType = terser.get("/ZRT-4");
String facility = terser.get("/ZRT-8");
assertThat(messageCode).isEqualTo(expectedMessageCode);
assertThat(triggerEvent).isNotEmpty();
assertThat(deliveryType).isEqualTo(expectedDeliveryType);
assertThat(facility).isEqualTo(expectedFacility);
System.out.printf("ZRT parsed: %s | %s | %s | %s%n",
messageCode, triggerEvent, deliveryType, facility);
}
}
```
*Dependencies Used:```*<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-base</artifactId>
<version>${hapi.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v23</artifactId>
<version>${hapi.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v24</artifactId>
<version>${hapi.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v25</artifactId>
<version>${hapi.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v26</artifactId>
<version>${hapi.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v27</artifactId>
<version>${hapi.version}</version>
</dependency>
<dependency>
<groupId>ca.uhn.hapi</groupId>
<artifactId>hapi-structures-v28</artifactId>
<version>${hapi.version}</version>
</dependency>
```
*Question:*
How can I correctly parse a custom segment like ZRT using Terser when it
may appear *anywhere in the message* (not necessarily after MSH)? Is there
a recommended way to register custom segments so they can be reliably
accessed, regardless of their position?
Any thoughts on this?
Thank you for your guidance!
Shreeja
|
|
From: Walter k. <wa...@co...> - 2024-10-23 14:39:32
|
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto">I am late to the party on this, and may be missing something, but if you have access to the json itself, you can use the various json utilities to extract the fields you are looking for.<div><br></div><div><br id="lineBreakAtBeginningOfSignature"><div dir="ltr">Sent from my iPhone</div><div dir="ltr"><br><blockquote type="cite">On Oct 23, 2024, at 10:32 AM, Shreeja J <mai...@gm...> wrote:<br><br></blockquote></div><blockquote type="cite"><div dir="ltr"><div dir="auto"><div>Hi James,</div><div dir="auto"><br></div><div dir="auto">Any thoughts on this?</div><div dir="auto"><br></div><div dir="auto">Appreciate any guidance you can provide.</div><div dir="auto"><br></div><div dir="auto">Thanks </div><div dir="auto">Shreeja<br><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">On Sun, 20 Oct, 2024, 12:13 pm Shreeja J, <<a href="mailto:mai...@gm...">mai...@gm...</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hello Team,<div>I am currently working with the HAPI HL7v2 and HAPI FHIR libraries, and I am seeking guidance on utility methods or documentation that would help me retrieve the <code>system</code>, <code>code</code>, and <code>display</code> values for HL7 terminologies. <br></div><div><p> For example, if I pass a code like "MR", I would expect the method to return: <br></p><p>{<br></p><p> "type": {<br> "coding": [{<br> "system": "<a href="http://terminology.hl7.org/CodeSystem/v2-0203" target="_blank" rel="noreferrer">http://terminology.hl7.org/CodeSystem/v2-0203</a>",<br> "code": "MR"<br> }]<br> }<br>}<br></p><p>
Similarly, if the code "2028-9" is passed, the expected output would be:
</p>{<br> "system": "urn:oid:2.16.840.1.113883.6.238",<br> "code": "2028-9",<br> "display": "Asian"<br>}<br><p>
For the code "confirmed", the output should be:
</p>{<br> "coding": [{<br> "system": "<a href="http://terminology.hl7.org/CodeSystem/condition-ver-status" target="_blank" rel="noreferrer">http://terminology.hl7.org/CodeSystem/condition-ver-status</a>",<br> "code": "confirmed",<br> "display": "Confirmed"<br> }]<br>}</div><div> If there are any generic utility methods available that I can leverage to retrieve these details, or if there is any relevant documentation you could guide me to, I would greatly appreciate your assistance.</div><div><br></div><div>Thanks,</div><div>Shreeja</div></div>
</blockquote></div></div></div>
<span>_______________________________________________</span><br><span>Hl7api-devel mailing list</span><br><span>Hl7...@li...</span><br><span>https://lists.sourceforge.net/lists/listinfo/hl7api-devel</span><br></div></blockquote></div></body></html> |
|
From: Shreeja J <mai...@gm...> - 2024-10-23 14:31:57
|
Hi James,
Any thoughts on this?
Appreciate any guidance you can provide.
Thanks
Shreeja
On Sun, 20 Oct, 2024, 12:13 pm Shreeja J, <mai...@gm...> wrote:
> Hello Team,
> I am currently working with the HAPI HL7v2 and HAPI FHIR libraries, and I
> am seeking guidance on utility methods or documentation that would help me
> retrieve the system, code, and display values for HL7 terminologies.
>
> For example, if I pass a code like "MR", I would expect the method to
> return:
>
> {
>
> "type": {
> "coding": [{
> "system": "http://terminology.hl7.org/CodeSystem/v2-0203",
> "code": "MR"
> }]
> }
> }
>
> Similarly, if the code "2028-9" is passed, the expected output would be:
> {
> "system": "urn:oid:2.16.840.1.113883.6.238",
> "code": "2028-9",
> "display": "Asian"
> }
>
> For the code "confirmed", the output should be:
> {
> "coding": [{
> "system": "http://terminology.hl7.org/CodeSystem/condition-ver-status
> ",
> "code": "confirmed",
> "display": "Confirmed"
> }]
> }
> If there are any generic utility methods available that I can leverage to
> retrieve these details, or if there is any relevant documentation you could
> guide me to, I would greatly appreciate your assistance.
>
> Thanks,
> Shreeja
>
|
|
From: Saravanan S. <man...@ou...> - 2024-10-20 22:03:47
|
I think there is a bi-directional open source HL7 V2 to FHIR converter from Microsoft which I believe is used in Azure Health Services Engine but it may be .NET based. Not sure about Java side of things. Thx, Saravanan Subramanian ________________________________ From: James Agnew <jam...@gm...> Sent: Sunday, October 20, 2024 5:36 AM To: Shreeja J <mai...@gm...> Cc: hl7...@li... <hl7...@li...> Subject: Re: [HAPI-devel] HL7 v2 (2.7 and later versions) to FHIR conversion through HAPI Hi Shreeja, Unfortunately no conversions between v2 and FHIR are provided by the open source library. We make a converter module available as a part of our commercial offering<https://smilecdr.com/docs/hl7_v2x_support/> but it is unfortunately not open source. On Sun, Oct 20, 2024 at 1:26 AM Shreeja J <mai...@gm...<mailto:mai...@gm...>> wrote: Hello Team, I am currently utilizing HAPI FHIR version 7.4.0 for FHIR validations through the NPM package. The comprehensive documentation has significantly aided my implementation of the validation process. My next objective is to convert incoming HL7 v2 messages (versions 2.7 and later) into FHIR JSON format, followed by validation using the HAPI FHIR Validator. Could you please confirm if HAPI provides any built-in converters for this purpose? Any additional guidance or resources you could share regarding this conversion process would be greatly appreciated. Thank you for your assistance. Thanks, Shreeja _______________________________________________ Hl7api-devel mailing list Hl7...@li...<mailto:Hl7...@li...> https://lists.sourceforge.net/lists/listinfo/hl7api-devel |
|
From: James A. <jam...@gm...> - 2024-10-20 11:35:53
|
Hi Shreeja, Unfortunately no conversions between v2 and FHIR are provided by the open source library. We make a converter module available as a part of our commercial offering <https://smilecdr.com/docs/hl7_v2x_support/> but it is unfortunately not open source. On Sun, Oct 20, 2024 at 1:26 AM Shreeja J <mai...@gm...> wrote: > Hello Team, > > I am currently utilizing HAPI FHIR version 7.4.0 for FHIR validations > through the NPM package. The comprehensive documentation has significantly > aided my implementation of the validation process. > > My next objective is to convert incoming HL7 v2 messages (versions 2.7 and > later) into FHIR JSON format, followed by validation using the HAPI FHIR > Validator. > > Could you please confirm if HAPI provides any built-in converters for this > purpose? Any additional guidance or resources you could share regarding > this conversion process would be greatly appreciated. > > Thank you for your assistance. > > Thanks, > Shreeja > _______________________________________________ > Hl7api-devel mailing list > Hl7...@li... > https://lists.sourceforge.net/lists/listinfo/hl7api-devel > |
|
From: Shreeja J <mai...@gm...> - 2024-10-20 06:44:07
|
Hello Team,
I am currently working with the HAPI HL7v2 and HAPI FHIR libraries, and I
am seeking guidance on utility methods or documentation that would help me
retrieve the system, code, and display values for HL7 terminologies.
For example, if I pass a code like "MR", I would expect the method to
return:
{
"type": {
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/v2-0203",
"code": "MR"
}]
}
}
Similarly, if the code "2028-9" is passed, the expected output would be:
{
"system": "urn:oid:2.16.840.1.113883.6.238",
"code": "2028-9",
"display": "Asian"
}
For the code "confirmed", the output should be:
{
"coding": [{
"system": "http://terminology.hl7.org/CodeSystem/condition-ver-status",
"code": "confirmed",
"display": "Confirmed"
}]
}
If there are any generic utility methods available that I can leverage to
retrieve these details, or if there is any relevant documentation you could
guide me to, I would greatly appreciate your assistance.
Thanks,
Shreeja
|
|
From: Shreeja J <mai...@gm...> - 2024-10-20 05:25:09
|
Hello Team, I am currently utilizing HAPI FHIR version 7.4.0 for FHIR validations through the NPM package. The comprehensive documentation has significantly aided my implementation of the validation process. My next objective is to convert incoming HL7 v2 messages (versions 2.7 and later) into FHIR JSON format, followed by validation using the HAPI FHIR Validator. Could you please confirm if HAPI provides any built-in converters for this purpose? Any additional guidance or resources you could share regarding this conversion process would be greatly appreciated. Thank you for your assistance. Thanks, Shreeja |
|
From: Stewart A. <ste...@se...> - 2024-02-08 18:27:54
|
You are welcome. Hope it was useful. You don't really have much choice but to parse the message or you can't do any work on it in HAPI. That's how IEs do it anyway. Stewart |
|
From: Stewart A. <ste...@se...> - 2024-02-08 17:04:28
|
If I recall correctly a singleton is a class that is available across the entire jvm, so if you intend it to handle all messages from lots of queues, I'd think it might quickly become a bottleneck for messaging. No expert in this but, from an integration perspective it would be more scalable and better from the perspective of different services stopping and starting for various reasons to be individually controllable like you can in most IE platforms. Don't know what your platform is or anything though. S Stewart Anderson Integration Consultant P: +44 20 3982 6826 M: +44 77 7999 6873 W: servita.com<https://www.servita.com> [cid:image001.png@01DA5A9B.5A32F290]<https://www.linkedin.com/company/servita/> [cid:image002.png@01DA5A9B.5A32F290] The Smiths Building, 179 Great Portland Street, London, W1W 5PL From: Thomas, Patrick R via Hl7api-devel <hl7...@li...> Sent: Thursday, February 8, 2024 1:54 PM To: hl7...@li... Subject: Re: [HAPI-devel] Thread Safe Queue for HL7 messages CAUTION: This email originated from outside of the organisation. Do not click links or open attachments unless you recognise the sender and know the content is safe. I have a follow-up question. The documentation says that HapiContext is not intended to be a singleton. Should it be fine to create one HapiContext in the singleton that I create to handle the incoming messages from my queue? It seems very inefficient to recreate the objects I need to send each message. Thank you. ______________________________________________________________________ The contents of this message, together with any attachments, are intended only for the use of the person(s) to which they are addressed and may contain confidential and/or privileged information. Further, any medical information herein is confidential and protected by law. It is unlawful for unauthorized persons to use, review, copy, disclose, or disseminate confidential medical information. If you are not the intended recipient, immediately advise the sender and delete this message and any attachments. Any distribution, or copying of this message, or any attachment, is prohibited. |
|
From: Thomas, P. R <Pat...@qu...> - 2024-02-08 16:16:09
|
This singleton will be for listening to the single JMS queue. It will be a Spring bean, which is a singleton by default anyway. The fewer objects I have to recreate for each message, the more efficient it should be. Singletons are usually designed to be accessible by multiple threads, but in this case, it will only be the JMS listener that will access it. The service that will create the HL7 messages to send to the JMS will create HAPI objects each time and will need to be thread safe since multiple users can send messages to the JMS queue simultaneously. Each user can send multiple messages in a block, and the messages have to stay in order. It does seem a little inefficient to create HAPI objects, convert them to a string message, send it through JMS, parse the string back to HAPI objects, then send the HL7 message through LLP. But I think the JMS built-in capabilities to handle multiple messages and fail overs is better than anything I could design myself to send the messages more directly. Thank you, Patrick R. Thomas From: Stewart Anderson <ste...@se...> Sent: Thursday, February 8, 2024 9:31 AM To: Thomas, Patrick R <Pat...@qu...>; hl7...@li... Subject: RE: Thread Safe Queue for HL7 messages CAUTION! This email originated outside of Quest Diagnostics. DO NOT click links or open attachments unless you recognize the sender and know the content is safe. Please report suspicious emails to: ph...@qu...<mailto:ph...@qu...> If I recall correctly a singleton is a class that is available across the entire jvm, so if you intend it to handle all messages from lots of queues, I'd think it might quickly become a bottleneck for messaging. No expert in this but, from an integration perspective it would be more scalable and better from the perspective of different services stopping and starting for various reasons to be individually controllable like you can in most IE platforms. Don't know what your platform is or anything though. S Stewart Anderson Integration Consultant P: +44 20 3982 6826 M: +44 77 7999 6873 W: servita.com<https://www.servita.com/> [cid:image001.png@01DA5A77.A909F0E0]<https://www.linkedin.com/company/servita/> [cid:image002.png@01DA5A77.A909F0E0] The Smiths Building, 179 Great Portland Street, London, W1W 5PL From: Thomas, Patrick R via Hl7api-devel <hl7...@li...<mailto:hl7...@li...>> Sent: Thursday, February 8, 2024 1:54 PM To: hl7...@li...<mailto:hl7...@li...> Subject: Re: [HAPI-devel] Thread Safe Queue for HL7 messages CAUTION: This email originated from outside of the organisation. Do not click links or open attachments unless you recognise the sender and know the content is safe. I have a follow-up question. The documentation says that HapiContext is not intended to be a singleton. Should it be fine to create one HapiContext in the singleton that I create to handle the incoming messages from my queue? It seems very inefficient to recreate the objects I need to send each message. Thank you. ______________________________________________________________________ The contents of this message, together with any attachments, are intended only for the use of the person(s) to which they are addressed and may contain confidential and/or privileged information. Further, any medical information herein is confidential and protected by law. It is unlawful for unauthorized persons to use, review, copy, disclose, or disseminate confidential medical information. If you are not the intended recipient, immediately advise the sender and delete this message and any attachments. Any distribution, or copying of this message, or any attachment, is prohibited. ______________________________________________________________________ The contents of this message, together with any attachments, are intended only for the use of the person(s) to which they are addressed and may contain confidential and/or privileged information. Further, any medical information herein is confidential and protected by law. It is unlawful for unauthorized persons to use, review, copy, disclose, or disseminate confidential medical information. If you are not the intended recipient, immediately advise the sender and delete this message and any attachments. Any distribution, or copying of this message, or any attachment, is prohibited. |
|
From: Thomas, P. R <Pat...@qu...> - 2024-02-08 13:54:26
|
I have a follow-up question. The documentation says that HapiContext is not intended to be a singleton. Should it be fine to create one HapiContext in the singleton that I create to handle the incoming messages from my queue? It seems very inefficient to recreate the objects I need to send each message. Thank you. ______________________________________________________________________ The contents of this message, together with any attachments, are intended only for the use of the person(s) to which they are addressed and may contain confidential and/or privileged information. Further, any medical information herein is confidential and protected by law. It is unlawful for unauthorized persons to use, review, copy, disclose, or disseminate confidential medical information. If you are not the intended recipient, immediately advise the sender and delete this message and any attachments. Any distribution, or copying of this message, or any attachment, is prohibited. |
|
From: Thomas, P. R <Pat...@qu...> - 2024-02-07 13:08:44
|
Thanks for the feedback, Mike and Stewart. I use JMS message queues in other parts of the application. I had thought of that as a possible design. I wanted to check that I wasn't overlooking an existing solution and reinventing the wheel. Thank you, Patrick R. Thomas ______________________________________________________________________ The contents of this message, together with any attachments, are intended only for the use of the person(s) to which they are addressed and may contain confidential and/or privileged information. Further, any medical information herein is confidential and protected by law. It is unlawful for unauthorized persons to use, review, copy, disclose, or disseminate confidential medical information. If you are not the intended recipient, immediately advise the sender and delete this message and any attachments. Any distribution, or copying of this message, or any attachment, is prohibited. |
|
From: Stewart A. <ste...@se...> - 2024-02-07 11:47:02
|
Haven't used HAPI in the raw for a while now, but I think it is focused on the serialisation of HL7, there is an MLLP Sender/receiver, but if you want to write then to a queue, after or before receipt/send, you'd need to handle the queue yourself. JMS or ActiveMQ/Rabbit etc. There are tons of examples and libraries for all the major queue APIs. |
|
From: Thomas, P. R <Pat...@qu...> - 2024-02-06 19:44:15
|
My Java application uses HAPI to create HL7 messages. The messages are initiated by users, and multiple users can send messages at the same time. The current implementation creates text files. Simultaneous file creation is no problem. I need to change the design to send the HL7 message through LLP instead. I need a queue to hold all the messages that need to be sent. Before I go down this path, does HAPI have anything that already handles something like this? Thank you, Patrick R. Thomas ______________________________________________________________________ The contents of this message, together with any attachments, are intended only for the use of the person(s) to which they are addressed and may contain confidential and/or privileged information. Further, any medical information herein is confidential and protected by law. It is unlawful for unauthorized persons to use, review, copy, disclose, or disseminate confidential medical information. If you are not the intended recipient, immediately advise the sender and delete this message and any attachments. Any distribution, or copying of this message, or any attachment, is prohibited. |
|
From: Russell B. <ru...@wi...> - 2023-06-14 16:14:16
|
Yeah, sorry. It's been a very long time since I posted a question on HAPI FHIR and I couldn't find the forum. Then, there's the fact that I discovered that I had put totally bogus values into those fields which HAPI FHIR didn't catch in its parse, but refused to give them back when I asked for them. So, I fixed that and I'm working. Again, sorry for the multiple screw-ups. On 6/13/23 15:49, McClendon, Craig wrote: > > If I’m not mistaken, this is the mailing list for the HAPI HL7v2 library. > > This code below looks to be using HAPI FHIR – different library. > > See the get help section here for more info: https://hapifhir.io/ > > Incidentally, you are creating a new (empty) Patient object, then > trying to fetch the name. It doesn’t have one because you haven’t set > one. > > *From:* Russell Bateman <ru...@wi...> > *Sent:* Tuesday, June 13, 2023 1:54 PM > *To:* hl7...@li... > *Subject:* [External] [HAPI-devel] Unable to inspect gender and > birthdate in Patient > > This message is from an EXTERNAL SENDER - be CAUTIOUS, particularly > with links and attachments. > > ------------------------------------------------------------------------ > > In the code below, I have an incoming Patient which has all the fields > that interest me filled in (see debugger image, but if it doesn't come > through, it shows that patient is filled out for name, gender, > birthdate and address). > > However, when I attempt to inspect *gender* and *birthdate*, these are > *null* despite the API telling me they exist (which, of course, they > do--see attached image). Note that I create a new Patient, named > worthy, and experimentation demonstrates that my code below copies the > name and the address successfully to worthy. It's just trying to copy > gender and birthdate that result in null. If I stop at the lines with > *******, patient.getGender() and patient.getBirthDate() return null. > > There must be some very fundamental bit of understanding of which I'm > completely ignorant. > > { > worthy = new Patient(); > > // name > if( !patient.hasName() ) > patientTooThin( "name" ); > HumanName humanName = patient.getNameFirstRep(); > List< StringType > givens = humanName.getGiven(); > String family = humanName.getFamily(); > String first = null, middle = null; > for( StringType given : givens ) > { > if( isNull( first ) ) > first = given.toString(); > else if( isNull( middle ) ) > middle = given.toString(); > else > break; > } > > if( isNull( family ) || isNull( first ) ) > patientTooThin( "first or last name" ); > > worthy.setName( Collections.singletonList( humanName ) ); > > // gender ************* > if( !patient.hasGender() ) > patientTooThin( "gender" ); > > worthy.setGender( patient.getGender() ); // *************** > > // birthDate > if( !patient.hasBirthDate() ) > patientTooThin( "birth date" ); > > worthy.setBirthDate( patient.getBirthDate() ); // *************** > > // address > if( !patient.hasAddress() ) > patientTooThin( "address" ); > > worthy.setAddress( Collections.singletonList( > patient.getAddressFirstRep() ) ); > } > > > > ------------------------------------------------------------------------ > > This message is for the designated recipient only and may contain > privileged, proprietary, or otherwise confidential information. If you > have received it in error, please notify the sender immediately and > delete the original. Any other use of the e-mail by you is prohibited. > Where allowed by local law, electronic communications with Accenture > and its affiliates, including e-mail and instant messaging (including > content), may be scanned by our systems for the purposes of > information security, AI-powered support capabilities, and assessment > of internal compliance with Accenture policy. Your privacy is > important to us. Accenture uses your personal data only in compliance > with data protection laws. For further information on how Accenture > processes your personal data, please see our privacy statement at > https://www.accenture.com/us-en/privacy-policy. > ______________________________________________________________________________________ > > www.accenture.com |
|
From: McClendon, C. <cra...@ac...> - 2023-06-14 04:25:20
|
If I’m not mistaken, this is the mailing list for the HAPI HL7v2 library. This code below looks to be using HAPI FHIR – different library. See the get help section here for more info: https://hapifhir.io/ Incidentally, you are creating a new (empty) Patient object, then trying to fetch the name. It doesn’t have one because you haven’t set one. From: Russell Bateman <ru...@wi...> Sent: Tuesday, June 13, 2023 1:54 PM To: hl7...@li... Subject: [External] [HAPI-devel] Unable to inspect gender and birthdate in Patient This message is from an EXTERNAL SENDER - be CAUTIOUS, particularly with links and attachments. ________________________________ In the code below, I have an incoming Patient which has all the fields that interest me filled in (see debugger image, but if it doesn't come through, it shows that patient is filled out for name, gender, birthdate and address). However, when I attempt to inspect gender and birthdate, these are null despite the API telling me they exist (which, of course, they do--see attached image). Note that I create a new Patient, named worthy, and experimentation demonstrates that my code below copies the name and the address successfully to worthy. It's just trying to copy gender and birthdate that result in null. If I stop at the lines with *******, patient.getGender() and patient.getBirthDate() return null. There must be some very fundamental bit of understanding of which I'm completely ignorant. { worthy = new Patient(); // name if( !patient.hasName() ) patientTooThin( "name" ); HumanName humanName = patient.getNameFirstRep(); List< StringType > givens = humanName.getGiven(); String family = humanName.getFamily(); String first = null, middle = null; for( StringType given : givens ) { if( isNull( first ) ) first = given.toString(); else if( isNull( middle ) ) middle = given.toString(); else break; } if( isNull( family ) || isNull( first ) ) patientTooThin( "first or last name" ); worthy.setName( Collections.singletonList( humanName ) ); // gender ************* if( !patient.hasGender() ) patientTooThin( "gender" ); worthy.setGender( patient.getGender() ); // *************** // birthDate if( !patient.hasBirthDate() ) patientTooThin( "birth date" ); worthy.setBirthDate( patient.getBirthDate() ); // *************** // address if( !patient.hasAddress() ) patientTooThin( "address" ); worthy.setAddress( Collections.singletonList( patient.getAddressFirstRep() ) ); } ________________________________ This message is for the designated recipient only and may contain privileged, proprietary, or otherwise confidential information. If you have received it in error, please notify the sender immediately and delete the original. Any other use of the e-mail by you is prohibited. Where allowed by local law, electronic communications with Accenture and its affiliates, including e-mail and instant messaging (including content), may be scanned by our systems for the purposes of information security, AI-powered support capabilities, and assessment of internal compliance with Accenture policy. Your privacy is important to us. Accenture uses your personal data only in compliance with data protection laws. For further information on how Accenture processes your personal data, please see our privacy statement at https://www.accenture.com/us-en/privacy-policy. ______________________________________________________________________________________ www.accenture.com |
|
From: Martin F. <mar...@po...> - 2023-06-13 21:29:41
|
Hi Russell,
You pasted some code, but I don't see a direct relationship with HAPI.
What class is 'patient'? If it isn't ca.uhn.... something, then i don't
think anyone here can help you.
Wbr
Martin
On 13-06-2023 20:53, Russell Bateman wrote:
> This email originated from outside of CGM. Please do not click links
> or open attachments unless you know the sender and know the content is
> safe.
> In the code below, I have an incoming Patient which has all the fields
> that interest me filled in (see debugger image, but if it doesn't come
> through, it shows that patient is filled out for name, gender,
> birthdate and address).
>
> However, when I attempt to inspect *gender* and *birthdate*, these are
> *null* despite the API telling me they exist (which, of course, they
> do--see attached image). Note that I create a new Patient, named
> worthy, and experimentation demonstrates that my code below copies the
> name and the address successfully to worthy. It's just trying to copy
> gender and birthdate that result in null. If I stop at the lines with
> *******, patient.getGender() and patient.getBirthDate() return null.
>
> There must be some very fundamental bit of understanding of which I'm
> completely ignorant.
>
> {
> worthy = new Patient();
>
> // name
> if( !patient.hasName() )
> patientTooThin( "name" );
> HumanName humanName = patient.getNameFirstRep();
> List< StringType > givens = humanName.getGiven();
> String family = humanName.getFamily();
> String first = null, middle = null;
> for( StringType given : givens )
> {
> if( isNull( first ) )
> first = given.toString();
> else if( isNull( middle ) )
> middle = given.toString();
> else
> break;
> }
>
> if( isNull( family ) || isNull( first ) )
> patientTooThin( "first or last name" );
>
> worthy.setName( Collections.singletonList( humanName ) );
>
> // gender *************
> if( !patient.hasGender() )
> patientTooThin( "gender" );
>
> worthy.setGender( patient.getGender() ); // ***************
>
> // birthDate
> if( !patient.hasBirthDate() )
> patientTooThin( "birth date" );
>
> worthy.setBirthDate( patient.getBirthDate() ); // ***************
>
> // address
> if( !patient.hasAddress() )
> patientTooThin( "address" );
>
> worthy.setAddress( Collections.singletonList(
> patient.getAddressFirstRep() ) );
> }
>
>
>
>
>
> _______________________________________________
> Hl7api-devel mailing list
> Hl7...@li...
> https://lists.sourceforge.net/lists/listinfo/hl7api-devel
|
|
From: Russell B. <ru...@wi...> - 2023-06-13 20:44:22
|
In the code below, I have an incoming Patient which has all the fields
that interest me filled in (see debugger image, but if it doesn't come
through, it shows that patient is filled out for name, gender, birthdate
and address).
However, when I attempt to inspect *gender* and *birthdate*, these are
*null* despite the API telling me they exist (which, of course, they
do--see attached image). Note that I create a new Patient, named worthy,
and experimentation demonstrates that my code below copies the name and
the address successfully to worthy. It's just trying to copy gender and
birthdate that result in null. If I stop at the lines with *******,
patient.getGender() and patient.getBirthDate() return null.
There must be some very fundamental bit of understanding of which I'm
completely ignorant.
{
worthy = new Patient();
// name
if( !patient.hasName() )
patientTooThin( "name" );
HumanName humanName = patient.getNameFirstRep();
List< StringType > givens = humanName.getGiven();
String family = humanName.getFamily();
String first = null, middle = null;
for( StringType given : givens )
{
if( isNull( first ) )
first = given.toString();
else if( isNull( middle ) )
middle = given.toString();
else
break;
}
if( isNull( family ) || isNull( first ) )
patientTooThin( "first or last name" );
worthy.setName( Collections.singletonList( humanName ) );
// gender *************
if( !patient.hasGender() )
patientTooThin( "gender" );
worthy.setGender( patient.getGender() ); // ***************
// birthDate
if( !patient.hasBirthDate() )
patientTooThin( "birth date" );
worthy.setBirthDate( patient.getBirthDate() ); // ***************
// address
if( !patient.hasAddress() )
patientTooThin( "address" );
worthy.setAddress( Collections.singletonList(
patient.getAddressFirstRep() ) );
}
|
|
From: Ian V. <ian...@gm...> - 2023-05-30 23:44:18
|
The short answer to your question is yes, through the use of terser.
Terser is very useful, and works well. Parse the message with a pipeparser,
create a terser on the message, use the get method. Your messages may
introduce challenges, that terser can overcome, but it can still end up
being a complex implementation which is potentially fragile if a change
occurs in format of the message.
If you are going to use terser, remember that printstructure is your
friend. If you have message structures which insert Z segments within
groups, and/or standard segments in non standard locations you may find, as
I have, that building custom message structures using hapi is worth the
effort. See the lengthy example below.
Hope this helps
Ian
Example Message (yes, this is based upon reality)
MSH|^~\&|CM^DIETARY|SITE|EIP|SITE|20230118115154||ORM^O01|UniqueID|P|2.3||||||8859/1
PID|1|Lots of fields
PV1|1|Lots of fields
AL1|1|FA|734881000^Tomato^Allergy|MO
ZAL|SNAPSHOT|20230118114955|19937481|19937481|ALLERGY|ACTIVE|||||20230118114953|More
fields
NTE|1||Comments added
AL1|2|FA|255620007^Other - Food Allergy^Allergy
ZAL|SNAPSHOT|20230118115043|19937487|19937487|ALLERGY|ACTIVE|||||20230118115042|More
fields
NTE|1||added allergy
ORC|NW|Lots of fields
OBR|1|Lots of fields
OBX|1|IS|MODTEX^SSH Type of Diet||STD
This test case:
@Test
void showZsegmentUsageWithoutCustomMessage() throws HL7Exception {
ModelClassFactory MCF = new DefaultModelClassFactory();
PipeParser parser = new PipeParser();
parser.getParserConfiguration().setValidating(false);
Message message = parser.parse(REAL_FORMAT_OF_NON_STANDARD_MESSAGE);
LOGGER.info(message.printStructure());
Terser terser = new Terser(message);
LOGGER.info("Terse for ZAL-4 will find the first ZAL and show field
4? " + terser.get("ZAL-4"));
LOGGER.info("No, it shows the value from the second ZAL, because
the first is in a group.");
LOGGER.info("Terse for /PATIENT/ZAL-4 will find the first ZAL and
show field 4? " + terser.get("/PATIENT/ZAL-4"));
LOGGER.info("Yes, it shows the value from the first ZAL, because we
specified the group");
LOGGER.info("Terse for /NTE2 will find the segment shown as NTE2 in
the printstructure " + terser.get("/NTE2-3"));
LOGGER.info("Terse for /NTE3 will find the segment shown as NTE3 in
the printstructure " + terser.get("/NTE3-3"));
}
Produces this output:
ORM_O01 (start)
MSH -
MSH|^~\&|CM^DIETARY|SITE|EIP|SITE|20230118115154||ORM^O01|UniqueID|P|2.3||||||8859/1
[ { NTE } ] - Not populated
PATIENT (start)
[
PID - PID|1|Lots of fields
[ PD1 ] - Not populated
[ { NTE } ] - Not populated
PATIENT_VISIT (start)
[
PV1 - PV1|1|Lots of fields
[ PV2 ] - Not populated
]
PATIENT_VISIT (end)
INSURANCE (start)
[{
IN1 - Not populated
[ IN2 ] - Not populated
[ IN3 ] - Not populated
}]
INSURANCE (end)
[ GT1 ] - Not populated
[ { AL1 } ] - AL1|1|FA|734881000^Tomato^Allergy|MO
[ { ZAL } ] (non-standard) -
ZAL|SNAPSHOT|20230118114955|19937481|19937481|ALLERGY|ACTIVE|||||20230118114953|More
fields
]
PATIENT (end)
ORDER (start)
{
ORC - Not populated
ORDER_DETAIL (start)
[
<
OBR - Not populated
|
RQD - Not populated
|
RQ1 - Not populated
|
RXO - Not populated
|
ODS - Not populated
|
ODT - Not populated
>
[ { NTE } ] - Not populated
[ { DG1 } ] - Not populated
OBSERVATION (start)
[{
OBX - Not populated
[ { NTE } ] - Not populated
}]
OBSERVATION (end)
]
ORDER_DETAIL (end)
[ CTI ] - Not populated
[ BLG ] - Not populated
}
ORDER (end)
[ { NTE2 } ] (non-standard) - NTE|1||Comments added
[ { AL1 } ] (non-standard) - AL1|2|FA|255620007^Other - Food
Allergy^Allergy
[ { ZAL } ] (non-standard) -
ZAL|SNAPSHOT|20230118115043|19937487|19937487|ALLERGY|ACTIVE|||||20230118115042|More
fields
[ { NTE3 } ] (non-standard) - NTE|1||added allergy
[ { ORC } ] (non-standard) - ORC|NW|Lots of fields
[ { OBR } ] (non-standard) - OBR|1|Lots of fields
[ { OBX } ] (non-standard) - OBX|1|IS|MODTEX^SSH Type of Diet||STD
ORM_O01 (end)
Terse for ZAL-4 will find the first ZAL and show field 4? = 19937487
No, it shows the value from the second ZAL, because the first is in a group.
Terse for /PATIENT/ZAL-4 will find the first ZAL and show field 4 =
?19937481
Yes, it shows the value from the first ZAL, because we specified the group
Terse for /NTE2 will find the segment shown as NTE2 in the printstructure =
Comments added
Terse for /NTE3 will find the segment shown as NTE3 in the printstructure =
added allergy
Note how the non-standard segments (extra NTE segment and ZAL) push the
ORC, OBR and OBX segments out of the normal structure. As a result, it will
be almost impossible to deal with these messages without creating a custom
structure to accommodate the non standard segments in a repeating group.
On Wed, 31 May 2023 at 04:26, Michael Godinez via Hl7api-devel <
hl7...@li...> wrote:
> Hi,
>
>
>
> I am trying to determine if Hapi supports any Z segment type without
> needing to code anything new within Hapi?
>
> Also I am trying to find the latest source code and version for download.
>
>
>
> Thanks so much,
>
> Mike
>
>
>
> *Mike Godinez*
> Sr. Software Engineer
>
> Email: mic...@he...
>
>
> _______________________________________________
> Hl7api-devel mailing list
> Hl7...@li...
> https://lists.sourceforge.net/lists/listinfo/hl7api-devel
>
|
|
From: Michael G. <mic...@he...> - 2023-05-30 18:25:05
|
Hi, I am trying to determine if Hapi supports any Z segment type without needing to code anything new within Hapi? Also I am trying to find the latest source code and version for download. Thanks so much, Mike Mike Godinez Sr. Software Engineer [cid:image001.png@01D992FE.A744C230] Email: mic...@he...<mailto:mic...@he...> |
|
From: Stewart A. <ste...@se...> - 2023-03-15 13:37:32
|
Does HAPI test panel require spefically the 1.6.1 java version or should it run on corretto xx/java 1.8? I have tries it with a 1.8 and coretto 17 but its still complaining that is wants 1.6? Tried the usual things like path to java and JAVA_HOME. Ta Stu |
|
From: Stewart A. <ste...@se...> - 2023-03-15 11:33:34
|
OK. I installed a 1.6 and it fires up. Question answered I guess 😊 From: Stewart Anderson Sent: Wednesday, March 15, 2023 11:05 AM To: hl7...@li... Subject: HAPI Test Panel - Java Version Does HAPI test panel require spefically the 1.6.1 java version or should it run on corretto xx/java 1.8? I have tries it with a 1.8 and coretto 17 but its still complaining that is wants 1.6? Tried the usual things like path to java and JAVA_HOME. Ta Stu |
|
From: Michael D. <mdi...@ca...> - 2023-03-07 19:34:34
|
Hello, I need to create an ORU^R01 with a custom ZDS segment. Basically: MSH + PID + ZDS + OBR + OBX. Is there (an easy) way to create an ORU^R01 message with a custom segment? I've seen the example for reading a custom segment here. https://hapifhir.github.io/hapi-hl7v2/xref/ca/uhn/hl7v2/examples/CustomModelClasses.html Thanks, Mike |
|
From: Anadi K. <ana...@31...> - 2022-12-30 09:00:22
|
Hi everyone, I was using the latest HAPI HL7V2 Parser and it doesn’t seem to throw any errors if I don’t add EVN or leave EVN.2 empty for example in an ADT_A01 message. Is this expected behaviour or a bug? This is confusing, so can anyone give me an idea of what kind of rules for required fields/segments etc is enforced by HAPI HL7? Thank you, Anadi Kashyap |