Как добавить HttpSessionListener во встроенный Jetl Jetl - PullRequest
0 голосов
/ 29 марта 2019

Чтобы установить HttpSessionListener для встроенного Jetl Camel при использовании Rest, я пытаюсь это сделать:

SessionHandler sess = new SessionHandler();
sess.addEventListener(new HttpSessionListener() {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        // some code
        se.getSession().setAttribute("WasHere", true);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        // some cleanup code that really can't be palced anywhere else
    }
});
String sessionHandlerString = "jettySessionHandler";
_integration.getRegistry().put(sessionHandlerString, sess); // this works

String port = _properties.getProperty("port");

RestConfiguration restConfiguration = new RestConfiguration();
restConfiguration.setComponent("jetty");
HashMap<String, Object> options = new HashMap<>();
options.put("sessionSupport", true);
options.put("handlers", sessionHandlerString);
restConfiguration.setEndpointProperties(options);
restConfiguration.setHost("localhost");
restConfiguration.setPort(Integer.parseInt(port));
restConfiguration.setBindingMode(RestConfiguration.RestBindingMode.auto);
_integration.getContext().setRestConfiguration(restConfiguration);

// getting an object
JettyHttpComponent9 jettyComponent = _integration.getContext().getComponent("jetty", JettyHttpComponent9.class);

RouteBuilder rb = new RouteBuilder(_integration.getContext()) {
    @Override
    public void configure() throws Exception {
        rest("/test/path")
            .get().route().process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    HttpMessage msg = exchange.getIn(HttpMessage.class);
                    Object ret = msg.getRequest().getSession().getAttribute("WasHere");
                    msg.setBody("Been there or not? - " + ret);
                }
            });
    }
};

Это возвращает «Был или нет? - ноль», поэтому слушатель сеанса не работал.

Rest config создает маршрут для компонента Jetty и добавляет опцию handlers.Погружаясь с отладчиком, у меня сложилось впечатление, что мой обработчик был добавлен к вызову конечной точки Jetty слишком поздно, когда сеанс уже был запущен, поэтому он не имел никакого эффекта.

Как добавитьмой собственный HttpSessionListener для встроенного сервера Jetty в Camel?Похоже, что API не предоставляет мне доступ к Server Jetty и другим объектам, несмотря на то, что компонент называется «Jetty», и это выглядит нормально, если не быть настолько абстрактным по отношению к внутренностям Jetty.

Основная цельзапустить что-то в событии уничтожения сеанса.

update - попытался взломать его и добавить прослушиватель сеанса в процессор - IllegalStateException

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

будущий пользователь Camel Jetty.

Если вы хотите использовать свой собственный HttpSessionListener или, в более широком смысле, Jetty's SessionHandler, просто никогда не устанавливайте sessionSupport=true. Он заменяет ваш SessionHandler на пустой, который ничего не делает .

Затем добавьте ваш обработчик к конечной точке uri, как обычно: ?handlers=yourSessionHandlerBeanRef.

В приведенном выше примере просто закомментируйте эту строку:

//options.put("sessionSupport", true);

Надеюсь, я спас тебя день или два.

0 голосов
/ 01 апреля 2019

Можете ли вы добавить стандартный сервлет или фильтр к вашему экземпляру верблюда?

Если это так, заставить init() добавить HttpSessionListener к ServletContext, и реализация указанного сервлета / фильтра будет запрещена.

Важно добавить слушателяэто в течение init(), поскольку это единственный раз, когда это разрешено делать (во время запуска / инициализации WebApp).

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