【问题标题】:Update injected domain object in Java EE 7 CDI Application在 Java EE 7 CDI 应用程序中更新注入的域对象
【发布时间】:2016-02-22 18:36:05
【问题描述】:

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

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

【问题讨论】:

  • 这听起来像是“我不太了解代理是什么”。您在这里所问的问题完全可以通过 CDI 使用代理的事实来解决;是的,它只是工作。您是不是因为您已经尝试过但没有如您预期的那样成功?

标签: java jakarta-ee dependency-injection cdi producer


【解决方案1】:

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

生产者本身与内存数据库有一个连接,以从那里检索域对象并将它们保存在本地变量中以供将来在此请求中使用。

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

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

看看:

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

如果你的应用服务器有能力做到这一点,我不会像你那样痛苦地编写应用程序,我会集中精力编写像 memcached-session 这样的会话复制器-经理。祝你好运!

【讨论】:

  • 我们使用 Hazelcast 作为跨多个服务器的内存数据库,并使用 Oracle Weblogic 12.2.1.0.0 作为应用服务器。我们知道跨集群的会话复制,但它不仅仅是保持会话上下文,例如。配置、跟踪所有报告请求等。
猜你喜欢
  • 1970-01-01
  • 2014-02-17
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 2013-10-26
相关资源
最近更新 更多