单例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; Listcustomers; 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方法。
没有评论:
发表评论