Инициализация клиента трикотажа в конструкторе управляемого bean-компонента spring

Я использую трикотажный клиент для отправки POST-запросов стороннему веб-сервису. Поскольку создание трикотажных клиентов обходится дорого, я делаю это внутри конструктора класса клиента службы, которым управляет Spring. Я думаю, что когда мой сервер запустится, Spring создаст мой сервисный клиентский компонент, который, в свою очередь, вызовет вызов конструктора, и поэтому мой клиент из трикотажа будет создан один раз. Пока сервер работает, этот клиент-трикотаж будет отвечать за отправку запросов, и дальнейшая инициализация клиента не требуется. Тем не менее, я буду создавать новый веб-ресурс для каждого звонка, так как создание трикотажных веб-ресурсов намного дешевле.

package com.mypackage;
//Bunch of imports

class MyWebserviceClient {

    //jersey client member variable
    private Client jClient;

    public MyWebserviceClient(){

        //Create jersey client
        jClient = Client.create();

        //Other stuff
    }

    public void sendRequest(){

        WebResource wr = jClient.resource(someUrl);
        //Use the webresource to make webservice call
    }
}

MyWebserviceClient управляется Spring как таковой в XML-файле конфигурации Spring:

<bean id="myClient" class="com.mypackage,MyWebserviceClient"></bean>

Затем bean-компонент myClient будет внедрен в соответствующее место, где необходимо выполнить вызов службы.

Мои вопросы

1) Если мое приложение обрабатывает тысячи запросов в час, достаточно ли оно эффективно, чтобы обрабатывать все запросы только с одним клиентом из трикотажа.

2) Нужен ли мне какой-то трикотажный клиентский пул, чтобы более эффективно обрабатывать большое количество запросов. Если да, то есть ли способ сделать это?

3) Я хотел бы знать в целом, как множественные запросы, поступающие от конечных пользователей, обрабатываются на стороне сервера. Каждый запрос представляет собой отдельный поток выполнения на сервере, и все они имеют доступ к одному и тому же объекту клиента трикотажа. Если клиентский объект трикотажа занят одним таким запросом, будут ли другие запросы от разных конечных пользователей ждать, пока не будет получен ответ на текущий запрос?

4) Любая лучшая альтернатива той, которую я использую.


person kau    schedule 06.03.2014    source источник


Ответы (1)


Ваше мышление находится в правильном направлении.

1 - Да, и рекомендуется повторно использовать экземпляр клиента:

из https://jersey.java.net/documentation/1.18/client-api.html#d4e623:

Экземпляры клиентов — это дорогостоящие ресурсы. Рекомендуется повторно использовать сконфигурированный экземпляр для создания веб-ресурсов. Создание веб-ресурсов, построение запросов и получение ответов гарантированно будут потокобезопасными. Таким образом, экземпляр Client и экземпляры WebResource могут совместно использоваться несколькими потоками.

2 - Не нужно, клиент сам может обрабатывать запросы. В случае асинхронных запросов он внутренне использует настраиваемый пул потоков.

3. Клиент Джерси является потокобезопасным, поэтому потоки не будут блокировать друг друга.

4. Вы также можете рассмотреть возможность предоставления клиента в качестве зависимости от MyWebserviceClient и, возможно, повторного использования одного и того же клиента между несколькими классами.

person Kyle Winter    schedule 09.03.2014