Как управлять веб-сервисом с отслеживанием состояния? - PullRequest
3 голосов
/ 28 июня 2011

Я пытаюсь узнать о J2EE и веб-сервисах (в GlassFish 3.1).Этот вопрос является небольшим дополнением к this .

Я выяснил, как использовать Session Beans и Stateless Session Beans.Я на самом деле использую только Web-сервис (@WebService) из-за удобства, так как я бы не хотел анализировать сообщения вручную.Хотя я бы предпочел что-то более легкое, чем SOAP, если это возможно.Однако я столкнулся с проблемой, когда хочу сохранить какое-то состояние (например, с помощью Stateful Session Beans).Я искал этот сайт и несколько других, рекомендующих мне избегать этого, потому что это может привести к трудностям в поиске ошибок и ограничению масштабируемости.

Предположим, у меня есть пользователь, который только что выполнил метод "userLogin", и он успешно,Как я тогда узнаю на сервере, что пользователь уже вошел в систему. Например, после входа в систему пользователь может вызвать «getProfile ()» через SOAP (без каких-либо аргументов), и я верну правильную информацию для этого пользователя.Я знаю, что это невозможно, добавив @WebService к моему Stateful Session Bean, поскольку это допустимо только с @Stateless.

. Я знаю, как сохранить состояние, если я использую HttpSession (с HttpServlet) вместе сс сеансными компонентами без сохранения состояния, но тогда я не могу использовать красиво сгенерированные SOAP-сообщения.

Итак, мой вопрос: как бы я решил эту проблему поддержания состояния пользователя или адаптировал проблему так, чтобы мне не требовалось состояние?

Ответы [ 2 ]

5 голосов
/ 28 июня 2011

WS может быть с состоянием: используйте аннотацию @Stateful и WS-Addressing (см. Мой старый вопрос , например)

Нет ничего преступного в том, чтобы иметь сервер с состоянием. В конце концов, если требуется государственность, зачем ее избегать? Это правда, что без сохранения состояния легче масштабировать и отлаживать, но если вам нужно сохранить состояние (например, в карточке покупок) - сохраните его.

Однако следует рассмотреть возможность очистки экземпляра службы с сохранением состояния после истечения времени ожидания. Используйте экземпляр StatefulWebServiceManager и его метод setTimeout ().

Кроме того, состояние может храниться вне WS (например, базы данных), а идентификатор состояния (сеанса) передается как один из параметров. Работает просто отлично.

Использование HTTP-сессии - довольно простой способ сохранить состояние для службы без сохранения состояния, но я считаю ее устаревшей по сравнению с @Stateful. Смысл в том, что необязательный запрос должен приходить через HTTP; @ Stateful / WS-Addressing работает для любого канала, в то время как HTTP-сеанс требует HTTP-транспорта. Конечно, в реальном мире преобладает HTTP, поэтому этот аргумент довольно пуристический.

0 голосов
/ 24 сентября 2015

Предоставление bean-компонента без состояния в качестве веб-службы:

import javax.ejb.Remote;
import javax.jws.WebService;
import javax.jws.WebMethod; 


@WebService
/**
* This is an Enterprise Java Bean Service Endpoint Interface
*/
public interface HelloServiceInf extends java.rmi.Remote {

    /**
    * @param phrase java.lang.String
    * @return java.lang.String
    * @throws String The exception description.
    */
    @WebMethod
    java.lang.String sayHello(java.lang.String name) throws java.rmi.RemoteException;
}

Реализация веб-службы в качестве bean-компонента без состояния

import java.rmi.RemoteException;
import java.util.Properties;
import javax.ejb.Stateless;

/**
* This is a session bean class
*/
@Stateless(name="HelloServiceEJB")
public class HelloServiceBean implements HelloServiceInf {

    public String sayHello(String name) {
        return("Hello "+name +" from first EJB3.0 Web Service");
    }
}

Необходимо сохранить UserInfo (объект сведений о пользователе и информации профиля) в HttpSessionи если в HttpSession отсутствует UserInfo, вам нужно вызвать компонент (Web-сервис).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...