要在使用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
答案 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);
希望我为您节省了一两天。