您通常不会在 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 是一个标准,您可能会发现很多代码/组件已经存在,这可能会为您节省大量时间来重新实现基本文件处理,因此您可以专注于为您的朋友增值的网络应用程序。