假设我们在ActiveMQ中有一个队列,一个向该队列发送消息的客户端(生产者)和一个从队列中获取消息的服务器(消费者)。
在服务器端,消费者有一个消息监听器,类似于。
consumer.Listener += ConsumerOnListener;
而ConsumerOnListener的实现是这样的。
private void ConsumerOnListener(IMessage message)
{
var textMessage = message as ITextMessage;
// validate textMessage
// more code here...eg. save to databse,logging etc. (part-a)
Task.Factory.StartNew(() =>
{
// do something else here (part-b)
});
}
上面的主要思想是不需要等待。乙方 在处理下一条消息之前,将被执行。想象一下 乙方 做一些完全属于自己的事情,可能成功,也可能失败(fire-and-forget)。
所以,这里的问题是,是否可以在ConsumerOnListener里面使用Tasks。这会不会以某种方式 "阻塞 "队列?
假设 Task
是异步的,那么它不应该阻塞监听器或队列本身的执行。通常在这样的用例中,通过简单地增加消费者监听器的数量来增加并发性,但让监听器启动自己的异步线程、任务等也是有效的。