我有以下代码:
import redis.clients.jedis.JedisPubSub;
import javax.sql.DataSource;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MsgSubscriber extends JedisPubSub {
private final PersistenceService service;
private final ExecutorService pool;
public MsgSubscriber(DataSource dataSource) {
pool = Executors.newFixedThreadPool(4);
service = new PersistenceServiceImpl(dataSource);
}
public void onMessage(String channel, String message) {
pool.execute(new Handler(message, service));
}
}
它订阅了Redis频道,该频道每秒接收数百条消息。
我正在处理这些消息并将它们保存到数据存储中,处理程序如下所示:
public class Handler implements Runnable {
private String msg;
private PersistenceService service;
public MessageHandler(String msg, PersistenceService service) {
this.msg = msg;
this.service = service;
}
@Override
public void run() {
service.save(msg);
}
}
事情似乎正常,消息正在写入数据库,但我一直在运行Java VisualVM,并且看到如下图:
我很担心,因为线程似乎坐在这个"停放"状态而不是运行 - 虽然有一些日志语句我看到代码正在运行。我想我的问题首先是,我的代码是否存在问题,其次,为什么Visual VM会向我显示线程似乎没有做任何事情?
答案 0 :(得分:3)
每秒数百条消息
Redis可以在1个线程中轻松处理每秒10K个消息。使用4个线程时,它应该在1%的忙碌之下,但是对于VisualVM而言,这可能太低而无法通过采样进行检测,而是说它一直处于驻留状态。