Java EE:从域模型动态创建和删除套接字侦听器

问题描述

|| 我正在创建一个Java EE应用程序,该应用程序允许用户从Web界面添加/删除\“ socketinfo \\”表(存储在数据库中)。如果用户从Web界面启用\“ socketinfo \\”,则应用程序服务器必须为传入的数据包创建套接字侦听器并处理数据。如果用户禁用或删除\“ socketinfo \”,则必须删除套接字侦听器。整个产品必须放在一只耳朵里,最好是顺从的。我考虑过但遇到问题的一些方法是: 为套接字创建JCA资源适配器,并将MDB用作侦听器。我在这里遇到的问题是,当用户添加MDB时,我无法弄清楚如何以编程方式为不同的套接字部署MDB。 创建一个@ Singleton / @ Service ejb,它通过仔细同步来管理守护程序线程。可以将单例ejb注入业务层,以便在正确的工作流中进行CRUD操作和套接字操作。这里的问题是,假设从EJB创建线程被认为是一种不好的做法,并且不符合规范(即使正确处理了单例生命周期并建立了适当的同步机制?)。 将线程放入域模型(另一个单例?)中,并让EJB使用该模型。这是所有应用程序中最糟糕的,因为应用程序服务器通常具有多个类加载器,通常容器支持较少,而且这还遭受了所有2.的困扰。 知道如何在Java EE中正确处理这种情况吗? 编辑:对该问题的扩展:假设我决定像ewernli那样在他的解决方案3中建议解决此问题,那么在JCA中(通过添加自定义接口添加内部线程)在JCA中这样做会获得什么呢?设计良好的)单身人士?尽管创建资源适配器看起来并不艰巨,但它看起来并不完全琐碎,可能会浪费一些时间(对于其他开发人员而言可能更难遵循)。     

解决方法

您的分析似乎很合理,当您说不能动态部署MDB以使其适合JCA时,您说对了。 更多的设计思路: 您可以编写一个返回
SocketConnections
的JCA连接器(本着JMS的精神),该连接器可用于从套接字读取。继续进行JMS类比,MDB代表
MessageListener
,而您要暴露的是
MessageConsumer
。 您可以使用定期计时器来模拟线程。您可以使用自己重新计划的计时器,而不是带有while循环的线程。我使用它来使一个应用程序具有后台进程,并且效果很好。请注意,我还直接从EJB产生了线程,以便在另一个应用程序中进行一些并发计算,而且效果也很好。但是,短命的线程和Bean中的业务方法将等到全部完成为止,因此这并不是对该规范的重大违反。 还有一种设计是让JCA连接器处理线程等,并将所有消息传递到MDB。 MDB将接收数据,以及与数据对应的“通道”有关的信息,例如。套接字端口。这就像在一个MDB中多路复用,然后对数据进行多路分解。您的连接器可以提供额外的API来控制线程等的创建,并且该接口可以注入到EJB中(类似于
ConnectionFactory
)。您的连接器可以提供额外的API,以控制线程的创建等。虽然不是很清晰,但希望您能理解。如果我是对的,那么JCA连接器可以确保至少每个套接字将数据同步传递到MDB,以便MDB以严格的顺序处理数据。 如果开发时间允许的话,我将排名第三。 编辑 这种选择的确确实部分是设计纯度的问题。尽管用户混杂线程具有一个问题,但是显然您不能为它们使用声明式事务。不过,您可以自己使用
UserTransaction
划定交易范围。我不知道在这样的线程中也可以很好地使用
EntityManager
。如果您主要处理数据并且不使用中间件的太多功能,则可以自己生成线程。看到我的另一个答案:EJB如何并行化耗时长的CPU进程?我想到的其他事情(不知道它们是否有问题):安全管理器可能会阻止创建线程(?),不创建它们是因为守护进程线程可能会阻止应用程序。服务器已正确关闭(?)。请注意,我在启动时从ѭ6生成了线程,效果很好。即使违反规范,这也是经常使用的技巧。对于“新”引入的单例bean,可能也是如此。因此,如果时间不多,您当然可以尝试使用单例bean来确定自己的主张,然后看看有没有用。     ,我相当确定#2是最好的解决方案(并且同样有效)。我没有查看新的“ Singleton” ejb的规范,但我的假设是可以接受其中的线程化(考虑到可以在这些ejb中进行自己的同步)。这些设计旨在使您可以更轻松地部署管理类型的服务,您以前可以使用JMX来完成(尽管部署不是标准化的)。在JMX mbean中,做自己的线程管理当然是可以接受的,所以我会将其带到Singleton ejbs。 快速浏览了ejb 3.1规范,我想Singleton的唯一余地是并发控制,没有线程/套接字的东西。有点傻我猜他们不是成熟的JMX mbean替代品。也就是说,尽管部署是非标准的,但您始终可以使用JMX mbean。如果您使用的是jboss,则Service注释等效于JMX mbean,其中应允许所有内容(线程,套接字等)。