【问题标题】:Java EE/Glassfish Application LogicJava EE/Glassfish 应用程序逻辑
【发布时间】:2011-01-07 19:58:49
【问题描述】:

我试图了解我的一些应用程序逻辑在我的 Java EE 应用程序中应该放在哪里。我是 Java EE 的新手,正在考虑从遗留数据库中加载大量非结构化数据并构建一个干净的对象模型以供我的应用程序使用。根据我的调查,我看到 Java EE 应用程序有 2 个组件,企业 Bean 和 Web 应用程序组件。我的应用程序的这一部分将负责加载数据、构建对象模型并根据数据的当前状态通过 JMS 向相关方发送消息。数据将通过与数据库同步以及通过 JMS 从远程 Java 应用程序接收到的消息进行更新。

EJB 是否适合这种功能?如何开始初始化我的对象模型(主要方法 Java App 等效)?创建定时事件以查看对象模型并通过 JMS 发送消息的最佳实践是什么?

我已经阅读了许多关于 Java EE、Glassfish、EJB 的文章……但我仍然没有清楚地知道我应该在哪里编写这个功能。我看到的任何 EJB 示例都倾向于从客户端应用程序对 bean 的直接方法调用。

目前我觉得 Java 应用程序可以完成这项工作,但我们正在考虑使用 RMI,以及未来的 Web 客户端。

【问题讨论】:

    标签: java jakarta-ee glassfish ejb-3.0 jms


    【解决方案1】:

    正如您所说,这些示例往往涉及直接调用。根据我的经验,这不仅仅是例子。我见过的所有 Java EE*1 应用程序都没有像您描述的那样使用长期存在的对象图,相反,它们通常在单个记录(+children/related)上运行以响应 Web 请求、Web 服务调用或 JMS 消息.

    您的需求打破了这种模式,Java EE 可能不是最合适的。从表面上看,您描述的那种代码属于 EJB 容器,但该容器缺乏一个良好的长期上下文来锚定您的对象图。 Web Container 有这样的上下文,但缺少计时器和消息处理等设施。放弃 J2EE 并改用普通 Java 应用程序的代价当然是失去应用程序服务器的管理、部署和监控设施。

    一个不错的选择可能是回到使 Spring Framework 大的原因。我不知道您是否熟悉 J2EE 的历史,但 Spring Framework 和 Hibernate 突然大受欢迎本质上是社区对 EJB 容器 1.x / 2.x 版本的反抗。 Spring WebApplicationContext 为您提供了一个健壮的、事务性的 Web 应用程序后端,它利用了 MDB 和 JTA,同时尽可能多地忽略了 EJB 容器*2(并大大简化了过程中的单元测试)。您可以采用这种方法,将您的应用程序构建为单个 WAR 文件,并使用 Spring 启动您的后端服务。

    一个有趣的替代方案是完全放弃 Java EE 应用程序服务器,并在 OSGi 框架之上构建您的应用程序。这是“普通的 Java 应用程序”方法,OSGi 运行时为您提供管理控制台和热部署功能,否则您必须自己动手。基础设施中缺少的部分是计时器(使用Quartz)和消息驱动Bean(直接使用JMS API)。 OSGi 应用程序最终感觉有点像 Linux 内核和引导过程,服务是根据运行级别部署和启动的。抓住Apache Felix 看看吧。

    你没有提到规模。如果对象图巨大,请研究 GigaSpaces 或 Coherence 等技术。

    **1) 随着 EJB3* 的引入,Sun 从首字母缩略词中去掉了“2”

    **2) Entity EJBs 2.x 是最糟糕的部分。 EJB 3 在很大程度上可以被看作是“如果你不能打败他们,就加入他们”努力标准化 Hibernate。*

    【讨论】:

    • >"if you can't beat them, join them" effort to standardize Hibernate - 实际上,与 Hibernate 的模型非常相似的模型最初是为 EJB 1 考虑的。不幸的是,当时支持该模型的少数工程师输给了坚持使用实体 Bean 的朋友最终出现在 EJB 1 中。具有讽刺意味的是,第一个 EJB 1 实体 Bean 是由 TopLink 在后台实现的,该项目是 Hibernate 是廉价的开源版本(Hibernate 因它而闻名,但没有发明模型,TopLink早得多)
    • 是的,我知道,我对使用 Oracle 的前 WebLogic 应用服务器 Orion 感到不快。 XML 文件中的 TopLink 和自动密码混淆是唯一好的部分。 TopLink 实际上起源于 SmallTalk 世界。我自己从未使用过 SmallTalk,但我维护过一个由 SmallTalk 毕业生编写的 Java 1.1.8 应用程序。迄今为止,它是我见过的最好的面向对象的 Java 代码。 SmallTalk 孕育了卓越。
    【解决方案2】:

    Java EE 传统上用于客户端/服务器架构风格。业务逻辑在 EJB 会话 bean 中实现,通常从 Web 请求、JMS 消息或 RMI-IIOP 远程调用调用。

    EJB 是否适合此操作 什么样的功能?

    逻辑进入 EJB。但是有不同类型的 EJB。

    如何开始初始化 我的对象模型(主要方法 Java App 等价的)?

    没有main 方法这样的东西。但是仍然有一些方法可以执行与应用程序部署和/或取消部署相对应的一些处理。您可以查看ServletContextListenerGlassfish lifecycle module (non-standard) 或者新引入的Singleton bean 和@Startup 注释。

    什么是最佳实践 创建一个定时事件来查看 对象模型并通过 JMS?

    您可以创建一个定期调用的EJB Timer。如果您需要在内存中加载一次模型,我建议您也查看Singleton beans。对于 EJB 3.0,问题在于如何使用 start the timer automatically,但我认为他们在 EJB 3.1 中改进了这一点,并且当使用 @Scheduled 注释部署应用程序时,计时器可以是 started automatically by the application server。因此,它可能会以某种方式为您提供您在上一个问题中提出的所需起点。

    您可以从任何 bean 发送 JMS 消息。 JMS 就像数据库一样是一个外部系统。 JMS 消息是使用一种称为消息驱动 bean (MDB) 的特殊 EJB 接收的。

    您的应用程序不会是传统的 Web-EJB-数据库客户端-服务器应用程序,但它应该可以使用 Java EE,这绝对是一个非常灵活的模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      相关资源
      最近更新 更多