Spring启动应用程序和并发问题

时间:2016-01-12 07:45:15

标签: java spring concurrency spring-boot

我正在开发一个将使用tomcat在spring boot context下运行的应用程序。该项目在启动时连接到Kafka,提取消息并处理它们。 tomcat用于某些管理API。

当Spring加载时,它通过几个线程与Kafka连接。 每个线程都使用一个处理消息的spring bean自动装配。这个bean当然还有更多的bean等。

我是否需要考虑并发问题?同步东西?使用并发类型,例如ConcurrentHashMap而不是普通的HashMap?

2 个答案:

答案 0 :(得分:3)

没有足够的细节。

  

每个线程都使用处理消息的spring bean自动装配

好的,bean的函数是否安全?如果它们已经或(相当于)bean是无状态的,那么你就不必明确地同步它。
如果使用库解决方案来获取和反序列化消息,则通常会在文档中提及此线程安全问题。

您可以在多个线程中提取邮件,但是您是在适当的位置还是由其他工作人员(-s)处理收到的邮件?如果您有其他工作人员进行处理,则必须使用线程安全集合(例如LinkedBlockingQueue)安全地将消息传递给他们

  

ConcurrentHashMap而不是普通的HashMap,例如?

如果你的bean将获取的消息存储到map中,而不是本地但是实例变量,那么不同的线程会写入和读取它,而不应该同步这些动作。在这种情况下,使用ConcurrentHashMap是一种很好的方法。

答案 1 :(得分:2)

在spring中,默认情况下bean是单例。 bean的方法可以由多个线程同时调用。在每种方法中,您都不需要关心并发性。但是如果你想将数据保存在其他一些地方,比如其他数据对象的bean成员,你应该关心那些数据持有者的并发性。

在这个例子中:

@Service
public class SomeService {
   public Map handle(Map dataHolder) {...}
}

@Service
public class OtherSerice {
  @Inject SomeService serv1;
  Map theDataNotSafe = new HashMap();

  public Map func() {
    Map theData = new HashMap();
    serv1.handle(theData); // thread safe, 
    serv1.handle(theDataNotSafe); // not thread safe
  }
}

OtherService.func()函数将调用SomeService.handle(..)。函数serv1.handle(theDataNotSafe);不是线程安全的,因为有几个线程将使用相同的HashMap调用该函数。