1

我不得不在一个独立的应用程序中创建一个消息监听器(对于一些 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)
}

通过这种方式,我通过为每次执行创建单独的线程来确保我的应用程序在处理时不会从一条消息卡到另一条消息。

我想根据您的经验提出您的建议。如果实施可能会导致将来出现任何问题,那是那种吗?我应该注意什么(我知道并发是一个问题)?

4

1 回答 1

3

这是 JMS,你为什么不把 MDB 池化呢?然后,您可以避免使用单独的线程池。如果您同时关闭应用程序,未处理的项目也不会丢失。

确保您了解缓存和固定线程池之间的区别(请参阅:Java newCachedThreadPool() 与 newFixedThreadPool)。它可能是也可能不是你想要的。我通常会选择固定线程池,因为我想提前知道打开线程的最大数量。

一件小事:在处理消息之前放置日志记录(同样),这样您就可以轻松判断它被处理了多长时间。如果您使用固定池,了解它的排队时间也很有价值。

于 2012-10-28T14:14:46.413 回答