Java EE 和应用程序服务器 - 我能做啥?

Posted

技术标签:

【中文标题】Java EE 和应用程序服务器 - 我能做啥?【英文标题】:Java EE and application servers - What can i do?Java EE 和应用程序服务器 - 我能做什么? 【发布时间】:2010-10-25 05:57:15 【问题描述】:

我决定是时候深入研究 Java EE 的全部内容了。我正在使用一些 Java SE 的 EE 技术,比如 JPA 或 JMS,但我仍然在使用 Java SE,我相信 Java EE 和应用服务器会解决我遇到的一些问题。

但是:在阅读了网络上的一些文章后,我仍有一些疑问。

1st:我是否仅限于请求响应应用程序?我有一个通过 HTTP 提供 XML 文档的应用程序。所有交付的对象都被添加到一个队列中,该队列将在不同的线程中分派。对此对象进行了一些验证,包括打开远程机器的套接字(我听说不允许 EJ-Beans 这样做,这是真的吗?)。那么,是否可以在应用程序服务器中执行此操作?

第二:我知道有消息驱动的 bean,是否可以从应用程序服务器外部将 JMS 消息发送到 MDB?我有一个发送 JMS 消息的服务,但作为遗留系统运行,而不是在同一个应用程序服务器内。

3rd:系统管理员或用户如何配置我的应用程序?我知道在应用程序服务器中配置了一些诸如数据库连接之类的东西,我的应用程序可以通过 JNDI 查找它们或通过 DI 获取它们。但是应用程序特定的配置呢?

是的,这些都是非常愚蠢的问题,但也许有人有时间向我解释所有这些东西是如何工作的。 :)

问候, 正则化

PS:

4th:似乎 EJB 不允许对文件做任何事情,所以 Java EE 似乎不是接收文件的服务的选择,将它们推送到不同的系统并希望它们写入套接字(参见问题 1 )?

【问题讨论】:

【参考方案1】:

我可以说在您的情况下可以毫无疑问地使用 Java EE。让我深入探讨一下您的具体问题:

    您可以从 EJB 打开套接字连接。没有什么可以阻止你这样做。但是,不建议对 Java EE 应用程序进行这种操作。在我看来,更好的选择是实现 Java EE 连接器 (JCA),它可以管理与您的专有系统的套接字连接池。这是按照规范实现此类集成的模型方式。

    是的!完全可以接收从外部应用程序/系统(AS 外部)发送的消息。这是使用消息传递集成的主要思想 :) 在许多情况下,您的应用程序是 Java EE 应用程序通过 MDB 从 JMS 通道接收消息,但 JMS 只是一个 API,可以由任何消息传递系统实现,例如IBM MQ。在此架构中,外部系统将 MQ 消息放入队列中,而您的 Java EE 应用程序监听队列并通过 JMS API 接收消息!

    一般而言,Application Server 为管理员提供了很好的工具来管理 Java EE 资源,即数据源、JMS 连接工厂、JMS 目标、JTA 事务管理器等。如果您需要能够更改特定的 Java EE 应用程序,则最好的选择似乎是 JMX。只需实现一些 MBean,将它们导出到嵌入在 Application Server 中的 JMX 服务器,就完成了。这项任务在 JBoss 中确实是微不足道的,但如今大多数现代应用程序服务器都提供了广泛的 JMX 功能。

    乍一看,EJB 似乎不是处理文件的最佳选择。但是请记住,您的 EJB 的实现仍然是用纯 Java 编写的,因此没有什么能阻止您读取/流式传输文件等。我在处理大型文件作为输入文件的大型 Java EE 应用程序方面有经验,可以向您保证 Java EE 是一个不错的技术选择:)

【讨论】:

关于文件的要点是文件不可集群或可缩放(也就是说,如果存在故障转移场景,您会丢失文件),所以如果您需要那种可扩展性,这将是有意义的和容错,您需要将文件处理器隔离到某种其他类型的上下文而不是 J2EE 容器。如果你只是在一个简单的单实例 J2EE 容器中运行并且应用服务器允许它,那就没问题了。 Yoshai,可扩展性和容错性是文件系统选择的问题。可以使用现代容错(并行)分布式文件系统,它可以为您提供很多。您在 JEE 应用程序中处理文件和套接字的事情是由应用程序服务器 (JTA) 管理的事务。根据我的经验,事务(尤其是 XA 基础架构)是可靠 JEE 应用程序的关键特性之一。【参考方案2】:

我建议将每种技术应用于您当前感到疼痛的适当点。关于你的具体观点,

    在 EE 上下文中,您可以将消息添加到 JMS 队列中,该队列具有可以执行实际处理的 MDB。关于 HTTP 请求/响应生命周期的管理,您可以像现在一样管理它,或者使用现有的库来为您做。通过迁移到 EE 应用服务器,您将允许应用服务器管理线程、事务等,而不必手动管理。

    正如 duffymo 所说,MDB 负责接收消息,它们不关心消息的来源。

    系统管理员可以按照 duffymo 的说明配置应用服务器。此外,您可以将 JMX bean 公开给其他系统或最终用户,以允许他们根据需要配置服务。

【讨论】:

【参考方案3】:
    在像 Tomcat 这样的应用服务器(可能还有其他应用服务器,但我从未使用过它们)中,您不仅可以在收到请求时执行操作,还可以在服务器启动时执行操作(包括启动长时间运行的线程)。基本上,您可以使用“普通”Java 做任何事情。事实上,如果你只包含一段在服务器启动时调用适当的 main() 的代码,你就可以将一个普通的 Java 应用程序放在应用程序服务器中。

【讨论】:

【参考方案4】:
    对文件执行任何操作都违反了 EE 规范(以确保 EE 应用程序是可移植和可分发的)。然而,由于这只是简单的 Java 代码,yopu 可以选择做任何你想做的事情。只要您知道目标环境的外观(例如系统供内部使用),我会毫不犹豫地修改文件,因为规范是这样说的。

【讨论】:

【参考方案5】:

Here 是对 EJB 1.1 规范的限制。

以下是我对您的问题的看法:

    我相信 EJB 可以在远程计算机上打开套接字,但我会说打开套接字的操作级别太低。我会考虑将套接字为您所做的任何事情公开为另一个 EJB。 MDB 只是一个向特定主题或队列注册的侦听器。它没有说任何关于发送的内容。如果您的客户知道如何将消息发送到队列,这是可能的。他们只需要知道队列 URL 并能够创建连接。 管理员设置连接池、JNDI 名称等 - 一切。他们使用应用服务器的管理控制台来执行此操作。

【讨论】:

以上是关于Java EE 和应用程序服务器 - 我能做啥?的主要内容,如果未能解决你的问题,请参考以下文章

DevOps能做啥?

flex能做啥

JMS 能做啥 REST 不能做啥

Go语言能做啥?

JAVA设计模式:装饰模式

小程序能做啥和不能做啥