gpt4 book ai didi

java - Jersey - 来自资源的大量延迟调用服务方法

转载 作者:行者123 更新时间:2023-12-01 05:29:37 26 4
gpt4 key购买 nike

我有一个 Jersey REST 服务,其中的资源类调用服务类上的方法。在测试过程中,我们注意到资源方法的“输入”日志语句与服务的时间之间存在延迟。此延迟可能长达 5 分钟,但通常在 2 分钟范围内。有时,延迟会很短(毫秒)。

这是我们的类(class)的样子:

资源

@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服务 war 的域中部署了4个应用程序:

  • 泽西网络服务 war 存在问题
  • 使用 Jersey Web 服务客户端的耳朵
  • 用于测试 Ear 使用的连接等的 Servlet War(包括 Jersey Web 服务)
  • 另一场不使用 Web 服务的 servlet war

当我们禁用 Ear 和“其他”war 文件(仅启用 Jersey war 和测试 servlet)时,延迟问题就消失了。我们重新启用了 war 和耳朵,事情仍然继续及时使用react。当我们重新部署 Jersey Webservice war(进行了一些日志记录更改)时,延迟问题立即又回来了。

最佳答案

Thread dump可用于找出正在运行的代码(包括堆栈跟踪)以及 Java 进程内的当前时刻。 jps工具将帮助获取所需 JVM 实例的 PID。

关于java - Jersey - 来自资源的大量延迟调用服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9185781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com