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

Eng*_*uad 3 java weblogic classloader java-ee ejb-3.0

我有一个MDB EJB,里面有静态块.我在第一次运行应用程序时(即部署时)使用静态块来初始化一些组件.MDB EJB部署在除Admin_Server之外的单独服务器(My_Server)上.

问题是静态块被调用两次!

  • 第一次:刚刚部署MDB EJB(tageted到My_Server)之后.
  • 第二次:在JMS队列(与MDB关联)之后收到消息.

另外,我打印了服务器名称和pid,它们在两者中都是相同的:

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

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

  • 关闭My_Server后,我收到通知.
  • 一旦我关闭了Admin_Server,我也收到了通知.

我该如何解决这个问题?


一些额外的信息:

Weblogic version: 10.3.0
EJB version: 3.0
Run Code Online (Sandbox Code Playgroud)

Mir*_*ari 7

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

EJB 3.1添加了@Singleton和@Startup等注释,但遗憾的是在3.0中,您仍然坚持使用基于提供程序的解决方案来实现这些保证.

管理员与常规服务器行为非常常见,因为WebLogic通常会部署到这两者.有关更多信息,请参阅此页面.

对于Weblogic shutdown hooks,请查看此文档页面.