2010-02-10 7 views
0

Каждые несколько раз я запускаю свое приложение на сервере разработки, похоже, в тупик. Я не уверен, что это также взаимоблокировки на производственном сервере. Я приостанавливаю потоки и вижу, что один из них застревает в Permissions.implies: 162, который является началом блока synchronized.Google App Engine - Deadlocking?

Что делает мой код: на домашней странице, он посылает 5 запросов Jquery в то же время, на мой InitServlet сервлета, который имеет service метод synchronized. Каждый раз с помощью метода обслуживания инициализируется другой компонент, каждый из которых занимает приблизительно 2 секунды для инициализации. Не имеет значения порядок, в котором потоки достигают метода службы, и это происходит только 5 раз, во время запуска сервера, поэтому я думаю, что должно быть хорошо, чтобы синхронизировать метод службы.

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

РЕДАКТИРОВАТЬ: Определено, где происходит тупик, но до сих пор не знаю, почему. Внутри блокировки для Permissions.implies один поток вызывает Class.getDeclaredConstructors0 и никогда не возвращается из него. Другой поток ожидает получения блокировки в Permissions.implies. Первый поток, зависающий на getDeclaredConstructors0, выполняет инициализацию класса для стандартного класса PersistenceManagerFactory, взятого из документов примера GAE.

ответ

1

Вы не должны использовать запросы для инициализации своего приложения следующим образом: Экземпляры приложения App Engine можно запускать или закрывать в любое время, а App Engine будет порождать несколько одновременных экземпляров для обработки запросов на любом так что разные виртуальные машины могут получать разные поднаборы вызовов инициализации.

+0

Да, это своего рода хак, который я сделал, чтобы получить холодное время запуска моего приложения до 3 секунд вместо 10 секунд. JDO занимает довольно много времени, чтобы инициализировать, ~ 2 секунды для getPersistenceManagerFactory, а для меня около ~ 3 секунд в первом запросе, который я делаю, потому что он создает некоторые метаданные о классах модели или что-то в этом роде. Плюс я использую openid4java, который также имеет значительное время запуска. Так что я делаю до тех пор, пока инициализация не будет завершена. Я просто могу использовать страницы прямо из memcache, если смогу. – Kyle

+0

Если только приложение Engine поддерживает этот запрос функции -http: //code.google.com/p/googleappengine/issues/detail? Id = 2690. Тогда мне не пришлось бы беспокоиться о временах холодного запуска, и мне не пришлось бы тратить кучу времени, оптимизируя мое холодное время начала. Поскольку, как и сейчас, кажется, что даже при хорошем потоке трафика всегда будут загружаться запросы для некоторых пользователей (например, когда запускается второй или третий экземпляр JVM). – Kyle