【问题标题】:Java monitor multi threads outside the classJava 监控类外的多线程
【发布时间】:2018-11-21 22:35:19
【问题描述】:

由于我这里没有代码,我会尽量说清楚......

我正在用 java 开发一个 rest 服务,它将获取一些参数(线程数、消息数量)并将创建线程(通过循环)并通过 MQ 发送这个数量的消息(我正在传递数字创建线程时的消息)。

例如,如果有人发送 50 个线程和 5000 条消息,它将发送 250 万条消息...

现在我的问题是如何创建另一个休息服务来监视所有这些线程并就发送的消息给我一个百分比的结论。

我正在考虑调用此服务以通过 ajax 每 2 秒更新一次进度条。

【问题讨论】:

  • 50 * 5000 = 250,000

标签: java multithreading


【解决方案1】:

一种简化的方法是创建一个类来跟踪状态栏需要显示的统计信息。例如:

public class MessageCreatorProgress {
    private final int totalMessagesToBeCreated;
    private final AtomicInteger successCount;
    private final AtomicInteger failureCount;

    // constructor to initialize values
    // increment methods
    // get methods
}

在启动线程的初始请求中,使用MessageCreatorProgress 的共享实例构造线程。例如:

// endpoint method to create a bunch of messages
public String startCreatingMessages(CreateMessagesRequest request) {
    MessageCreatorProgress progress = new MessageCreatorProgress(requesst.getThreadCount * request.getMessageCountPerThread());

   for (...) {
       new MyMessageCreator(progress, request.getSomeParameter(), ....).start();
   }

   String messageProgressId = some unique value...
   // Store MessageCreatorProgress in the session or some other shared memory,
   // so it can be accessed by subsequent calls.
   session.setAttribute(messageProgressId, progress);
   return messageProgressId;
}

例如,每个MyMessageCreator 实例都将调用progress.incrementSuccess() 作为最后一步,或者调用progress.incrementFailure() 作为例外。

AJAX 调用将messageProgressId 传递给状态端点,该端点知道如何访问MessageCreatorProgress

// endpoint method to get the message creation progress
// transform to JSON or whatever
public MessageCreatorProgress getMessageCreationProgress(String messageProgressId) {
    return session.getAttribute(messageProgressId);
}

更复杂的方法是使用数据库 - 例如,当 AJAX 调用不会命中运行正在创建消息的线程的同一服务器时。当线程成功或发生异常时,它可以更新与messageProgressId 关联的记录,AJAX 端点检查数据库并构造MessageCreatorProgress 以返回给客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多