我遇到过我的程序挂起的情况,看起来像死锁.但我尝试用jconsole和visualvm来解决它,但他们没有发现任何死锁.示例代码:
public class StaticInitializer {
private static int state = 10;
static {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
state = 11;
System.out.println("Exit Thread");
}
});
t1.start();
try {
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("exiting static block");
}
public static void main(String...strings) {
System.out.println(state);
}
}
Run Code Online (Sandbox Code Playgroud)
当我在调试模式下执行它时,我可以看到控制到达@Override public void run(){state = 11;
但只要执行state = 11,它就会挂起/死锁.我在stackoverflow中查看了不同的帖子,我认为静态初始化程序是线程安全的,但在这种情况下,jconsole应该报告这一点.关于主线程,jconsole说处于等待状态,那很好.但对于在静态初始化程序块中创建的线程,jconsole表示它处于RUNNABLE状态而未被阻止.我很困惑,这里缺乏一些概念.请帮帮我.
注意到一个问题,其中Kafka消费者组(在java中实现)始终错过来自经纪人的一些消息.作为调试的第一线,通过kafka console consumer,我可以在代理中看到这些消息.
Kafka经纪人版:0.10.1.0
Kafka客户端版本:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.11</artifactId>
<version>0.9.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
卡夫卡消费者配置:
Properties props = new Properties();
props.put("bootstrap.servers","broker1,broker2,broker3");
props.put("group.id", "myGroupIdForDemo");
props.put("key.deserializer", StringDeserializer.class.getName());
props.put("value.deserializer", StringDeserializer.class.getName());
props.put("heartbeat.interval.ms", "25000");
props.put("session.timeout.ms", "30000");
props.put("max.poll.interval.ms", "300000");
props.put("max.poll.records", "1");
props.put("zookeeper.session.timeout.ms", "120000");
props.put("zookeeper.sync.time.ms", "10000");
props.put("auto.commit.enable", "false");
props.put("auto.commit.interval.ms", "60000");
props.put("auto.offset.reset", "earliest");
props.put("consumer.timeout.ms", "-1");
props.put("rebalance.max.retries", "20");
props.put("rebalance.backoff.ms", "6000");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
Run Code Online (Sandbox Code Playgroud)
编辑 - 增加一些信息
我想补充一些信息:共有6个分区.但是,具有相同消费者组ID的主题的消费者总数为40.我知道有34位消费者闲着无所事事.
但是,我想要了解的一个方面是,如果消费者未能将代理发送的心跳发送到负载并重新分配分区,那么任何空闲消费者是否都有机会消费消息?此消息未被消耗的问题始终仅在某些分区中被注意到.我的意思是消息无法从同一分区传递/消费.
任何帮助表示赞赏.谢谢.