如何在ThreadPoolTask​​Executor中持久化Object

时间:2012-01-03 23:35:00

标签: java spring java-ee mongodb concurrency

我需要实现以下架构:

N个线程正在监视BlockedQueue<Message>(我甚至可以认为我们可以在不久的将来使用ActiveMQ。)

当捕获消息时,我对此消息执行了一些修改,我需要将其保留在MongoDB数据库中。

服务是这样的:

@Repository(value="service")
public class Service {

    @Autowired
    MongoTemplate mongoTemplate; 

public void save(Message message){
  //do something to message
  doSomething(message);
  //persist it
  mongoTemplate.save(message, "messages");
}
//etc...
}

现在我需要在线程之间共享Service对象。

如何使此服务线程安全?将Service对象设置为singleton(设计模式)并使用getInstance()方法工厂将其注入Runnabble bean是不错的做法?

我的mongoDb模板是否应该打开N个连接(连接池的种类)?

可能还有一些其他方法可以在线程之间共享此类服务吗?

1 个答案:

答案 0 :(得分:1)

MongoDB驱动程序已经处理连接池,如果在调用期间不修改Message对象,它也是线程安全的。因此,如果doSomething(message)是线程安全的,那么您的服务代码应该没问题。

注意:mongoTemplate.save(消息,“messages”)似乎有不正确的参数顺序。您应该首先传递集合名称。