我必须在独立应用程序中创建一个消息Listener(对于某些jms主题)。 由于我收到的每条消息都要做一些处理。
这种行为拖延了我的整体表现。
所以我决定为我的消息监听器创建一种POOL。 (如在ejb的MDB'中)。
我开始以这种方式使用Executor类(Java):
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
private Executor threadPool = Executors.newCachedThreadPool();
@Override
public void onMessage(final Message msg)
{
Runnable t = new Runnable()
{
public void run()
{
execute(msg);
log.trace(received messge");
}
};
threadPool.execute(t);
}
public void execute(Message msg)
{
// do some long running process)
}
通过这种方式,我确保我的应用程序在处理时不会从一条消息卡到另一条消息,而是为每次执行创建单独的线程。
我想根据您的经验提出您的建议.. 如果实施可能导致任何未来的问题,那是那种吗?我应该注意什么(我知道并发是一个问题)?
答案 0 :(得分:3)
这是JMS,你为什么不只是集合MDB?然后,您可以避免使用单独的线程池。如果在此期间关闭应用程序,也不会丢失未处理的项目。
确保您了解缓存和固定线程池之间的区别(请参阅:Java newCachedThreadPool() versus newFixedThreadPool)。它可能是也可能不是你想要的。我通常会选择固定的线程池,因为我想提前知道最大的开放线程数。
一件小事:在处理消息之前放置日志记录(以及),以便您可以轻松判断处理的时间。如果你使用固定池,知道它排队了多长时间也是有价值的。