Java监视类外的多线程

时间:2018-11-21 22:35:19

标签: java multithreading

由于我在这里没有代码,因此我将尽我所能...

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

因此,例如,某人发送50个线程和5000 msgs,它将发送2.5M msgs ...

现在我的问题是我该如何创建另一个rest服务来监视所有这些线程,并为我提供有关所发送消息的部分结论。

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

1 个答案:

答案 0 :(得分:0)

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

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以返回到客户端。