Предварительная загрузка классов/библиотек Java при запуске jar?

StackOverflow https://stackoverflow.com/questions/677739

  •  21-08-2019
  •  | 
  •  

Вопрос

Я написал Thrift-сервер на Java, чтобы использовать преимущества определенного пакета/библиотеки Java, но я не программист Java.

Проблема в;Я вижу тайм-аут для первого вызова RPC на сервер.Запросы на подпоследовательность выполняются без каких-либо проблем и затрагивают только клиенты, написанные на определенных (но важных) языках.

В настоящее время я думаю, что время ожидания ответа сервера истекло, потому что при первом вызове он должен загрузить все библиотеки, необходимые для запроса.Некоторые реализации клиента Thrift должны обрабатывать тайм-аут лучше, чем другие, возможно, оставляя запрос открытым немного дольше.

Есть ли способ в Java предварительно загрузить библиотеки, которые я использую, когда я впервые запускаю файл .jar, чтобы не было задержки при первом запросе?

Решение: Я решил эту проблему (и некоторые другие возникшие), увеличив время ожидания от экономичных клиентов.Тем не менее, я также реализовал ответ static/Class.forName, чтобы помочь в работе, и он отлично работает.Спасибо!

Это было полезно?

Решение

Вы можете запустить загрузку до того, как сервер начнет работать.Вы не указали, как вы загружаете сервер, классы и какова среда, но вы можете воспользоваться тем фактом, что статический инициализатор класса запускается при загрузке класса.Итак, если вы используете «основной» метод, ваш класс может выглядеть примерно так:

public class Foo {

   static {
     //this will be run when the class is loaded
     try { Class.forName("fully.qualified.class.name.that.i.want.to.Load"); }
     catch ...
   }

   public static void main (string args[])
   {
    //run my server...
   }
}

Другие советы

Вы можете попробовать написать простой клиент внутри самого Java-сервера.Этот клиент ничего не делает, кроме как вызывает какой-то метод на сервере при запуске, вызывая загрузку классов.После того, как этот маленький клиент получает результат (или обратный вызов), он переводит сервер в состояние «доступно для внешнего мира».

Я предлагаю имитировать соединение непосредственно перед открытием сервера.Это гарантирует, что (большая часть) соответствующей ленивой инициализации будет выполнена.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top