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

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 24 марта 2009

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

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...
   }
}
3 голосов
/ 24 марта 2009

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

1 голос
/ 24 марта 2009

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

...