单例EJB在JVM中只有一个实例,因此是线程安全的。
而且因为单例对象只有一个实例,一般用于缓存一些全局数据。
1. 创建Singleton EJB

2. 在应用启动时即初始化该Singleton EJB
在Class上增加标注:@javax.ejb.Startup。
3. 定时调用某个方法
在方法上增加标注: @Schedule(hour = "*", minute = "*", second = "*/30")。
表明每30秒会调用一次方法preFetchCustomers。
最终完成的Singleton EJB内容如下:
4. 在TestServlet中,用CacheSingletonBean代替CustomerSessionBean
需要注意的是,CacheSingletonBean的方法getCustomers可能返回为null,如果preFetchCustomers方法一次都没有调用的话。
这是有可能的,因为应用启动后30秒才会第一次调用preFetchCustomers方法。
而且因为单例对象只有一个实例,一般用于缓存一些全局数据。
1. 创建Singleton EJB
2. 在应用启动时即初始化该Singleton EJB
在Class上增加标注:@javax.ejb.Startup。
3. 定时调用某个方法
在方法上增加标注: @Schedule(hour = "*", minute = "*", second = "*/30")。
表明每30秒会调用一次方法preFetchCustomers。
最终完成的Singleton EJB内容如下:
@Singleton
@LocalBean
@javax.ejb.Startup
public class CacheSingletonBean {
@EJB
CustomerSessionBean bean;
List customers;
public List getCustomers() {
return customers;
}
@Schedule(hour = "*", minute = "*", second = "*/30")
public void preFetchCustomers() {
System.out.println(new Date() + " %%%%%%%%%%%%%%%%%%%%%%%%%%% Fetching customers %%%%%%%%%%%%%%%%%%%%%%%%%%%");
customers = bean.getCustomers();
}
}
4. 在TestServlet中,用CacheSingletonBean代替CustomerSessionBean
需要注意的是,CacheSingletonBean的方法getCustomers可能返回为null,如果preFetchCustomers方法一次都没有调用的话。
这是有可能的,因为应用启动后30秒才会第一次调用preFetchCustomers方法。
没有评论:
发表评论