gpt4 book ai didi

java - 在 Java EE 7 CDI 应用程序中更新注入(inject)的域对象

转载 作者:行者123 更新时间:2023-11-30 08:44:21 26 4
gpt4 key购买 nike

这可能更像是一个概念性问题,而不是技术性问题,但我希望您能就如何进行提供一些建议。我们正在开发一个大型 Java EE 7 应用程序,该应用程序可以无状态运行并接收来自客户端的请求。每个请求都包含一个 session ID,每个 session 都包含大量特定于 session 的域对象。我们创建了一个 RequestScoped 类,其中包含我们领域对象的所有生产者方法。当请求带有 session ID 时,我们调用生产者的 setter 方法以在生产者 CDI bean 中设置 session ID。现在,如果链上的 RequestScoped 类之一需要域对象之一,它在类的开头有一个 @Inject 定义,以从生产者那里获取域对象。 Producer 本身有一个到内存数据库的连接,以从那里检索域对象并将它们保存在局部变量中以供将来在此请求中使用。

现在的问题是:假设 Bean A 注入(inject)域对象 X 并更改 X 的一些属性。我是否必须在我的生产者中调用“更新”方法并将域对象 X 作为参数传递,或者它是否在语境?在请求范围内注入(inject)后,CDI 容器创建一个代理来访问实际的 bean。该代理是否可以像常规引用一样使用?例如。如果我在注入(inject)的 bean 上调用一个方法,它会更新代理后面的 bean 吗?

最佳答案

我知道这可能会让我失望,但我还是会回答,因为我希望它对你有值(value)。听起来你们已经把马车放在马前面一英里处了。

The Producer itself has a connection to an inmemory DB to retrieve the domain objects from there and keep them in a local variable for future use in this request.

您正在尝试重新发明所谓的复制、分布式 session 。不要这样做。使用@SessionScoped bean 并将业务逻辑保留在您的应用程序中,并让您的基础架构处理应用程序状态。想象一下多年后您正在查看此应用程序,当您的老板想要刷新 UI 而您的客户需要新功能时。您不仅要维护应用程序,还要维护您构建的一团乱七八糟的分布式框架:(

相反,您可以使用分布式内存数据库来保存 session 状态并将其缓存在本地! Apache Tomcat/TomEE 对此有很好的支持(我不确定你使用的是什么应用服务器)

看看:

我们使用第一个取得了巨大的成功。如果 Tomcat 实例遇到它在本地没有的 session ID,它会从数据网格中提取它。处理完请求后,它将 session 更改发布回数据网格。这非常快并且可以很好地缩放。

如果您的应用程序服务器有能力做到这一点,与其以您正在做的痛苦方式编写应用程序,不如集中精力编写像 memcached-session 这样的 session 复制器-经理。祝你好运!

关于java - 在 Java EE 7 CDI 应用程序中更新注入(inject)的域对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33823874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com