mirror of
https://github.com/PowerJob/PowerJob.git
synced 2025-07-17 00:00:04 +08:00
fix: never update lastActiveTime which lead to TIMEOUT for frequentJob(thanks @Y)
This commit is contained in:
parent
a9e4ed6262
commit
a67adf9601
@ -36,6 +36,7 @@ public class BroadcastProcessorDemo extends BroadcastProcessor {
|
|||||||
public ProcessResult process(TaskContext taskContext) throws Exception {
|
public ProcessResult process(TaskContext taskContext) throws Exception {
|
||||||
System.out.println("===== BroadcastProcessorDemo#process ======");
|
System.out.println("===== BroadcastProcessorDemo#process ======");
|
||||||
taskContext.getOmsLogger().info("BroadcastProcessorDemo#process, current host: {}", NetUtils.getLocalHost());
|
taskContext.getOmsLogger().info("BroadcastProcessorDemo#process, current host: {}", NetUtils.getLocalHost());
|
||||||
|
Thread.sleep(45 * 1000);
|
||||||
return new ProcessResult(true);
|
return new ProcessResult(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ public class TaskTrackerActor extends AbstractActor {
|
|||||||
taskTracker.broadcast(taskStatus == TaskStatus.WORKER_PROCESS_SUCCESS.getValue(), req.getSubInstanceId(), req.getTaskId(), req.getResult());
|
taskTracker.broadcast(taskStatus == TaskStatus.WORKER_PROCESS_SUCCESS.getValue(), req.getSubInstanceId(), req.getTaskId(), req.getResult());
|
||||||
}
|
}
|
||||||
|
|
||||||
taskTracker.updateTaskStatus(req.getTaskId(), taskStatus, req.getReportTime(), req.getResult());
|
taskTracker.updateTaskStatus(req.getSubInstanceId(), req.getTaskId(), taskStatus, req.getReportTime(), req.getResult());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -104,6 +105,14 @@ public class FrequentTaskTracker extends TaskTracker {
|
|||||||
scheduledPool.scheduleWithFixedDelay(new Checker(), 5000, Math.min(Math.max(timeParams, 5000), 15000), TimeUnit.MILLISECONDS);
|
scheduledPool.scheduleWithFixedDelay(new Checker(), 5000, Math.min(Math.max(timeParams, 5000), 15000), TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateTaskStatus(Long subInstanceId, String taskId, int newStatus, long reportTime, @Nullable String result) {
|
||||||
|
super.updateTaskStatus(subInstanceId, taskId, newStatus, reportTime, result);
|
||||||
|
// 更新 LastActiveTime
|
||||||
|
SubInstanceTimeHolder timeHolder = subInstanceId2TimeHolder.get(subInstanceId);
|
||||||
|
timeHolder.lastActiveTime = Math.max(reportTime, timeHolder.lastActiveTime);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InstanceDetail fetchRunningStatus() {
|
public InstanceDetail fetchRunningStatus() {
|
||||||
InstanceDetail detail = new InstanceDetail();
|
InstanceDetail detail = new InstanceDetail();
|
||||||
@ -243,9 +252,13 @@ public class FrequentTaskTracker extends TaskTracker {
|
|||||||
long heartbeatTimeout = nowTS - timeHolder.lastActiveTime;
|
long heartbeatTimeout = nowTS - timeHolder.lastActiveTime;
|
||||||
|
|
||||||
// 超时(包含总运行时间超时和心跳包超时),直接判定为失败
|
// 超时(包含总运行时间超时和心跳包超时),直接判定为失败
|
||||||
if (executeTimeout > instanceTimeoutMS || heartbeatTimeout > HEARTBEAT_TIMEOUT_MS) {
|
if (executeTimeout > instanceTimeoutMS) {
|
||||||
|
onFinished(subInstanceId, false, "RUNNING_TIMEOUT", iterator);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
onFinished(subInstanceId, false, "TIMEOUT", iterator);
|
if (heartbeatTimeout > HEARTBEAT_TIMEOUT_MS) {
|
||||||
|
onFinished(subInstanceId, false, "HEARTBEAT_TIMEOUT", iterator);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,12 +138,13 @@ public abstract class TaskTracker {
|
|||||||
/**
|
/**
|
||||||
* 更新Task状态
|
* 更新Task状态
|
||||||
* V1.0.0 -> V1.0.1(e405e283ad7f97b0b4e5d369c7de884c0caf9192) 锁方案变更,从 synchronized (taskId.intern()) 修改为分段锁,能大大减少内存占用,损失的只有理论并发度而已
|
* V1.0.0 -> V1.0.1(e405e283ad7f97b0b4e5d369c7de884c0caf9192) 锁方案变更,从 synchronized (taskId.intern()) 修改为分段锁,能大大减少内存占用,损失的只有理论并发度而已
|
||||||
|
* @param subInstanceId 子任务实例ID
|
||||||
* @param taskId task的ID(task为任务实例的执行单位)
|
* @param taskId task的ID(task为任务实例的执行单位)
|
||||||
* @param newStatus task的新状态
|
* @param newStatus task的新状态
|
||||||
* @param reportTime 上报时间
|
* @param reportTime 上报时间
|
||||||
* @param result task的执行结果,未执行完成时为空
|
* @param result task的执行结果,未执行完成时为空
|
||||||
*/
|
*/
|
||||||
public void updateTaskStatus(String taskId, int newStatus, long reportTime, @Nullable String result) {
|
public void updateTaskStatus(Long subInstanceId, String taskId, int newStatus, long reportTime, @Nullable String result) {
|
||||||
|
|
||||||
if (finished.get()) {
|
if (finished.get()) {
|
||||||
return;
|
return;
|
||||||
@ -278,7 +279,7 @@ public abstract class TaskTracker {
|
|||||||
List<TaskDO> unfinishedTask = TaskPersistenceService.INSTANCE.getAllUnFinishedTaskByAddress(instanceId, idlePtAddress);
|
List<TaskDO> unfinishedTask = TaskPersistenceService.INSTANCE.getAllUnFinishedTaskByAddress(instanceId, idlePtAddress);
|
||||||
if (!CollectionUtils.isEmpty(unfinishedTask)) {
|
if (!CollectionUtils.isEmpty(unfinishedTask)) {
|
||||||
log.warn("[TaskTracker-{}] ProcessorTracker({}) is idle now but have unfinished tasks: {}", instanceId, idlePtAddress, unfinishedTask);
|
log.warn("[TaskTracker-{}] ProcessorTracker({}) is idle now but have unfinished tasks: {}", instanceId, idlePtAddress, unfinishedTask);
|
||||||
unfinishedTask.forEach(task -> updateTaskStatus(task.getTaskId(), TaskStatus.WORKER_PROCESS_FAILED.getValue(), System.currentTimeMillis(), "SYSTEM: unreceived process result"));
|
unfinishedTask.forEach(task -> updateTaskStatus(task.getSubInstanceId(), task.getTaskId(), TaskStatus.WORKER_PROCESS_FAILED.getValue(), System.currentTimeMillis(), "SYSTEM: unreceived process result"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user