2012-11-28 28 views
0

我們有一個servlet如下:在Servlet生成的線程中使用EJB - 不好的做法?

public class CacheRefresher extends HttpServlet { 
    private static final long START_TIMEOUT = 120*1000; 

    public void init(ServletConfig servletConfig) throws ServletException { 
     super.init(servletConfig); 
     new Thread(new Worker()).start(); 

    } 

    private class Worker implements Runnable { 
     public Worker() { } 
     public void run() { 
      try { 
       Thread.sleep(START_TIMEOUT); 
      } catch (InterruptedException e) { 
      } 

      while(true) { 
       MyService myService = null; 
       try { 
        myService = ServiceFactory.getInstance().getMyService(); 
        myService.doSomething(); 
       } catch (Exception ex){ 
        ex.printStackTrace(); 
       }finally { 
        ServiceFactory.getInstance().releaseMyService(myService); 
       } 

       try { 
        Thread.sleep(timeout); 
       } catch (InterruptedException e) { 
       } 
      } 
     } 

    } 
} 

其目的是定期調用的服務。這個Servlet只有一個實例,它將在服務器啓動時創建。 MyService是一個EJB。

這有多糟糕?我知道從EJB產生線程是不允許的,但其他方式呢?服務器關閉會發生什麼?

回答

0

Conceptualy我沒有看到從多個線程調用ejb方法的問題(即使你自己創建了線程)。 ejb-container將成爲另一個客戶。

從你的例子看來,你的servlet的靈魂目的是啓動一堆定時器。如果您可以使用ejb 3.1,則可以使用java ee標準方法來執行此操作。

首先一個Singleton EJB,它啓動在啓動時

import javax.annotation.PostConstruct; 
import javax.ejb.EJB; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 


@Singleton 
@Startup 
public class SingletonBean { 

    @EJB 
    LabBean labBean; 

    @PostConstruct 
    public void init() { 
     long interval = 4000; 
     long initialExpiration = 2000; 
     labBean.startTimer(initialExpiration, interval, "MyTimer"); 
    } 
} 

計時器然後處理該超時SLSB:

import javax.annotation.Resource; 
import javax.ejb.Stateless; 
import javax.ejb.Timeout; 
import javax.ejb.Timer; 
import javax.ejb.TimerConfig; 
import javax.ejb.TimerService; 


@Stateless 
public class LabBean { 
    @Resource 
    protected TimerService timerService; 

    @Timeout 
    public void timeoutHandler(Timer timer) { 
     String name = timer.getInfo().toString(); 
     System.out.println("Timer name=" + name); 
    } 

    public void stopTimer(String name) { 
     for (Object o : this.timerService.getTimers()) 
      if (((Timer) o).getInfo().toString().startsWith(name)){ 
       ((Timer)o).cancel(); 
      }  
    } 

    public void startTimer(long initialExpiration, long interval, String name){ 
     stopTimer(name);   
     TimerConfig config = new TimerConfig(); 
     config.setInfo(name); 
     config.setPersistent(false); 
     timerService.createIntervalTimer(initialExpiration, interval, config); 
    } 
} 
+0

我知道的EJB 3.1的定時器,在其他項目中使用它們,儘管如此,這是令人遺憾的ejb 3.1。謝謝你的答案。 –

相關問題