为java实现Hl7解析器监听器

时间:2012-01-06 23:13:30

标签: java jsf listener hl7 hapi

背景

我正在为一位博士的朋友写一个医疗记录应用程序。有人告诉我在应用程序中写一个等待HL7消息的监听器。通过这种方式,医院可以发送HL7消息,我的听众会抓住它们。所以我来到了HAPI网站并查看了this example。我从中理解的是,它正在创建一个服务器来监听消息。

我正在使用Tomcat 7.0上的JSF 2.0在Eclipse中开发它。通常将这种监听器放在JSF项目中的哪个位置?我已经尝试在线搜索这个答案而一无所获!

我的问题

我知道这段代码会进入一个类。当类被调用时,套接字将“打开”并且它将等待响应。因此,我希望在部署项目后立即调用此类。怎么做的?我如何只调用该类一次(当应用程序启动时)以打开监听器?

非常感谢任何和所有帮助!如果我不清楚某些事情让我知道!

5 个答案:

答案 0 :(得分:4)

您通常不会在Tomcat中托管的应用程序内运行端口侦听器。你通常最好将这两件事分开。总的来说,Web服务器并不意味着在其控制之外运行单独的执行线程。

您可以考虑使用Spring Integration,JBossESB或Apache Camel之类的东西来接收消息并将它们处理到Tomcat托管的Web应用程序然后允许您操作的数据库,文件夹(或其他)中。 ESB容器可以托管在与Tomcat相同的JVM进程中,但我自己也不会采用这种方法 - 我有一个单独的进行消息处理而另一个运行webapp

如果你真的想要一个单一的应用程序"您可以考虑创建一个Java应用程序,根据您的示例启动侦听器,然后启动嵌入式Tomcat版本。

如果您真的真的想在Tomcat中运行它,作为Web应用程序本身的一部分,您可以创建一个执行侦听的类,并将其加载到Web应用程序的Application上下文中。您可以通过在自动加载的servlet中的appl上下文中添加它的实例来实现此目的 - 在servlet定义中使用<load-on-startup>1</load-on-startup>。您需要对servlet进行编码,以便在添加新实例之前检查上下文中是否已存在实例(在有机会调用它的情况下),或者沿着Spring容器路径下载以将该对象作为单例进行管理

*编辑:20120114T004300Z *

Apache Camel是可能由Enterprise Service Bus(ESB)使用的路由引擎的示例,例如Apache ServiceMix,它允许多个应用程序通过交换消息进行互操作。您只能通过它的声音使用此应用程序的一小部分功能可用性。例如,对于您正在做的事情,您可能只能使用嵌入在Spring中的Camel功能。

从本质上讲,ESB运行&#34;适配器&#34; (或端点) - 其中一种类型将由socket&#34; listener&#34;您在这里谈论,或者可能正在观看文件夹以获取文件,或者轮询数据库表以显示行,或等待JMS队列等。传输(&#34;消息&#34的方式;(在你的情况下,HL7文件)到达时会从应用程序本身的功能中抽象出来。适配器将消息放入一个可以配置为在途中转换消息的通道.Camel实际上附带了{{3} }它可以理解HL7文件格式并将其解组为HL7模型。(它还为您提供了所需的监听器/适配器)。然后您在ESB中设置路由以将该模型传递到&#34 ; consumer&#34; Java类,它可以完成你需要做的任何事情。

如果您正在处理&#34;标准&#34;传输,协议和消息类型大多数文件接收,解析和路由只是由ESB的声明性配置而不是编码来处理。

您的Tomcat webapp可以完全自主运行此消息处理。如上所述,有多种部署选项可以确定您是如何做到这一点的 - 包括如果您愿意,可以通过您的webapp将Camel加载到Tomcat托管的Spring容器中。

道歉,如果这有点woffley。花一些时间阅读网络上的主题,因为HL7是一个标准,你可能HL7 component可能会节省你很多时间重新实现基本的文件处理,所以你可以专注于为您的朋友增值的webapp。

答案 1 :(得分:2)

“Listener”只是一个侦听开放端口的类。在Java中,这主要是通过Socket API完成的,尽管您可能会找到一个更适合您目的的库。

Java Tutorial在这里有一些例子: http://docs.oracle.com/javase/tutorial/networking/sockets/index.html

在这种情况下,您将编写一个服务器(客户端 - 服务器安排的监听部分),而发送该消息的医院系统将扮演客户端的角色。

一旦您正在侦听端口,则HL7消息以纯文本形式到达该套接字的输入流。您可以手工解析消息(如果您只对消息中的一个或两个详细信息感兴趣,或者如果您计划处理几十种类型的消息,则可以查看其中一个HL7解析库)

请记住,HL7消息的不同实现者有时可以以微妙的不同方式发送数据。 (不幸的是,许多用户将HL7视为“推荐”而不是“标准”!)如果您计划支持来自众多不同提供商的大量不同提要,那么您将 更好使用像MirthConnect这样的中间件层来处理消息的解析和转换,使其成为您的应用程序旨在理解的内容。

答案 2 :(得分:1)

超过一年的时间,你可能已经把它全部搞清楚了,但企业服务总线(ESB)是一种中间件(当你想到软件时,有后端即数据库/分析/管理工具和前端 - 结束即App / WebApp / GUI显示并与最终用户交互),中间件位于其间并帮助执行任务的集成或分离/协调。 Apache ServiceMix(包含Apache Camel路由引擎的ESB)可能是您想要的,可用于实现许多不同的企业集成模式,例如“消息路由”(您想要的那个)。

Apache Camel有一个内置的HL7 v2消息解析器(使用HAPI),这是HL7的Tab-Separated变体:http://camel.apache.org/hl7.html

对于XML格式的HL7 v3消息,您可以使用v3实用程序下提供的工具包: http://www.hl7.org/participate/toolsandresources.cfm?ref=nav

有服务器(消息侦听和阅读)和客户端(消息创建和发送)示例。

答案 3 :(得分:0)

“Listener”通常是Java中的事件监听器。

在您发布链接的示例中,您有一个服务器类,它处理打开网络套接字并等待消息到达的业务。

Application个对象是事件侦听器。这些被添加到服务器类的内部集合中(在这种情况下,使用其他参数告诉服务器哪些侦听器将哪些类别的HL7消息路由到)。

每个Application类必须实现一个特定的接口 - 这构成了事件监听器。 SimpleServer类将调用此接口的方法; processMessage();为了基于消息内容执行操作,您编写了一个实现此接口的类,并将其实例传递给服务器类。在processMessage()方法中,您可以执行所有必需的操作。

由于您可以注册多个侦听器,因此您可以实施许多操作,例如:您可以为ADT A01消息提供两个听众(允许患者);一个预订了他们的人,另一个给他们安排了一张床。

答案 4 :(得分:0)

我建议将Mirth Connect http://www.mirthcorp.com/community/mirth-connect视为您的HL7消息集成引擎。在内部,它使用HAPI。