Как использовать JerseyClient в ресурсе JAX-RS в поточно-ориентированном режиме - PullRequest
1 голос
/ 03 октября 2019

в следующем UserResource классе:

public class UserResource {
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/users")
    public void createUser() {
        //JerseyClient is needed to send a REST request to another RESTful service
    }
}

JerseyClient необходимо для отправки запроса другому API RESTful, как указано в комментарии.

Как и в то же времяэто может быть несколько потоков, вызывающих этот UserResource, JerseyClient, вероятно, должен быть инициализирован в каждом вызове для каждого потока, чтобы быть потокобезопасным. Однако упомянутые JAX-RS Client

Клиенты - это тяжелые объекты, которые управляют инфраструктурой связи на стороне клиента. Инициализация, а также удаление экземпляра клиента могут быть довольно дорогой операцией. Поэтому рекомендуется создавать в приложении только небольшое количество экземпляров Client. Клиентские экземпляры должны быть надлежащим образом закрыты перед удалением, чтобы избежать утечки ресурсов.

Исходя из документации, вероятно дорого инициализировать JerseyClient внутри тела createUserи, таким образом, вызвать проблему с производительностью.

Вопрос: Как эффективно оптимизировать количество JerseyClient экземпляров в поточно-ориентированном режиме?

1 Ответ

0 голосов
/ 03 октября 2019

Достаточно, если вы создадите экземпляр Client как поле класса, поскольку класс Client является поточно-ориентированным.

В документации о Джерси написано:

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

...