看看GitHub示例后的更新示例:
如何使用Guice就好了。由于MessageInbound只有一个特定的用法,所以不需要像AbstractGuiceWebSocketServlet那样的糖。供应商chatLogHdlr,然后做手动施工是好的。但是你失去了AOP支持。如果需要,您可能需要进行辅助注射。但现在这没问题。
在附注中,使用施工注入而不是设置注入。
我马上看到了什么问题。 这不是Guice,而是你如何使用Guice-Persist。我没有使用GP很多,仍然使用历史悠久的Warp-persist。但是,我看到2个问题您如何使用吉斯 - 坚持代码:
你需要注入PersistService开始吉斯 - 坚持。这在WIKI例如
public class PocWebApp extends GuiceServletContextListener {
@Inject
PersistService ps;
@Override
protected Injector getInjector() {
Injector injector = Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
install(new JpaPersistModule("DesktopPU"));
serve("/socket/main/").with(MainSocket.class);
}
});
injector.injectMembers(this);
return injector;
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
super.contextInitialized(servletContextEvent);
ps.start();
}
}
的PersistFilter是无用的,因为只有第一次的WebSocket将走线槽过滤器,但所有的后续通信不会走线槽的过滤器。在@Transactional(每次交易会话)周围使用txn是一条路。
题外话:
多少用户,你打算支持?如果这将是一个硬核聊天服务器,我会使用Netty来代替它,但它会涉及更多。谷歌搜索发现这一点:
http://comoyo.github.com/blog/2012/07/30/integrating-websockets-in-netty/
原来的答复:
因此,这是一个关于风格的问题?
WebSockets!= Servlets。如果他们需要稍微不同的风格,没有什么不对。我甚至更喜欢提醒我没有处理香草servlets。
一些观察:
WebSocketServlet没有什么特别的。你可以很容易地将它与Guice-Servlet一起使用。例如: -
@Singleton
public class FooGuiceWebSocketServlet extends WebSocketServlet {...}
然后refernce它作为
serve("/foo").with(FooGuiceWebSocketServlet.class);
现在,MessageInbound是特别为全部由Tomcat的处理作为你解释。 MessageInbound是WebSocket的作用域。现在,Guice不知道这个范围,因此离开它可能是有道理的。
对于初学者,我会确保MessageInbound是由Guice创建的。沿着这条路线的东西:
@Singleton
public class ExampleWebSocketServlet extends AbstractGuiceWebSocketServlet {
@Override
public Class<? extends StreamInbound> serveWith() {
return Foo.class;
}
public static class Foo extends MessageInbound {
@Inject GuiceCreatedAndInjected bar;
@Override
protected void onBinaryMessage(ByteBuffer byteBuffer) throws IOException {
// do nothing
}
@Override
protected void onTextMessage(CharBuffer charBuffer) throws IOException {
// this getSwOutbonds() is not very friendly to testing
getWsOutbound().writeTextMessage(bar.echo(charBuffer));
}
}
}
凡
public abstract class AbstractGuiceWebSocketServlet extends WebSocketServlet {
@Inject Injector injector;
@Override
protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request) {
return injector.getInstance(serveWith());
}
public abstract Class<? extends StreamInbound> serveWith();
}
您可以根据需要何去何从更高的抽象和/或scopings。我不特别喜欢#getWsOutbound(),因为它阻碍了测试。
只要继续改进风格,直到你满意。说如果你需要更多的帮助(将修改答案)。
如果我理解你,你重写WebSocketServlet#createWebSocketInbound在哪里创建一个MessageInbound的新实例?如果这是真的,那么简单的让Guice为你创建MessageInbound(如果需要,可以辅助注入)。我看到的唯一问题是与http请求/响应的范围,因为guice过滤器使用线程本地来跟踪。但是这可以得到补偿。我跟着你了吗? –
感谢您的评论,但我不明白这一部分:“那么简单就让Guice为您创建MessageInbound(如果需要,则协助注入)” –