Java EE/Glassfish 应用逻辑

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

企业Java Bean(EJB)是否是这种功能的正确位置?如何启动对象模型的初始化(Java应用程序等效的主方法)?创建定时事件以检查对象模型并通过JMS发送消息的最佳实践是什么?

我已经阅读了许多关于Java EE、Glassfish、EJB等的文章,但仍然不清楚应该在哪里编写这个功能。我看到的所有EJB示例似乎都是关于从客户端应用程序直接调用bean的方法。

目前,我觉得Java应用程序可能能够胜任这项工作,但我们未来计划使用RMI和Web客户端。

2个回答

7

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

EJB是这种功能的正确位置吗?

逻辑放在EJB中。但有不同类型的EJB。

如何启动我的对象模型的初始化(相当于Java应用程序的main方法)?

没有所谓的main方法。但仍然有一些方式可以执行与应用程序部署和/或卸载相对应的处理。您可以查看ServletContextListenerGlassfish生命周期模块(非标准)或最新引入的Singleton beans和@Startup注释。

什么是创建定时事件以审查对象模型并通过JMS发送消息的最佳实践?
您可以创建一个EJB Timer定期调用。如果需要将模型加载到内存中一次,建议您也查看Singleton beans。在EJB 3.0中,问题是如何自动启动计时器,但我认为在EJB 3.1中已经改善了这一点,并且当使用@Scheduled注释部署应用程序时,计时器可以由应用程序服务器自动启动。因此,它可能会为您提供所需的起点,就像您在之前的问题中所要求的那样。
你可以从任何bean发送JMS消息。JMS就像数据库一样是外部系统。使用特殊类型的EJB(称为消息驱动bean或MDB)接收JMS消息。
你的应用程序不会成为传统的Web-EJB-数据库客户端/服务器应用程序,但在Java EE中实现这一点是可行的,因为Java EE是一个非常灵活的模型。

2
正如你所说,这些示例往往涉及直接调用。根据我的经验,不仅仅是这些示例。我见过的所有Java EE*1应用程序都没有使用像你描述的长期存活的对象图,而是通常在响应Web请求、Web服务调用或JMS消息时操作单个记录(+子/相关记录)。
你的要求打破了这种模式,而Java EE可能并不是最适合的选择。表面上看,你所描述的代码属于EJB容器,但该容器缺乏一个良好的长期存活上下文以锚定你的对象图。Web容器具有这样的上下文,但缺乏计时器和消息处理等功能。放弃J2EE,而使用纯Java应用程序的成本当然是失去应用服务器的管理、部署和监控设施。
一个不错的选择可能是回到Spring框架的优势。我不知道你是否熟悉J2EE的历史,但Spring框架和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)Sun在引入EJB3时从缩略语中删除了“2”*

** 2)实体EJB 2.x是最糟糕的部分。 EJB 3可以被视为主要是一种“如果你不能打败他们,就加入他们”的努力,以标准化Hibernate。*


如果你无法打败他们,就加入他们 - 努力标准化Hibernate。实际上,像Hibernate这样的模型最初被考虑用于EJB 1。不幸的是,当时支持该模型的工程师很少,他们输给了坚持使用实体Bean的伙伴们,最终在EJB 1中出现了实体Bean。具有讽刺意味的是,第一个EJB 1实体Bean是由TopLink在后台实现的,Hibernate是其廉价开源版本的项目(Hibernate因此而闻名,但并没有发明该模型,TopLink早得多)。 - Arjan Tijms
是的,我知道,我不幸曾经与Oracle的WebLogic应用程序服务器之前的Orion一起工作过。TopLink和XML文件中的自动密码混淆是唯一的好处。实际上,TopLink起源于SmallTalk世界。我自己从未使用过SmallTalk,但我曾经维护过一个由一群SmallTalk毕业生编写的Java 1.1.8应用程序。直到今天,它仍然是我见过的最好的面向对象Java代码。 SmallTalk培养了卓越。 - Barend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接