由于我在这里没有代码,因此我将尽我所能...
我正在用Java开发一个rest服务,该服务将获取一些参数(线程数,消息量),并创建线程(通过循环)并通过MQ发送此消息数(我传递了数字创建线程时的消息数。
因此,例如,某人发送50个线程和5000 msgs,它将发送2.5M msgs ...
现在我的问题是我该如何创建另一个rest服务来监视所有这些线程,并为我提供有关所发送消息的部分结论。
我正在考虑调用此服务以通过ajax每2秒更新进度条。
答案 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
以返回到客户端。