4

Java アプリケーション サーバーに移行することを考えているデータベースに対して一連のキューベースの処理を行う、スタンドアロンのヘッドレス Java サーバー アプリケーションがあります。私はバックエンド Java の経験が豊富で、JSP の経験も少しありますが、サーブレットの経験はあまりありません。

私のアプリをサーブレットにラップし、起動時にデプロイするだけのアプローチのようです (そして、1 つのインスタンスのみがデプロイされるようにします)。

いくつかの質問:

1) 私のアプリには HTTP (またはその他の) 要求/応答メカニズムがないため、URL マッピングを持たないサーブレットを実装するのはばかげていますか? API を見ると、GenericServlet を実装し、service() メソッドを空のままにするだけでよいでしょうか?

2) 私の Java アプリの別の部分は、独自のネットワーク ソケット (非 HTTP) を開いて管理し、受信データのストリームを受け入れます。サーブレットの要求/応答モデルに適合させるには、かなりの作業が必要になると思います。サーブレットが独自のネットワーク ソケットを開いたり管理したりしても問題ありませんか?

3) また、(DB を介してのみ通信できるという点で) Java アプリとあまりうまく統合されていない Web アプリ (現在は coldfusion にあります) も多数あります。私たちは railo (別のサーブレット) を検討しており、coldfusion/railo アプリ (同じアプリ サーバーで実行されている) が互いに直接通信するのがどれほど簡単かを理解しようとしています。おそらく、Java エンジンの現在のランタイム統計/メトリックを表示し、最終的に Java エンジンのビジネス ロジックの一部を呼び出す Web ページです。

ありがとう、ブライアン

4

2 に答える 2

2

HTTP リクエストを傍受したくない場合は、拡張しないでくださいHttpServlet。これは意味がありません。実際に webapp の起動時に「バックグラウンド タスク」として実行し、webapp のシャットダウン時に停止する場合は、それにServletContextListener応じて実装してください。

public class Config implements ServletContextListener {

    private YourApp yourApp;

    public void contextInitialized(ServletContextEvent event) {
        yourApp = new YourApp();
        yourApp.start();
    }

    public void contextDestroyed(ServletContextEvent event) {
        yourApp.stop();
    }

}

web.xml次のように登録できます。

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

YourApp実際に別のスレッドでタスクを起動しない場合は、 でラップして、Runnableを使用して実行する必要がありますExecutorService。例えば

public class Config implements ServletContextListener {

    private ExecutorService executor;

    public void contextInitialized(ServletContextEvent event) {
        executor = Executors.newSingleThreadExecutor();
        executor.submit(new YourApp()); // YourApp should implement Runnable.
    }

    public void contextDestroyed(ServletContextEvent event) {
        executor.shutdown();
    }

}

結局のところ、 Web アプリケーションがそれ以外にもしないのであれば、それをサーブレット コンテナで実行することの価値に疑問を感じます。代わりに、main()メソッドを使用してスタンドアロンの Java アプリケーションとして実行します。

于 2010-03-22T18:41:33.070 に答える
2
  1. サーブレットは、HTTP の世界に特に結び付けられていない一般的なメカニズムです (99.999% のケースで HttpServlets が使用されているにもかかわらず)。たとえば、メール イベントに応答する MailServlet を実装するために Servlet クラスをサブクラス化することもできますが、私の知る限り、現在の Web サーバーは HTTP マッピングのみをサポートしています。

  2. ソケットは Java EE の世界に属しており、この環境でカスタム スレッドを起動することは悪いことと見なされます。(データのポーリングなどのために) ソケットを開く場合は、必ずそうする必要があります。

于 2010-03-22T18:34:55.220 に答える