我有个单例模式(程序运行时永远存在),里面有一个线程任务间隔的执行任务,在单例初始化时,lookup唯一个无状态EJB实例(本地),然后在线程任务间隔调用此EJB实例接口,也就是说一直使用单例初始化时产生无状态EJB实例的引用(而不是每次线程任务来临时马上lookup临时无状态EJB实例,在调用此EJB实例接口),这样做有没有问题,会不会出现一段时间后无状态EJB实例失效的问题,或者其他服务也调用(lookup)此无状态EJB会和这个一直存在的无状态EJB实例产生冲突?代码:
public class TestImpl {private static TestImpl TestImplInstatnce = null;
private Thread senderThread;
private TestImpl testbean= null;public synchronized static final TestImpl getInstance() {
if (TestImplInstatnce == null) {
TestImplInstatnce = new TestImpl();
} return TestImplInstatnce;
}
protected SmsSendImpl() {
testbean= (TestImpl ) BoClient.getClient("TestBean");//初始化无状态EJB(look up)
init();
this.startup();
}protected void init() {
done = false;
senderThread = new Thread() {
public void run() {
sendMessages(this);
}
};
senderThread.setName("sender ");
senderThread.setDaemon(true);
}public void startup() {
senderThread.start();
}private void sendMessages(Thread thisThread) {
while (!done && (senderThread == thisThread)) {testbean.testDoIt()//调用EJB接口}
}}

解决方案 »

  1.   

    你下次调用时,服务端会再次分配一个新的bean服务你的请求。这也是无状态bean的优势。
      

  2.   

       无状态的EJB实例你用完它就会放到一个对象池里面,当你下次再要用的时候,有可能是原来那个,也有可能是另一个EJB实例,总之容器会自动判断,调一个空闲的EJB实例给你的,所以不会冲突.