【发布时间】:2012-02-09 17:59:17
【问题描述】:
我有一个带有资源类的 Jersey REST 服务,该资源类调用服务类上的方法。在测试期间,我们注意到资源方法的“输入”日志语句和服务的时间之间存在延迟。尽管通常在 2 分钟范围内,但此延迟可能长达 5 分钟。有时,延迟是最小的(毫秒)。
这是我们的类的样子:
资源
@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 方法。但是,随后对 Web 服务的调用大约需要 1 到 5 分钟。资源中实际上没有发生任何事情会阻止处理/调用服务。
Web 服务部署在 Glassfish 3.1.1 中的 Linux 服务器上。
有没有人见过这样的事情?有什么建议吗?
编辑
再多一点信息...
部署 Web 服务战争的域中部署了 4 个应用程序:
- 出现问题的 Jersey Web 服务大战
- 使用 Jersey 网络服务客户端的耳朵
- servlet 战争,用于测试 ear 使用的连接等(包括 Jersey 网络服务)
- 另一个不使用 web 服务的 servlet 战争
当我们禁用 ear 和“其他”war 文件(仅启用 Jersey 战争和测试 servlet)时,延迟问题就消失了。我们重新启用了战争和耳朵,事情仍然继续及时响应。当我们重新部署 Jersey webservice war(进行一些日志更改)时,延迟问题立即又回来了。
【问题讨论】:
-
你能在这两个事件之间得到一个线程转储吗?
-
线程转储确实是要走的路。
-
嗨,我正在做一个线程转储和分析(对我来说是新的,所以第一次可能需要一段时间)。我还在问题中添加了更多信息。
-
我能够通过该线程转储找到行为不端的代码。 @pingw33n,如果您对问题添加答案,我很乐意接受。