我需要编写一个监听PostgreSQL NOTIFY语句的服务器,并将每个通知视为服务请求(实际上,更像是要处理的任务)。我的主要要求是:
1)在PGConnection
上进行轮询的机制(理想情况下,这将是一个监听器,但在PgJDBC实现中,我们需要轮询待处理的通知。Reference)
2)在单独的线程上执行基于“请求”(使用NOTIFY通知中的通道名称)的回调。
3)内置线程管理内容。(在处理/完成任务时创建/删除线程,在同时处理太多任务时放入队列等)。
要求1和2对我来说很容易实现。但我不想自己编写线程管理。
是否有符合此要求的现有框架?如果框架自动生成请求统计信息,则会带来额外的好处。
答案 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队列并使用其基础结构来侦听新项目并对其进行处理。