2

Spring MVC で RESTful Web サービスを実装しています。サービスが開始されると、クライアントがサービスを見つけられるようにサービス自体を登録する必要があります。私は現在 @Controller クラスの @PostConstruct メソッドでこれを行っています。ただし、Web コンテナーはまだ Web 要求をリッスンしていないため、実際に要求を受信する準備が整う前にサービスが登録されます。Web コンテナーがすべての初期化を完了し、要求をリッスンした後で、サービスを登録したいと考えています。

コンテナの起動時に通知してくれるリスナーやイベントを探しましたが、見つかりませんでした。

「時期尚早に最適化」している可能性があります。最終的な完全展開環境では、各サービスの一連のレプリカを負荷分散する必要があり、ロード バランサーは、実際のサービスの可用性と各インスタンスの現在の負荷を判断する必要があります。

編集:追加の説明。

サービスを外部レジストリ(具体的には、この場合は Zookeeper インスタンス) に登録したいと考えています。アプリケーション サーバーの初期化が完了し、「ビジネス用にオープン」になるまで、サービスをレジストリに追加しないでください。@PostConstruct を使用すると、基本的なシーケンスは と同じServletContextListener.contextInitialized()ように見えますが、ログ出力は次のようになります。

INFO : MyController - Registering service foo 0.1.0 at 192.168.34.15:8080
...
May 7, 2012 3:42:49 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
May 7, 2012 3:42:49 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080

代わりに見たいのはこれです:

INFO: Starting Coyote HTTP/1.1 on http-8080
...
INFO : MyController - Registering service foo 0.1.0 at 192.168.34.15:8080
...
4

2 に答える 2

3

あなたが探しているリスナーはjavax.servlet.ServletContextListener、そのcontextInitialized(..)メソッドです(そして、それを<listener><listener-class>..web.xml または with に登録します@WebListener

そこに春の豆が必要な場合は、次を使用できます。

WebApplicationContextUtils.getRequiredWebApplicationContext(ctx).getBean(..);
于 2012-05-07T15:32:09.413 に答える