diff --git a/powerjob-client/pom.xml b/powerjob-client/pom.xml
index 873c16d5..28d2b152 100644
--- a/powerjob-client/pom.xml
+++ b/powerjob-client/pom.xml
@@ -10,13 +10,13 @@
4.0.0
powerjob-client
- 3.4.6
+ 3.4.7
jar
5.6.1
1.2.68
- 3.4.6
+ 3.4.7
3.2.4
diff --git a/powerjob-common/pom.xml b/powerjob-common/pom.xml
index fe718257..a45cd012 100644
--- a/powerjob-common/pom.xml
+++ b/powerjob-common/pom.xml
@@ -10,7 +10,7 @@
4.0.0
powerjob-common
- 3.4.6
+ 3.4.7
jar
diff --git a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/SystemMetrics.java b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/SystemMetrics.java
index 6a065789..f2d48849 100644
--- a/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/SystemMetrics.java
+++ b/powerjob-common/src/main/java/com/github/kfcfans/powerjob/common/model/SystemMetrics.java
@@ -47,7 +47,12 @@ public class SystemMetrics implements OmsSerializable, Comparable
* Used disk ratio.
*/
private double diskUsage;
-
+ /**
+ * user-customized system metrics collector, eg. GPU usage
+ * implement SystemMetricsCollector to set the value in worker side
+ * implement WorkerFilter to filter the worker in server side
+ */
+ private String extra;
/**
* Score of cache.
*/
diff --git a/powerjob-official-processors/pom.xml b/powerjob-official-processors/pom.xml
index b28b61fc..5e11dc48 100644
--- a/powerjob-official-processors/pom.xml
+++ b/powerjob-official-processors/pom.xml
@@ -20,7 +20,7 @@
5.6.1
1.2.3
- 3.4.6
+ 3.4.7
1.2.68
diff --git a/powerjob-server/pom.xml b/powerjob-server/pom.xml
index 9aac61ce..263a1930 100644
--- a/powerjob-server/pom.xml
+++ b/powerjob-server/pom.xml
@@ -10,13 +10,13 @@
4.0.0
powerjob-server
- 3.4.6
+ 3.4.7
jar
2.9.2
2.3.4.RELEASE
- 3.4.6
+ 3.4.7
8.0.19
19.7.0.0
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/extension/WorkerFilter.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/extension/WorkerFilter.java
new file mode 100644
index 00000000..adbecb45
--- /dev/null
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/extension/WorkerFilter.java
@@ -0,0 +1,21 @@
+package com.github.kfcfans.powerjob.server.extension;
+
+import com.github.kfcfans.powerjob.server.persistence.core.model.JobInfoDO;
+import com.github.kfcfans.powerjob.server.remote.worker.cluster.WorkerInfo;
+
+/**
+ * filter worker by system metrics or other info
+ *
+ * @author tjq
+ * @since 2021/2/16
+ */
+public interface WorkerFilter {
+
+ /**
+ *
+ * @param workerInfo worker info, maybe you need to use your customized info in SystemMetrics#extra
+ * @param jobInfoDO job info
+ * @return true will remove the worker in process list
+ */
+ boolean filter(WorkerInfo workerInfo, JobInfoDO jobInfoDO);
+}
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/remote/server/FriendRequestHandler.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/remote/server/FriendRequestHandler.java
index 2c246c1b..b6d8cef1 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/remote/server/FriendRequestHandler.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/remote/server/FriendRequestHandler.java
@@ -2,13 +2,14 @@ package com.github.kfcfans.powerjob.server.remote.server;
import akka.actor.AbstractActor;
import com.alibaba.fastjson.JSONObject;
-import com.github.kfcfans.powerjob.server.remote.worker.cluster.WorkerInfo;
import com.github.kfcfans.powerjob.common.response.AskResponse;
import com.github.kfcfans.powerjob.server.common.utils.SpringUtils;
import com.github.kfcfans.powerjob.server.remote.server.request.FriendQueryWorkerClusterStatusReq;
import com.github.kfcfans.powerjob.server.remote.server.request.Ping;
import com.github.kfcfans.powerjob.server.remote.server.request.RemoteProcessReq;
+import com.github.kfcfans.powerjob.server.remote.transport.TransportService;
import com.github.kfcfans.powerjob.server.remote.worker.cluster.WorkerClusterManagerService;
+import com.github.kfcfans.powerjob.server.remote.worker.cluster.WorkerInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.util.ReflectionUtils;
@@ -38,7 +39,7 @@ public class FriendRequestHandler extends AbstractActor {
* 处理存活检测的请求
*/
private void onReceivePing(Ping ping) {
- getSender().tell(AskResponse.succeed(System.currentTimeMillis() - ping.getCurrentTime()), getSelf());
+ getSender().tell(AskResponse.succeed(TransportService.getAllAddress()), getSelf());
}
/**
diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/remote/server/election/DefaultServerElectionService.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/remote/server/election/DefaultServerElectionService.java
index 716ba850..236b24a3 100644
--- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/remote/server/election/DefaultServerElectionService.java
+++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/remote/server/election/DefaultServerElectionService.java
@@ -2,9 +2,11 @@ package com.github.kfcfans.powerjob.server.remote.server.election;
import akka.actor.ActorSelection;
import akka.pattern.Patterns;
+import com.alibaba.fastjson.JSONObject;
import com.github.kfcfans.powerjob.common.PowerJobException;
import com.github.kfcfans.powerjob.common.Protocol;
import com.github.kfcfans.powerjob.common.response.AskResponse;
+import com.github.kfcfans.powerjob.common.utils.JsonUtils;
import com.github.kfcfans.powerjob.server.extension.LockService;
import com.github.kfcfans.powerjob.server.extension.ServerElectionService;
import com.github.kfcfans.powerjob.server.remote.server.request.Ping;
@@ -75,8 +77,9 @@ public class DefaultServerElectionService implements ServerElectionService {
}
String appName = appInfoOpt.get().getAppName();
String originServer = appInfoOpt.get().getCurrentServer();
- if (isActive(originServer, downServerCache)) {
- return originServer;
+ String activeAddress = activeAddress(originServer, downServerCache, protocol);
+ if (StringUtils.isNotEmpty(activeAddress)) {
+ return activeAddress;
}
// 无可用Server,重新进行Server选举,需要加锁
@@ -93,8 +96,9 @@ public class DefaultServerElectionService implements ServerElectionService {
// 可能上一台机器已经完成了Server选举,需要再次判断
AppInfoDO appInfo = appInfoRepository.findById(appId).orElseThrow(() -> new RuntimeException("impossible, unless we just lost our database."));
- if (isActive(appInfo.getCurrentServer(), downServerCache)) {
- return appInfo.getCurrentServer();
+ String address = activeAddress(originServer, downServerCache, protocol);
+ if (StringUtils.isNotEmpty(address)) {
+ return address;
}
// 篡位,本机作为Server
@@ -118,15 +122,16 @@ public class DefaultServerElectionService implements ServerElectionService {
* 判断指定server是否存活
* @param serverAddress 需要检测的server地址
* @param downServerCache 缓存,防止多次发送PING(这个QPS其实还蛮爆表的...)
- * @return true 存活 / false down机
+ * @param protocol 协议,用于返回指定的地址
+ * @return null or address
*/
- private boolean isActive(String serverAddress, Set downServerCache) {
+ private String activeAddress(String serverAddress, Set downServerCache, String protocol) {
if (downServerCache.contains(serverAddress)) {
- return false;
+ return null;
}
if (StringUtils.isEmpty(serverAddress)) {
- return false;
+ return null;
}
Ping ping = new Ping();
@@ -137,12 +142,14 @@ public class DefaultServerElectionService implements ServerElectionService {
CompletionStage