Джерси - Метод обслуживания с массовой задержкой вызова из ресурса - PullRequest
1 голос
/ 08 февраля 2012

У меня есть служба Jersey REST с классом ресурсов, который вызывает методы класса обслуживания.Во время тестирования мы заметили задержку между временем оператора журнала «Ввод» метода ресурса и временем службы.Эта задержка может составлять до 5 минут, хотя обычно она составляет 2 минуты.Время от времени задержка минимальна (миллисекунды).

Вот как выглядят наши классы:

Ресурс

@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()

Как вы можете видеть, первый вызвал метод querySubscriber в службе почти сразу после ввода ресурса querySubscriberAccount.Однако последующие вызовы веб-службы занимают ~ 1–5 минут.На самом деле в ресурсе нет ничего, что могло бы задержать обработку / вызов службы.

Веб-служба развернута на сервере Linux в Glassfish 3.1.1.

Кто-нибудь видел что-либо подобное раньше???Любые предложения о том, что происходит?

РЕДАКТИРОВАТЬ

Еще немного информации ...

Домен, в котором развернута война веб-сервисовв нем развернуто 4 приложения:

  • война веб-службы на Джерси, которая имеет проблемы
  • ухо, которое использует клиент для веб-службы Джерси
  • использовалась война сервлетовдля проверки соединений и т. д., используемых ухом (включая веб-службу Джерси)
  • еще одна война сервлетов, которая не использует веб-службу

Когда мы отключили ухо и "другой" файл войны(были включены только война на Джерси и тестовый сервлет), проблема с задержкой исчезла.Мы возобновили войну и слух, и все еще продолжали своевременно реагировать.Когда мы повторно развернули войну с веб-сервисом в Джерси (внесли некоторые изменения в протоколирование), проблема с задержкой сразу же вернулась.

1 Ответ

0 голосов
/ 09 февраля 2012

Дамп потока может использоваться для определения того, какой код (включая трассировки стека) выполняется, и текущий момент внутри процесса Java. Инструмент jps поможет получить PID необходимого экземпляра JVM.

...