8

完全な新しい JSR-356 WebSockets サポートなしで Spring 3.2.5 を使用しています。

@ServerEndpointSpring コンテキストではなく、サーブレット コンテナー自体によってインスタンス化される WebSocket サーバーにシングルトン Bean 参照が必要です。

それを行うためのきれいな方法は何ですか?

私の現在の解決策:@Service静的フィールドにインスタンスを持つシングルトン Bean を作成しました:

@Service
public class WebSocketSupportBean {
    private volatile static WebSocketSupportBean instance = null;

    public static WebSocketSupportBean getInstance() {
        return instance;
    }

    public WebSocketSupportBean() {
        instance = this;
    }

静的メソッドで取得し、@ServerEndpointnull が返された場合はユーザーを切断します (サーバーの起動時に Bean が作成されず、ユーザーが接続する場合):

4

5 に答える 5

7

Spring Framework 3.x で websocket をセットアップできます

spring-core 4.0 でリリースされた Rossen Stoyanchev の SpringConfiguration に基づいて、その方法を示す小さな概念実証アプリケーションを開発しました。

アプリケーションは、Spring Bean を使用して挨拶の言葉を選択し、Websocket メッセージに返信するuri/wstestを使用して Websocket サーバー エンドポイントをセットアップします。@Autowired

index.htmlwebsocket 接続が開始され、 websocket をサポートするブラウザーで実行されている html ページ ( ) によってメッセージが送信されます。

エンドポイントの登録は、コンテキストの初期化時に ServletContextListener によって行われ、エンドポイントがインスタンス化されると、Spring で接続されます。

@WebListener
public class MyApplication implements ServletContextListener {

    private final static String SERVER_CONTAINER_ATTRIBUTE = "javax.websocket.server.ServerContainer";

    @Override
    public void contextInitialized(ServletContextEvent sce) {

        ServletContext container = sce.getServletContext();

        final ServerContainer serverContainer = (ServerContainer) container.getAttribute(SERVER_CONTAINER_ATTRIBUTE);
        try {
            serverContainer.addEndpoint(new MyEndpointConfig(MyEndpoint.class, "/wstest"));
        } catch (DeploymentException e) {
            e.printStackTrace();
        }
    }
}

エンドポイントは次のとおりです。

@Component
public class MyEndpoint extends Endpoint {

    @Autowired
    MyService myService;

    @Override
    public void onOpen(Session session, EndpointConfig config) {

        session.addMessageHandler(new MyMessageHandler(session));
    }


    class MyMessageHandler implements MessageHandler.Whole<String> {

        final Session session;

        public MyMessageHandler(Session session) {
            this.session = session;
        }

        @Override
        public void onMessage(String message) {
            try {
                String greeting = myService.getGreeting();
                session.getBasicRemote().sendText(greeting + ", got your message (" + message + "). Thanks ! (session: " + session.getId() + ")");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

完全なソースとすぐに実行できる例を、私のGithub ページでチェックアウトしてください。

于 2014-03-20T19:26:05.087 に答える