2

背景

我正在为一个医生朋友写一个病历应用程序。我被告知在等待 HL7 消息的应用程序中编写一个侦听器。这样医院就可以发送 HL7 消息,我的听众会捕捉到它们。所以我来到了 HAPI 网站并查看了这个例子。我从中了解到的是它正在创建一个服务器来监听消息。

我正在使用 Tomcat 7.0 上的 JSF 2.0 在 Eclipse 中开发它。通常将这种侦听器放在 JSF 项目中的什么位置?我试过在网上搜索这个答案,但一无所获!

我的问题

我知道这段代码在一个类中。当类被调用时,套接字将被“打开”并等待响应。所以我想在项目部署后立即调用这个类。这是怎么做的?我如何只调用一次该类(当应用程序启动时)以打开侦听器?

非常感谢任何和所有帮助!如果我对某些事情不清楚,请告诉我!

4

5 回答 5

4

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

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

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

如果您真的想在 Tomcat 中运行它,作为 Web 应用程序本身的一部分,您可以创建一个类来进行监听并将其加载到 Web 应用程序的 Application 上下文中。您可以通过将它的一个实例添加到自动加载的 servlet 内的 appl 上下文中来做到这一点 -<load-on-startup>1</load-on-startup>在 servlet 定义中使用。您可以编写 servlet 以检查上下文中是否已经存在一个实例,然后再添加一个新实例(如果它曾经被手动调用过),或者沿着 Spring 容器路由将该对象作为单例进行管理。

* 编辑:20120114T004300Z *

Apache Camel是一个路由引擎的示例,它可能被企业服务总线(ESB) 使用,例如 Apache ServiceMix,它允许多个应用程序通过交换消息进行互操作。您只会使用该应用程序的一小部分功能可用性。例如,对于您正在做的事情,您可能只能使用 Spring 中嵌入的 Camel 功能。

本质上,ESB 运行“适配器”(或端点)——其中一种类型将由您在此处讨论的套接字“侦听器”,或者可能正在监视文件夹以获取文件到达,或轮询数据库表以获取要出现的行,或等待 JMS 队列等。传输(“消息”(在您的情况下为 HL7 文件)到达的方式从应用程序本身的功能中抽象出来。适配器将消息放到通道上可以配置为在途中转换消息。骆驼实际上附带了一个HL7 组件,它可以理解 HL7 文件格式并将其解组为 HL7 模型。(它还为您提供所需的侦听器/适配器)。然后在 ESB 中设置路由以将该模型传递给“消费者”Java 类可以做任何你需要做的事情。

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

您的 Tomcat webapp 可以完全自主地运行此消息处理。如前所述,有多种部署选项可用于说明您将如何执行此操作 - 如果您愿意,包括将 Camel 加载到 Web 应用程序托管在 Tomcat 中的 Spring 容器中。

抱歉,如果这有点笨拙。花一些时间在网上阅读这个主题,因为 HL7 是一个标准,您可能会发现很多代码/组件已经存在,这可能会为您节省大量时间来重新实现基本文件处理,因此您可以专注于为您的朋友增值的网络应用程序。

于 2012-01-13T00:46:02.953 回答
2

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

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

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

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

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

于 2012-01-07T00:15:01.837 回答
1

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

Apache Camel 有一个内置的 HL7 v2 消息解析器(使用 HAPI),它是 HL7 的制表符分隔变体:http: //camel.apache.org/hl7.html

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

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

于 2013-02-15T16:09:17.097 回答
0

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

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

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

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

由于您可以注册多个侦听器,因此您可以实现许多操作,例如,您可以为 ADT A01 消息设置两个侦听器(承认患者);一个为他们预订,一个为他们分配一张床。

于 2012-01-07T03:21:01.697 回答
0

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

于 2012-01-07T04:40:54.133 回答