- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在创建一个 Java EE 应用程序,允许用户从 Web 界面添加/删除“socketinfo”表(存储在数据库中)。如果用户从 Web 界面启用“socketinfo”,应用程序服务器必须为传入的数据包创建一个套接字监听器并处理数据。如果用户禁用或删除“socketinfo”,则必须删除套接字监听器。整个产品必须包含在一个耳朵中,并且最好是合规的。我考虑过但遇到问题的一些方法是:
为套接字创建 JCA 资源适配器并使用 MDB 作为监听器。我在这里遇到的问题是,当用户添加 MDB 时,我无法弄清楚如何以编程方式为不同的套接字部署 MDB。
创建一个 @Singleton/@Service ejb 来管理守护线程并仔细同步。可以将单例 ejb 注入(inject)业务层,以便在正确的工作流中进行 CRUD 操作和套接字操作。这里的问题是,据称从 EJB 创建线程被认为是一种不好的做法,并且不符合规范(即使单例生命周期得到正确处理并且适当的同步机制已经到位?)。
将线程放入域模型(另一个单例?)并让 EJB 使用该模型。这是所有这些中最糟糕的,因为应用程序服务器往往有多个类加载器,一般来说容器支持较少,而且这会带来所有问题 2. 问题。
知道如何在 Java EE 中正确处理这种情况吗?
编辑:这个问题的扩展:假设我决定像 ewernli 在他的解决方案 3 中建议的那样解决这个问题,那么在 JCA 中这样做(使用自定义接口(interface)来添加内部线程)我会得到什么,我不会得到来自(精心设计的)单例?虽然创建资源适配器看起来不像是一项艰巨的任务,但它似乎并不完全微不足道并且可能会耗费一些时间(对于其他开发人员来说可能更难遵循)。
最佳答案
您的分析似乎是合理的,您说的不能动态部署 MDB 以适应 JCA 是正确的。
更多的设计思路:
您可以编写一个返回 SocketConnections
的 JCA 连接器(本着 JMS 的精神),您可以使用它从套接字中读取数据。继续 JMS 类比,MDB 代表 MessageListener
,而您要公开的是 MessageConsumer
。
您可以使用周期性计时器来模拟线程。与带有 while 循环的线程不同,您有一个可以重新安排自身时间的计时器。我将它用于一个应用程序,使其具有后台进程,并且效果很好。请注意,我还直接从 EJB 生成线程以在另一个应用程序中执行一些并发计算,并且效果也很好。但是短命的线程和bean中的业务方法会一直等到全部完成,所以这不是对规范的重大违反。
另一种设计是让 JCA 连接器处理线程等,并将所有消息传递给 MDB。 MDB 将接收数据,以及有关数据对应的“ channel ”的信息,例如套接字端口。这就像在一个 MDB 中进行多路复用,然后对数据进行多路分解。您的连接器可以提供额外的 API 来控制线程的创建等,并且可以将此接口(interface)注入(inject)到您的 EJB 中(类似于 ConnectionFactory
)。您的连接器可以提供额外的 API 来控制线程的创建等。不是很清楚,但我希望您能理解。如果我是对的,JCA 连接器可以确保将数据同步传送到 MDB,至少是每个套接字,以便 MDB 以正确的顺序处理数据。
如果开发时间允许,我会选择 #3,。
编辑
这种选择确实在一定程度上是设计纯度的问题。用户生成线程的一个问题是您显然不能对它们使用声明式事务。不过,您也许可以使用 UserTransaction
自己划分事务。我不知道您在这样的线程中使用 EntityManager
的效果如何。如果您主要处理数据并且不使用中间件的很多功能,则可以自己生成线程。看我的另一个回答:How can an EJB parallelize a long, CPU intensive process? .我想到的其他事情(不知道它们是否有问题):安全管理器可能会阻止创建线程(?),而不是将它们创建为 deamon threads可能会阻止该应用程序。服务器正确关闭(?)。请注意,我在启动时从 ServeletContextListener
生成了线程,而且效果很好。这是一个经常使用的技巧,即使它违反了规范。对于"new"引入的单例 bean,情况可能也是如此。所以,如果你时间不够,你当然可以用一个单例 bean 来尝试你的提议,看看什么有效/无效。
关于Java EE : Creating and deleting socket listeners dynamically from the domain model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6106360/
我遇到了搜索引擎优化问题,用户可以通过指定任何子域访问我的站点。这会导致 SEO 出现重复页面问题。 例如,如果用户错误输入“www”然后在论坛上发布了一个链接,则谷歌正在抓取“wwww.domain
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicates: Can I change all my links to just //? Network-Path Ref
我正在玩 lighttpd在小型虚拟专用服务器上。我两个域指向服务器。我在 Ubuntu 8.10 上使用最新版本的 lighttpd 和 mod_evhost。 我正在尝试设置一个规则,这样如果任何
我正在开发一个由 domain.ext 提供的网络应用程序。此 Web 应用程序使用基于 cookie 的 session ,并为用户提供在子域上托管包含自定义 JavaScript 的网页的能力,例
我想重定向: 情况一、example.com到subdomain.example.com 情况2.www.example.com到subdomain.example.com 我已将这两段代码放入我的
我遇到了“领域对象”这个术语,并在 Google 上找到了几个定义,但我只是想验证我的理解是否正确。 这是否只是表示业务规则的任何类 - 因为“域”一词通常表示特定于某些本地问题集的规则,例如如何计算
将我们的应用程序静态内容托管在一个完全不同的域上而不是像其他域一样托管在我们主域的子域上有什么好处吗?例如微软使用 i.microsoft.com,谷歌使用 gstatic.com,雅虎使用 yimg
Orbited的客户端JS组件( cometd 服务器),要求如果服务器运行在与 JS 本身不同的域或端口上,则必须执行 document.domain = document.domain; 在加载任
我通读了另一篇文章,但似乎没有人回答我一直遇到的问题。是否可以使用通配符域的通配符子域(即使它仅用于子域而不是子子域),例如:foo.example.local。 我已经有 example.local
我在 Google Domains 上有一个域名,我想指向我在家里的 raspberry pi 服务器上运行的网站。我的公共(public) IP 地址是动态的,当 IP 更新时,我无法弄清楚如何保持
我有这个经典的 DDD 问题;我有一个做一些事情的域服务“DetectPriority”。 PM 要求我创建 2 个不同的服务;一个 INTERNAL(包含完整的业务规则并涉及许多其他领域模型)和另一
An interesting thread我刚才输入这个问题时就出现了。但我认为它没有回答我的问题。 我一直在使用 .NET MVC3 进行大量工作,因此需要一个贫乏的模型。 View 模型和编辑模型
我正在通过docker-compose运行最新版本的Artifactory OSS(如here和here所述)。我的docker-compose文件看起来像这样: version: '2' servi
我正在阅读 MDC entry for nsICookieManager2.add它讨论了域和非域 cookie。这两种类型的 cookie 有什么区别? 最佳答案 来自 RFC2109: Host
这是我的问题:http://regexr.com?2temn 我相信对于你们中的一些正则表达式大师来说这很简单。 干杯! 最佳答案 这也有效: (?<=\.|)\w+\.\w+$ 仅使用 PHP 进行
这应该很简单,但我无法理解。有许多好的和坏的正则表达式方法来匹配 URL,有或没有协议(protocol),有或没有 www。我遇到的问题是这个(在 javascript 中):如果我使用正则表达式来
我有一个网站 http://mywebsite.tld ,我想将 www.mywebsite.tld 重定向到 http://mywesite.tld (所以 www=>非 www) (防止重复内容)
TL;DR 我应该从 www.domain.tld 重定向到 domain.tld 还是相反? 我正在运行一个处理多个域的 CMS。到目前为止,CMS 负责将 www.domain.tld 重定向到
我目前有以下代码: string user = @"DOMAIN\USER"; string[] parts = user.Split(new string[] { "\\" }, StringSpl
使用 Go 和 AWS-SDK 我正在尝试查询 AWS 控制台中 Route53 -> Hosted Zones 下列出的 route53 CNAME 和 A 记录。我可以使用以下代码进行查询,但它需
我是一名优秀的程序员,十分优秀!