Java服务器框架监听PostgreSQL NOTIFY语句

时间:2011-12-26 08:35:33

标签: postgresql notify

我需要编写一个监听PostgreSQL NOTIFY语句的服务器,并将每个通知视为服务请求(实际上,更像是要处理的任务)。我的主要要求是:

1)在PGConnection上进行轮询的机制(理想情况下,这将是一个监听器,但在PgJDBC实现中,我们需要轮询待处理的通知。Reference

2)在单独的线程上执行基于“请求”(使用NOTIFY通知中的通道名称)的回调。

3)内置线程管理内容。(在处理/完成任务时创建/删除线程,在同时处理太多任务时放入队列等)。

要求1和2对我来说很容易实现。但我不想自己编写线程管理。

是否有符合此要求的现有框架?如果框架自动生成请求统计信息,则会带来额外的好处。

1 个答案:

答案 0 :(得分:1)

老实说,只需使用Executors的标准ExecutorService实现就可以很容易地确定需求3,这样就可以获得一个固定大小的线程池,并以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队列并使用其基础结构来侦听新项目并对其进行处理。