2012-02-07 27 views
1

我有一個澤西島REST服務,帶有調用服務類上的方法的資源類。在測試期間,我們注意到資源方法的「輸入」日誌語句和服務之間的延遲。儘管通常在2分鐘的範圍內,但延遲時間可能高達5分鐘。偶爾,延遲很小(毫秒)。Jersey - 來自資源的大規模延遲呼叫服務方法

下面是我們班的樣子:

資源

@Stateless 
@Path("/provision") 
public class ProvisionResource 
{ 
    private final Logger logger = LoggerFactory.getLogger(ProvisionResource.class); 

    @EJB 
    private ProvisionService provisionService; 

    @GET 
    @Produces(MediaType.APPLICATION_XML) 
    @Path("/subscriber") 
    public SubscriberAccount querySubscriberAccount(
      @QueryParam("accountNum") String accountNum) 
    { 
     logger.debug("Entering querySubscriberAccount()"); 

     final SubscriberAccount account; 

     try 
     { 
      account = provisionService.querySubscriber(accountNum);  
     } 
     catch (IllegalArgumentException ex) 
     { 
      logger.error("Illegal argument while executing query for subscriber account", 
        ex); 

      throw new WebApplicationException(Response.Status.BAD_REQUEST); 
     } 
     catch (Exception ex) 
     { 
      logger.error("Unexpected exception while executing query for subscriber account", 
        ex); 

      throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR); 
     } 

     logger.debug("Exiting querySubscriberAccount()"); 

     return account; 
    }  
} 

服務:

@Singleton 
public class ProvisionService 
{ 
    private final Logger logger = LoggerFactory.getLogger(ProvisionService.class); 

    public SubscriberAccount querySubscriber(final String accountNum) throws IllegalArgumentException, Exception 
    { 
     logger.debug("Entering querySubscriber()"); 

     if (null == accountNum) 
     { 
      throw new IllegalArgumentException("The argument {accountNum} must not be NULL"); 
     } 

     SubscriberAccount subscriberAccount = null; 

     try 
     { 
      // do stuff to get subscriber account 
     } 
     catch (Exception ex) 
     { 
      throw new Exception("Caught exception querying {accountNum}=[" 
        + accountNum + "]", ex); 
     } 
     finally 
     { 
      logger.debug("Exiting querySubscriber()"); 
     } 

     return subscriberAccount; 
    } 

這是我們從日誌顯示,當我們進入方法的時間戳一些樣品。

2012 Feb 07 15:31:06,303 MST [http-thread-pool-80(1)] DEBUG my.package.ProvisionResource - Entering querySubscriberAccount() 
2012 Feb 07 15:31:06,304 MST [http-thread-pool-80(1)] DEBUG my.package.ProvisionService - Entering querySubscriber() 

2012 Feb 07 15:35:06,359 MST [http-thread-pool-80(1)] DEBUG my.package.ProvisionResource - Entering querySubscriberAccount() 
2012 Feb 07 15:40:33,395 MST [http-thread-pool-80(1)] DEBUG my.package.ProvisionService - Entering querySubscriber() 

2012 Feb 07 15:34:06,345 MST [http-thread-pool-80(2)] DEBUG my.package.ProvisionResource - Entering querySubscriberAccount() 
2012 Feb 07 15:37:24,372 MST [http-thread-pool-80(2)] DEBUG my.package.ProvisionService - Entering querySubscriber() 

2012 Feb 07 15:33:06,332 MST [http-thread-pool-80(4)] DEBUG my.package.ProvisionResource - Entering querySubscriberAccount() 
2012 Feb 07 15:34:15,349 MST [http-thread-pool-80(4)] DEBUG my.package.ProvisionService - Entering querySubscriber() 

2012 Feb 07 15:37:24,371 MST [http-thread-pool-80(4)] DEBUG my.package.ProvisionResource - Entering querySubscriberAccount() 
2012 Feb 07 15:40:36,004 MST [http-thread-pool-80(4)] DEBUG my.package.ProvisionService - Entering querySubscriber() 

2012 Feb 07 15:32:06,317 MST [http-thread-pool-80(5)] DEBUG my.package.ProvisionResource - Entering querySubscriberAccount() 
2012 Feb 07 15:34:15,325 MST [http-thread-pool-80(5)] DEBUG my.package.ProvisionService - Entering querySubscriber() 

2012 Feb 07 15:36:06,373 MST [http-thread-pool-80(5)] DEBUG my.package.ProvisionResource - Entering querySubscriberAccount() 
2012 Feb 07 15:40:34,956 MST [http-thread-pool-80(5)] DEBUG my.package.ProvisionService - Entering querySubscriber() 

正如你所看到的,第一個進入該資源的querySubscriberAccount後立即調用該服務的querySubscriber方法。但是,後續的網絡服務調用需要大約1到5分鐘。資源中確實沒有什麼會阻止處理/調用服務。

webservice部署在Glassfish 3.1.1的Linux服務器上。

有沒有人見過這樣的事情?有什麼建議嗎?

編輯

只是一點點更多信息...

到其中的web服務戰部署已經部署在其4個應用程序域:

  • 澤西web服務戰這是有問題
  • 一個使用客戶端到澤西web服務的耳朵
  • 用於測試連接等的耳朵(包括web服務新澤西州)中使用
  • 不使用web服務另一個servlet戰爭一個servlet戰爭

當我們停用了耳朵和「其他」 war文件(只有Jersey戰爭和測試servlet被啓用),延遲問題消失。我們重新啓用了戰爭和耳朵,事情仍然繼續及時作出反應。當我們重新部署Jersey webservice war(做了一些日誌記錄更改)後,延遲問題馬上又回來了。

+1

你能在這兩個事件之間獲得線程轉儲嗎? – pingw33n 2012-02-07 23:47:26

+0

線程轉儲的確是要走的路。 – 2012-02-08 05:08:35

+0

嗨,我正在做一個線程轉儲和分析(新對我來說,這可能需要一段時間)。我還爲這個問題添加了更多信息。 – sdoca 2012-02-08 17:06:46

回答

0

Thread dump可用於找出正在運行的代碼(包括堆棧跟蹤)和Java進程中的當前時刻。 jps工具將有助於獲取所需JVM實例的PID。