我正在开发一个将使用tomcat在spring boot context下运行的应用程序。该项目在启动时连接到Kafka,提取消息并处理它们。 tomcat用于某些管理API。
当Spring加载时,它通过几个线程与Kafka连接。 每个线程都使用一个处理消息的spring bean自动装配。这个bean当然还有更多的bean等。
我是否需要考虑并发问题?同步东西?使用并发类型,例如ConcurrentHashMap而不是普通的HashMap?
答案 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
调用该函数。