将EJB业务逻辑与非EJB混合是一种好的做法吗?

时间:2015-12-12 14:15:01

标签: java jpa java-ee jboss ejb

我正在从头开始构建Java EE应用程序,其中大部分内容对我来说都很清楚。应用程序服务器是Wildfly 9.该应用程序使用maven作为构建工具。它将应用程序构建到ear归档中,然后部署到服务器。使用EAR帮助我理解了Java EE层如何相互依赖,但现在困扰我的是我是否允许使用非ejb模块来包含业务逻辑?

我会试着解释一下。 我的应用程序模块按以下层次结构对齐:

 ┌─────────────────────┐
 │ war (rest services) │
 └──────────┬──────────┘
 ┌──────────┴──────────────────┐
 │ ejb (em.persist, em.getAll) │ 
 └──────────┬──────────────────┘
 ┌──────────┴───────┐
 │ annotated models │
 └──────────────────┘

我要做的是添加一些异步收集数据并将其存储在数据库中的模块。该模块旨在使用不同的源收集数据,对其进行分析,然后放入数据库。此外,一个模块应该能够在具有不同初始参数的少数情况下运行。最后,这些模块必须被视为插件。如果我从EAR中排除插件,应用程序应该能够正常启动,反之亦然,如果我添加一个新模块,应用程序看到它,我可以使用我的前端配置它的参数。

如何正确地做到这一点,允许应用程序进一步增长并使用大多数java-ee-way? 首先想到的是在ejb和模型之间放置插件,为持久性操作添加另一个模块,并使用可以将数据存储到数据库中的对象实例化插件。

 ┌─────┐
 │ war │
 └──┬──┘
 ┌──┴──┬──────────┬─────────────┐
 │ ejb │ p.getAll │ initPlugins ├─────┐
 └─────┴────┬─────┴───┬─────────┘     │
            │    ┌────┴────┐     ┌────┴────┐
            │    │ plugin1 │ ... │ pluginN │
            │    └────┬────┘     └────┬────┘
┌───────────┴─────────┴───────────────┴───┐
│ ejb persistence (em.persist, em.getAll) │
└───────────┬─────────────────────────────┘
        ┌───┴───┐
        │ model │
        └───────┘

EJB层可以从数据库中读取设置,使用Class.forName(插件)方法获取插件,提供具有持久性实现的插件并以异步方式启动它们。这是有效的,我知道,因为我刚刚做到了。但有一个问题困扰我:我做得对吗?

插件可以由应用服务器管理吗? wildfly可以从一个具有不同初始参数的类创建多个EJB吗?据我所知,CDI允许我为集合注入几个接口实现,但是我可以使用它将同一个类的第二个,第三个实例插入到该集合中吗?如果有人向我说清楚会很好。我现在想象的如下所示:

 ┌─────┐
 │ war │
 └──┬──┘
 ┌──┴──┬───────────┬─────────────┐
 │ ejb │ em.getAll │ initPlugins ├─────────┐
 └─────┴────┬──────┴─────┬───────┘         │
            │     ┌──────┴─────┐     ┌─────┴──────┐
            │     │ ejbplugin1 │ ... │ ejbpluginN │
            │     └──────┬─────┘     └─────┬──────┘
     ┌──────┴────────────┴─────────────────┴───┐
     │                 model                   │
     └─────────────────────────────────────────┘

在这两种情况下,也许我错了。我没有想法,所以我在这里问我的问题。 还有一件令我厌烦的事情。据我所知,每个ejb方法都在事务中执行。这是否意味着每当我在ejb方法中启动我的批量插件时,它们都是在单个事务中执行的,尽管它们异步运行并且ejb方法很久以前就结束了?是否意味着如果其中一个插件崩溃,整个事务将被还原并且所有数据都将丢失?如果是这样,如何解决这个问题?

请随意回答您是否只知道我的部分问题的答案,或者我的猜测完全错误。

0 个答案:

没有答案