我正在从头开始构建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方法很久以前就结束了?是否意味着如果其中一个插件崩溃,整个事务将被还原并且所有数据都将丢失?如果是这样,如何解决这个问题?
请随意回答您是否只知道我的部分问题的答案,或者我的猜测完全错误。