背景
我正在为一位医生 friend 编写一个医疗记录应用程序。我被告知要在应用程序中编写一个等待 HL7 消息的监听器。这样医院就可以发送 HL7 消息,我的听众就会听到它们。于是我来到HAPI网站查看了this example 。我从中了解到的是,它正在创建一个服务器来监听消息。
我正在 Eclipse 中使用 Tomcat 7.0 上的 JSF 2.0 进行开发。人们通常将这种监听器放在 JSF 项目中的什么位置?我尝试在网上搜索这个答案,但一无所获!
我的问题
我知道这段代码位于一个类中。当该类被调用时,套接字将“打开”并等待响应。所以我想在项目部署后立即调用这个类。这是怎么做到的?如何仅调用该类一次(当应用程序启动时)以打开监听器?
非常感谢任何和所有的帮助!如果我有不清楚的地方请告诉我!
最佳答案
您通常不会在 Tomcat 托管的应用程序内运行端口监听器。通常最好将这两件事分开。总的来说,Web 服务器并不意味着在其控制范围之外运行单独的执行线程。
您可以考虑使用 Spring Integration、JBossESB 或 Apache Camel 之类的东西来接收消息并将它们处理到数据库、文件夹(或其他任何内容)中,然后 Tomcat 托管的 Web 应用程序允许您进行操作。 ESB 容器可以与 Tomcat 托管在同一个 JVM 进程中,但我自己不会采用这种方法 - 我会用一个单独的容器进行消息处理,另一个运行 Web 应用程序。
如果您确实想要一个“单一应用程序”,您可以考虑创建一个 Java 应用程序,根据您的示例启动监听器,然后启动 Tomcat 的嵌入式版本。
如果您真的想在 Tomcat 中运行它,作为 Web 应用程序本身的一部分,您可以创建一个类来进行监听并将其加载到 Web 应用程序的应用程序上下文中。您可以通过将其实例添加到自动加载的 servlet 内的 appl 上下文中来完成此操作 - 使用 <load-on-startup>1</load-on-startup>
在 servlet 定义中。您可以对 servlet 进行编码,以在添加新实例之前检查上下文中是否已经存在一个实例(万一手动调用过该实例),或者沿着 Spring 容器路线将此对象作为单例进行管理。
* 编辑:20120114T004300Z *
Apache Camel是 Enterprise Service Bus 可能使用的路由引擎的示例(ESB),例如 Apache ServiceMix,它允许多个应用程序通过交换消息进行互操作。从声音来看,您只能使用此应用程序可用功能的一小部分。例如,对于您正在做的事情,您可能只能使用嵌入在 Spring 中的 Camel 功能。
本质上,ESB 运行“适配器”(或端点)——其中一种类型将由您在此处讨论的套接字“监听器”执行,或者可能正在监视文件夹中是否有文件到达,或者轮询数据库表以获取文件传输(“消息”(在您的情况下为 HL7 文件)到达的方式)从应用程序本身的功能中抽象出来。适配器将消息放入一个可以配置为在途中转换消息的 channel 。Camel 实际上附带了一个 HL7 component ,它可以理解 HL7 文件格式并将其解码为 HL7 模型。(它还为您提供所需的监听器/适配器)。然后,您可以在 ESB 中设置路由,将该模型传递给“消费者”Java 类,该类可以执行您需要执行的任何操作。
如果您正在处理“标准”传输、协议(protocol)和消息类型,则大多数文件接收、解析和路由只是通过 ESB 的声明性配置而不是编码来处理。
您的 Tomcat Web 应用程序可以完全自主地运行此消息处理。如前所述,有多种部署选项可以说明您具体如何执行此操作 - 包括在您的 Web 应用程序托管在 Tomcat 中的 Spring 容器内加载 Camel(如果您愿意)。
抱歉,如果这有点糟糕。花一些时间在网上阅读有关该主题的内容,鉴于 HL7 是一个标准,您可能会 find a lot of code/components already out there这可能会为您节省大量重新实现基本文件处理的时间,以便您可以专注于为您的 friend 开发增值网络应用程序。
关于java - 实现 java 的 Hl7 解析器监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8765703/