1

PostgreSQL NOTIFY ステートメントをリッスンし、各通知を処理する要求と見なすサーバーを作成する必要があります (実際には、処理するタスクに似ています)。私の主な要件は次のとおりです。

1) ポーリングするメカニズムPGConnection(理想的には、これはリスナーですが、PgJDBC 実装では、保留中の通知をポーリングする必要があります。参照)

2) 別のスレッドで、(NOTIFY 通知のチャネル名を使用して) 「要求」に基づいてコールバックを実行します。

3)スレッド管理機能が組み込まれています(タスクが処理/終了したときにスレッドを作成/削除し、同時に処理されているタスクが多すぎるときにキューに入れるなど)

要件 1 と 2 は、私が自分で簡単に実装できるものです。しかし、私は自分でスレッド管理を書きたくありません。

この要件を満たす既存のフレームワークはありますか? フレームワークがリクエスト統計を自動的に生成する場合、追加の利点があります。

4

1 に答える 1

1

正直なところ、要件 3 はおそらく Executor から標準の ExecutorService 実装を使用するだけで簡単に満たすことができます。これにより、たとえば、固定サイズのスレッド プールを取得し、Runnable または Callable 実装の形式でそれらに作業を送信できます。彼らは、制限までスレッドを作成するなどの面倒な詳細を処理します。その後、リスナーに Runnable の薄いレイヤーを実装して、統計などを収集することができます。

何かのようなもの:

private final ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
private final NotificationCallback callback;
private int waiting, executing, succeeded, failed;

public void pollAndDispatch() {
   Notification notification;
   while ((notification = pollDatabase()) != null) {
      final Notification ourNotification = notification;
      incrementWaitingCount();
      threadPool.submit(new Runnable() {
         public void run() {
           waitingToExecuting();
           try {
             callback.processNotification(ourNotification);
             executionCompleted();
           } catch (Exception e) {
             executionFailed();
             LOG.error("Exeception thrown while processing notification: " + ourNotification, e);
           }
         }
      });
   }
}
// check PGconn for notification and return it, or null if none received
protected Notification pollDatabase() { ... }
// maintain statistics
private synchronized void incrementWaitingCount() { ++waiting; }
private synchronized void waitingToExecuting() { --waiting; ++executing; }
private synchronized void executionCompleted() { --executing; ++succeeded; }
private synchronized void executionFailed() { --executing; ++failed; }

派手にしたい場合は、通知を JMS キューに入れ、そのインフラストラクチャを使用して新しい項目をリッスンして処理します。

于 2011-12-27T16:19:11.213 に答える