如何向骆驼的嵌入式码头添加HttpSessionListener

时间:2019-03-29 08:30:40

标签: apache-camel embedded-jetty

要在使用Rest的同时将HttpSessionListener设置为Camel的嵌入式Jetty,我可以尝试以下方法:

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配置进行Jetty组件路由并添加handlers选项。与调试器深入讨论后,我觉得我的处理程序添加到Jetty端点调用的方式太晚了,因为会话已经开始,所以它没有任何作用。

如何将自己的HttpSessionListener添加到Camel的嵌入式Jetty服务器中?尽管该组件被称为“ jetty”,但该API似乎并未向我提供对Jetty的Server和其他对象的访问权限,并且看起来不那么抽象Jetty的内部结构看起来很正常。

主要目标是在会话destroy事件中运行某些内容。

更新-试图对其进行破解并在处理器中添加会话监听器-IllegalStateException

2 个答案:

答案 0 :(得分:0)

可以将标准的Servlet或Filter添加到骆驼实例吗?

如果是这样,请将init()添加到HttpSessionListener中,将ServletContext添加到init()中,并且该servlet /过滤器的实现为空操作。

state期间添加侦听器非常重要,因为这是唯一允许它完成的步骤(在WebApp启动/初始化期间)。

答案 1 :(得分:0)

未来的骆驼码头用户。

如果您要使用自己的HttpSessionListener,或者更广泛地说是Jetty的SessionHandler,则永远不要设置sessionSupport=true。它将用{strong>不执行的空白操作代替您的SessionHandler

然后像平常一样将处理程序添加到端点uri:?handlers=yourSessionHandlerBeanRef

在上面的示例中,只需将以下行注释掉:

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

希望我为您节省了一两天。