我正在设计一个将在 OSGi 容器(目前是 Equinox)中运行的应用程序。它将通过 RabbitMQ 接收消息并在内部处理它们。该应用程序将作为服务器持续运行。我目前的计划是让 RabbitMQ 侦听器包配置其队列并在其上放置侦听器,使用QueueingConsumer
并在它们自己的线程中运行。侦听器将调用一个或多个处理服务来处理消息。处理器需要进行 JDBC 调用才能访问数据库。我希望能够控制调用处理器的顺序。如果以后可以灵活地添加更多服务,而不必重新编码 RabbitMQ 侦听器,那就太好了。
我面临的问题是消息可能会以突发或缓慢的形式出现。我希望能够使用它PreparedStatement
来加速数据库访问,但我也不想在没有任何事情发生的情况下长期保持连接打开。我曾考虑过DefaultConsumer
直接子类化并让它在 RabbitMQ 的线程上运行Connection
,但后来我失去了知道什么时候什么都没有发生的能力。我最初的想法是让消息处理器与 OSGi 服务完全分离,并在每次调用时都从池中获取数据库连接,但这失去了预准备语句的优势。我正在使用 Tomcat JDBC 池,它似乎没有准备好语句缓存。此外,我不确定为每次调用创建准备好的语句会有多昂贵,但这似乎很浪费。
到目前为止,我想出的最好的想法是让我的听众在一个双循环中处理。外部循环等待消息,然后调用内部循环建立数据库连接和准备好的语句并运行,直到在指定的超时时间内没有更多消息进入,然后关闭其连接并返回到外部循环。我让它可以进行一次处理,但是如果我有多个可能有不同准备好的语句的处理器,我很难想象如何管理这个。
也许我不得不放弃多个服务的想法,并将处理过程硬编码到我的听众中。
有什么建议么?谢谢!