Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
面向MDB的javaee设计模式_Java_Design Patterns_Jakarta Ee - Fatal编程技术网

面向MDB的javaee设计模式

面向MDB的javaee设计模式,java,design-patterns,jakarta-ee,Java,Design Patterns,Jakarta Ee,我们正在设计一个应用程序,MDB将在其中接收传入消息并执行一系列任务 其中有些功能类似于XML验证,有些功能类似于日志、MIS条目等方面 编辑: 消息类型可以根据功能(如排序或引发故障)或信息服务(如邮政编码查找)而有所不同。调用方的顺序也各不相同,因此调用方A的顺序与调用方B的顺序不同,但大部分XML结构应该相同 每一个都将通过功能性工作单元,如发送者验证、产品代码验证(如果下订单)、安全检查(基于IP)、有效时注册到我们的数据库、无效时错误队列等 我的问题是,因为我们希望将功能位模块化,这样

我们正在设计一个应用程序,MDB将在其中接收传入消息并执行一系列任务

其中有些功能类似于XML验证,有些功能类似于日志、MIS条目等方面

编辑:

消息类型可以根据功能(如排序或引发故障)或信息服务(如邮政编码查找)而有所不同。调用方的顺序也各不相同,因此调用方A的顺序与调用方B的顺序不同,但大部分XML结构应该相同

每一个都将通过功能性工作单元,如发送者验证、产品代码验证(如果下订单)、安全检查(基于IP)、有效时注册到我们的数据库、无效时错误队列等

我的问题是,因为我们希望将功能位模块化,这样我们就可以构建一个MDB来执行功能A、B、C,另一个MDB来执行功能B、C、D等等,基于它是什么类型的消息,以及基于哪些任务在所有消息类型中都是通用的

我应该使用什么样的设计模式

其次,我是否有办法在XML文件中配置这些函数,以便MDB读取XML以查看它必须执行哪些函数以及执行的顺序?这是一种替代方法,可以将模块放在Helper pojo或会话bean中,这些模块从主MDB链接起来,这正是我们目前的想法。

,可能有一个怪癖,即每个MDB可以有几个策略。如果您想要配置bean在文件(或env条目或类似内容)中使用的策略集,那么您必须通过JNDI获得对策略的引用,而不是注入它们,这是一个小麻烦

我建议,在一个非EJB的世界中,但对于EJB,我认为很难让一个组件给另一个组件一个对其自身的长期引用。除非它们是@Singleton,而MDB不是。

,可能是因为每个MDB都有几个策略。如果您想要配置bean在文件(或env条目或类似内容)中使用的策略集,那么您必须通过JNDI获得对策略的引用,而不是注入它们,这是一个小麻烦


我建议,在一个非EJB的世界中,但对于EJB,我认为很难让一个组件给另一个组件一个对其自身的长期引用。除非它们是@Singleton,而MDB不是。

模式术语除外,我们公司一直在努力将业务逻辑排除在MDB类之外。这对于您在这里尝试构建的内容非常有效,听起来更像是企业服务总线(ESB)服务网关模式。查看以下链接(尽管不是Java,但仍然是一个好页面)和


我建议允许MDB接收消息。然后您可以使用其他模式(命令、策略、工厂等)来完成实际工作。或者,主MDB可以确定消息应该转发到哪里,然后将消息转发到专用于特定类型函数的队列

从更多队列和MDB的角度来看,这确实增加了一些管理和资源开销。但它也为不同消息的不同逻辑之间增加了更多的分离(即关注点的分离)。它还使您能够根据性能需求对不同的“实现”队列进行不同的限制,而不是让一个队列成为所有队列的瓶颈

添加新队列时需要考虑性能问题。我希望我能给你一个关于“多少”的具体答案,但我不能,因为这取决于你选择对你的应用服务器、JMS和/或消息传递提供者使用什么。不幸的是,对于正确的东西,没有神奇的“数字”。你真的必须坐下来和其他架构师讨论你需要多少队列。最好在你的设计中提前完成。这将敲出任意数量的队列。接下来,尝试计算系统上的负载。你的信息有多大?100KB?1MB?5MB?更大的?更小那么一次会有多少信息通过系统发送?有了这样的数字,你可以重新考虑关于队列数量的决定,看看它是否仍然有意义。您还可以让您的应用程序服务器/消息传递管理员(或者您,如果碰巧是您的话)使用不同的配置设置限制队列,以便允许通过您的系统进行更平滑的消息传递。(您可能还需要根据遇到的情况调整应用程序/消息服务器JVM堆设置)

遗憾的是,通过限制应用程序服务器来获得性能的最佳方法是阅读、阅读、阅读文档和论坛上关于它的任何内容。还有自己的工作经验

但即便如此。最重要的是良好而简单的设计。如果你太过火了,对所有事情都排起了队,你可能会影响性能。但是,你可能不会。但是,您可能会使应用程序过于复杂,使故障排除变得更加困难

我将尝试为您找到更多的链接,但请诚实地接受我们在这里所说的内容,并与您的开发伙伴进行讨论


如果您可以修改您的问题,说明您可能处理多少种消息类型或它们的用途,我们都可以在设计、队列数量等方面为您提供更好的建议。

除了模式术语之外,我们公司一直在努力将业务逻辑排除在MDB类之外。这对于您在这里尝试构建的内容非常有效,听起来更像是企业服务总线(ESB)服务网关模式。查看以下链接(尽管不是Java,但仍然是一个好页面)和


我建议允许MDB接收消息。然后您可以使用其他模式(命令、策略、工厂等)来完成实际工作。或者,主MDB可以找出
<configuration>
<handler name="A" class="A"/>
<handler name="B" class="B"/>
...


<handlers-stack name="stack1">
 <handler ref="A">
 <handler ref="c">
</handlers>

<message type="X" handlers-ref="stack1"/>
<message type="Y" handlers-ref="stack2"/>
</configuration>