java - 如何在ThreadPoolTask​​Executor中持久化对象

标签 java spring jakarta-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 对象设置为单例(设计模式)并使用 getInstance() 将其注入(inject)到 Runnabble beans 是个好习惯吗?方法工厂?

我的 mongoDb 模板应该打开 N 个连接(某种连接池)吗?

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

最佳答案

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

注意:mongoTemplate.save(message, "messages") 似乎参数顺序不正确。您应该首先传递集合名称。

关于java - 如何在ThreadPoolTask​​Executor中持久化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8720182/

相关文章:

java - eclipse:由于 "Could not read file ... ~$somefile.xlsx"而未构建项目

java - 使用 SpringBoot CrudRepository 查找一个已知条目

java - Spring Boot Hibernate 中的 H2 DB 不生成 Db Schema

java - Spring 默认 bean 候选者

java - 使用Spring boot渲染jsp页面出错?

java - 接口(interface) com.sun.xml.ws.developer.WSBindingProvider 在类加载器中不可见

java - 使用 EAR 库配置 Helios WTP 实用程序项目的构建路径

web-services - 在 Eclipse 中使用 wsdl 文档构建 Soap Web 服务客户端

spring - JTATransaction 的替代方案

java - 使用 charAt(i) 从字符串创建一个整数数组会在每个索引中给出 2 位数字吗?