GitHubの例を見た後に更新します。
Guiceの使い方は問題ありません。MessageInboundの特定の使用法は1つしかないため、AbstractGuiceWebSocketServletのような砂糖は不要です。プロバイダーchatLogHdlrを実行してから、手動で構築しても問題ありません。ただし、AOPサポートは失われます。それが必要な場合は、アシストインジェクトを実行することをお勧めします。しかし、今のところこれは問題ありません。
ちなみに、セッターインジェクションの代わりにコンストラクションインジェクションを使用してください。
何が問題なのかすぐにわかりました。これはGuiceではなく、Guice-Persistの使用方法です。私はGPをあまり使用しませんでしたが、それでも由緒あるWarp-persistを使用しています。しかし、コードでGuice-persistを使用する方法に2つの問題があります。
Guice-Persistを開始するには、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(Session-per-transaction)のすぐ近くでtxnを使用するのが方法です。
オフトピック:
何人のユーザーをサポートするつもりですか?これが筋金入りのチャットサーバーになる場合は、代わりにNettyを使用しますが、多少複雑です。グーグルはこれを見つけました:
http://comoyo.github.com/blog/2012/07/30/integrating-websockets-in-netty/
元の答え:
それで、これはスタイルについての質問ですか?
WebSockets!=サーブレット。少し違うスタイルが必要な場合でも問題ありません。バニラサーブレットを扱っていないことを思い出してもらいたいと思います。
いくつかの観察:
WebSocketServletは特別なものではありません。Guice-Servletで簡単に使用できます。例えば:
@Singleton
public class FooGuiceWebSocketServlet extends WebSocketServlet {...}
そしてそれを次のように参照します
serve("/foo").with(FooGuiceWebSocketServlet.class);
さて、あなたが説明したように、すべてTomcatによって処理されるように特別なMessageInbound 。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();
}
必要に応じて、ここからより高度な抽象化やスコーピングに進むことができます。#getWsOutbound()はテストの妨げになるため、特に好きではありません。
満足するまでスタイルを改善し続けてください。さらにヘルプが必要な場合は言ってください(答えを変更します)。