Java 使用InitialContext Lookup()和@Inject of Singleton进行查找
我有一个@singletonbean,用于存储要与其他bean/线程共享的状态。要共享的状态在HashMap中维护。其他需要此单例服务的bean只需执行@Inject并调用方法 最近,我们不得不引入Quartz调度器,因为我们有一些异步工作要做。在一个quartz作业中,我使用IntialContext lookup()查找单例,并使用单例提供的方法。一旦执行此作业,其他使用@Inject(对于单例)的bean将不再获得HashMap中维护的信息Java 使用InitialContext Lookup()和@Inject of Singleton进行查找,java,jakarta-ee,design-patterns,dependency-injection,singleton,Java,Jakarta Ee,Design Patterns,Dependency Injection,Singleton,我有一个@singletonbean,用于存储要与其他bean/线程共享的状态。要共享的状态在HashMap中维护。其他需要此单例服务的bean只需执行@Inject并调用方法 最近,我们不得不引入Quartz调度器,因为我们有一些异步工作要做。在一个quartz作业中,我使用IntialContext lookup()查找单例,并使用单例提供的方法。一旦执行此作业,其他使用@Inject(对于单例)的bean将不再获得HashMap中维护的信息 @Singleton(mappedName =
@Singleton(mappedName = "ClientSessionMgr")
public class ClientSessionMgr {
private final Map<String, ClientSession> clientSessions = new HashMap<String, ClientSession>();
/* Methods that manage the clientSessions data */
}
Quartz作业,它查找单例,然后使用单例提供的方法
public class ClientSyncProbe implements Job {
private ClientSessionMgr csm;
@Override
public void execute(JobExecutionContext jec) throws JobExecutionException {
InitialContent ic = new InitialContext();
csm = (ClientSessionMgr) ic.lookup("java:app/SVWeb/ClientSessionMgr");
/* Some tasks, and finally */
ic.close()
}
}
我猜我缺少了一个模式原则。有什么帮助吗?为什么选择Quartz而不是
@Schedule
?如何使用@Stateless bean?在何处/如何注入它们?JNDI查找在从应用服务器不控制的随机线程(如Quartz使用的线程)执行时,可能不会以您认为应该的方式进行。使用@Schedule
而不是injection让我改用@Schedule
public class ClientSyncProbe implements Job {
private ClientSessionMgr csm;
@Override
public void execute(JobExecutionContext jec) throws JobExecutionException {
InitialContent ic = new InitialContext();
csm = (ClientSessionMgr) ic.lookup("java:app/SVWeb/ClientSessionMgr");
/* Some tasks, and finally */
ic.close()
}
}