2014-12-05 44 views
1

我使用Jersey公開一些統計數據作爲REST服務。 我正在使用Weblogic@PostConstruct與Jersey 1.17一起使用,Weblogic

但是,每當我執行一個請求以獲取統計信息 System.out.println(「In PostConstruct」);叫做。

即使我在路徑@Stateless旁註釋,也會發生這種情況。

這種行爲就像StorageService被實例化在每個請求(REQ範圍)

有沒有辦法有初始化調用一次,避免對每個請求創建StorageService?

@Path("/statistics") 
public class StorageService { 

    @Context 
    private ServletContext application; 

    StatisticsStorage statisticsStorage; 

    @PostConstruct 
    public void initialize() { 
     System.out.println("In PostConstruct"); 
     try { 
      statisticsStorage = new StatisticsStorage((String) application.getAttribute(AppProperties.PropKey.STATS_OUTPUT_PATH_PROP.toString())); 
     } catch (Exception sqle) { 
      sqle.printStackTrace(); 
     } 
    } 


    @GET 
    // The Java method will produce content identified by the MIME Media type "text/plain" 
    @Produces({MediaType.APPLICATION_JSON}) 
    public Domain getSnapshot() {} 

感謝

回答

1

默認的「範圍」是每個請求的範圍。我們也可以將該課程註冊爲單身人士。不同的JAX-RS實現可能有不同的實現方式。例如Apache Wink有一個@Scope(ScopeType.SINGLETON)。但唯一便攜的方法是使用javax.ws.rs.core.Application子類。喜歡的東西:在getClasses()返回

@ApplicationPath("/api") 
public class MyApplication extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
    } 
    @Override 
    public Set<Object> getSingletons() { 
     Set<Object> singletons = new HashSet<>(); 
     singletons.add(new StorageService()); 
     return singletons; 
    } 
} 

一切都將是每個請求的資源。並且getSingletons()將返回「應用程序範圍」的資源。 Jersey永遠不會嘗試實例化類,所以我們可以自己處理所有的初始化。

在另一方面,你可能要考慮,如果使這一類單身是你真正想要的。通過這樣做,它將導致資源類爲有狀態,並且您將需要處理任何併發問題。

如果您想在@PostConstruct中做的所有事情都是創建StatisticsStorage,或許更好的選擇是使用注入框架,例如Guice。這是一個good Guice example(s)。或EE的CDI

2

新澤西實例在每次請求的類。請注意,您可以使用@Context註釋的大部分內容都是特定於請求的。你最好的辦法是讓你的StatisticsStorage字段靜態化,並在第一個請求中進行初始化(需要同步)。也許是這樣的:JAX-RS資源類

public StorageService(@Context ServletContext application) { 
    super(servletConfig, request, httpServletRequest, uriInfo, httpHeaders, securityContext); 
    synchronized (this.getClass()) { 
     if (statisticsStorage == null) { 
      try { 
       statisticsStorage = new StatisticsStorage((String) application.getAttribute(AppProperties.PropKey.STATS_OUTPUT_PATH_PROP.toString())); 
      } catch (Exception sqle) { 
       sqle.printStackTrace(); 
      } 
     } 
    } 
} 
static StatisticsStorage statisticsStorage;