线程在通过ClassUtils.java加载类时被阻塞

线程在通过ClassUtils.java加载类时被阻塞,java,classloader,apache-kafka,spring-mongo,Java,Classloader,Apache Kafka,Spring Mongo,我的应用程序收听kafka主题,并将数据转储到cassandra中。线程也从mongo加载一些信息。卡夫卡主题的滞后性越来越大。我已经看到,大多数线程在加载某些类时被阻塞。我正在下面附加我的线程\u dump "KafkaConsumer-49" prio=10 tid=0x00007f1178fdd000 nid=0x78e0 waiting for monitor entry [0x00007f1155fb5000] java.lang.Thread.State: BLOCKED (

我的应用程序收听
kafka
主题,并将数据转储到
cassandra
中。线程也从
mongo
加载一些信息。卡夫卡主题的滞后性越来越大。我已经看到,大多数线程在加载某些类时被阻塞。我正在下面附加我的
线程\u dump

 "KafkaConsumer-49" prio=10 tid=0x00007f1178fdd000 nid=0x78e0 waiting for monitor entry [0x00007f1155fb5000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:403)
        - waiting to lock <0x00000006c0655b58> (a java.lang.Object)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        at org.springframework.util.ClassUtils.forName(ClassUtils.java:258)
        at org.springframework.data.convert.SimpleTypeInformationMapper.resolveTypeFrom(SimpleTypeInformationMapper.java:56)
        at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:103)
        at org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed(DefaultTypeMapper.java:144)
        at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:121)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:186)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:176)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:172)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:75)
        at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1840)
        at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1536)
        at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336)
        at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322)
        at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495)
        at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486)
        at com.snapdeal.coms.timemachine.mao.TimeMachineMao.getVendorProductsForUploadId(TimeMachineMao.java:32)
        at com.snapdeal.coms.timemachine.service.TimeMachineService.getVendorProductsForUploadIdAndSupc(TimeMachineService.java:35)
        at com.snapdeal.coms.timemachine.event.SupcUploadIdStateUpdateEventHandler.handleEvent(SupcUploadIdStateUpdateEventHandler.java:40)



KafkaConsumer-48" prio=10 tid=0x00007f1178fdb000 nid=0x78df waiting for monitor entry [0x00007f11560b6000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:403)
        - waiting to lock <0x00000006c0655b58> (a java.lang.Object)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        at org.springframework.util.ClassUtils.forName(ClassUtils.java:258)
        at org.springframework.data.convert.SimpleTypeInformationMapper.resolveTypeFrom(SimpleTypeInformationMapper.java:56)
        at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:103)
        at org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed(DefaultTypeMapper.java:144)
        at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:121)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:186)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:176)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:172)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:75)
        at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1840)
        at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1536)
        at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336)
        at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322)
        at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495)
        at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486)
        at com.snapdeal.coms.timemachine.mao.TimeMachineMao.getVendorProductsForUploadId(TimeMachineMao.java:32)
        at com.snapdeal.coms.timemachine.service.TimeMachineService.getVendorProductsForUploadIdAndSupc(TimeMachineService.java:35)
        at com.snapdeal.coms.timemachine.event.SupcUploadIdStateUpdateEventHandler.handleEvent(SupcUploadIdStateUpdateEventHandler.java:40)
        at com.snapdeal.coms.timemachine.TimeMachine.onEvent(TimeMachine.java:109)
java.lang.Thread.State:阻塞(在对象监视器上) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:403) -等待锁定(java.lang.Object) 位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:356) 位于org.springframework.util.ClassUtils.forName(ClassUtils.java:258) 位于org.springframework.data.convert.SimpleTypeInformationMapper.resolveTypeFrom(SimpleTypeInformationMapper.java:56) 位于org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:103) 位于org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed(DefaultTypeMapper.java:144) 位于org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:121) 位于org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:186) 位于org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:176) 位于org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:172) 位于org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:75) 位于org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1840) 位于org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1536) 位于org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336) 位于org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322) 位于org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495) 位于org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486) 在com.snapdeal.coms.timemachine.mao.TimeMachineMao.getVendorProductsForUploadId(TimeMachineMao.java:32)上 在com.snapdeal.com.timemachine.service.TimeMachineService.GetVendorProductsForupLoadAndSupc(TimeMachineService.java:35)上 在com.snapdeal.com.timemachine.event.supcuploaddstateUpdateEventHandler.handleEvent(supcuploaddstateUpdateEventHandler.java:40)


我不知道为什么所有的线程都被阻塞了。我认为类只加载了一次,以后就不需要进行任何锁定。

您是否尝试使用
ConsumerOfSectChecker
查看您的消费者是否还活着?您可以在
$KAFKA\u ROOT\u DIR/
文件夹中尝试以下命令

  bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --group consumer-group1 --zkconnect zkhost:zkport --topic topic1
这里有一些从他们的页面上抄下来的笔记

若消费者补偿在一段时间后不移动,则消费者可能已经停止。如果使用者偏移量在移动,但使用者滞后(日志末尾和使用者偏移量之间的差值)在增加,则使用者比生产者慢。如果使用者速度较慢,典型的解决方案是增加使用者中的并行度。这可能需要增加主题的分区数


上面的faq页面还解释了您的消费者被阻止的可能原因,可能值得一看。

问题在于从mongo获取数据。有大量数据,没有实现分页,并且特定请求上没有套接字超时,因此线程被阻塞。

我已经检查过了。消费者补偿正在移动,但滞后正在增加。我已经在我的主题上创建了100个主题,目前运行50个消费者线程。在分析线程转储时,我看到大多数线程都处于阻塞状态。已附加线程转储
如果使用者偏移量正在移动,但使用者滞后(日志末尾和使用者偏移量之间的差异)正在增加,则使用者比生产者慢
——从常见问题解答中,我可以看出这就是我增加使用者线程数的原因。但大多数线程在类装入器上从mongo检索数据时处于阻塞状态。我不明白为什么同一个类再次加载。这是否意味着你的卡夫卡工作正常?抱歉,我有点困惑,这两个进程到底是如何关联的,从队列消费和从mongo加载。这两个独立的线程是并行运行的吗?实际上,我的消费者线程使用kakfa并将这些事件保存在cassandra中,但在保存之前,cassandra也从mongo收到了一些额外的信息。
  bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --group consumer-group1 --zkconnect zkhost:zkport --topic topic1