gpt4 book ai didi

java - 静态 block 被调用两次,也许是多个类加载器?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:34 24 4
gpt4 key购买 nike

我有一个 MDB EJB,里面有静态 block 。我使用静态 block 在应用程序第一次运行时(即部署时)只初始化一些组件一次。 MDB EJB 部署在不同于 Admin_Server 的单独服务器 (My_Server) 上。

问题是静态 block 被调用了两次!

  • 第一次:在部署 MDB EJB 之后(标记到 My_Server)。
  • 第二次:在 JMS 队列(与 MDB 相关联)收到消息后。

此外,我还打印了服务器名称和 pid,两者都相同:

System.out.println("server name: " + System.getProperty("weblogic.Name"));
System.out.println("pid: " + ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);

我还注意到一些奇怪的行为。基本上,我附加了一个 Shutdown Hook(从静态 block 内部)以在应用程序关闭时向我发送电子邮件。

  • 我在关闭 My_Server 后收到通知。
  • 关闭 Admin_Server 后我也会收到通知。

我该如何解决这个问题?


一些额外的信息:

Weblogic version: 10.3.0
EJB version: 3.0

最佳答案

只有当您有多个类加载器时才会发生这种情况。我不会在 EJB 中使用静态初始化程序,而是依赖 EJB 生命周期 Hook 或将初始化程序导出到非托管类中。

EJB 3.1 添加了 @Singleton 和 @Startup 等注释,但不幸的是,在 3.0 中,您只能使用基于提供者的解决方案来实现这些保证。

管理员与常规服务器行为非常普遍,因为 WebLogic 通常同时部署到这两种行为。参见 this page获取更多信息。

对于 Weblogic 关闭 Hook 检查 this documentation page .

关于java - 静态 block 被调用两次,也许是多个类加载器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14433978/

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