feat: 3.1.0
1. 新增任务节点手动停止、重试接口
This commit is contained in:
parent
5e27915052
commit
83af125978
@ -1,7 +1,5 @@
|
|||||||
package com.aizuda.easy.retry.common.log.lang;
|
package com.aizuda.easy.retry.common.log.lang;
|
||||||
|
|
||||||
import cn.hutool.core.lang.caller.CallerUtil;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 调用者接口<br>
|
* 调用者接口<br>
|
||||||
* 可以通过此接口的实现类方法获取调用者、多级调用者以及判断是否被调用
|
* 可以通过此接口的实现类方法获取调用者、多级调用者以及判断是否被调用
|
||||||
@ -10,12 +8,6 @@ import cn.hutool.core.lang.caller.CallerUtil;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public interface Caller {
|
public interface Caller {
|
||||||
/**
|
|
||||||
* 获得调用者
|
|
||||||
*
|
|
||||||
* @return 调用者
|
|
||||||
*/
|
|
||||||
Class<?> getCaller();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得调用者的调用者
|
* 获得调用者的调用者
|
||||||
@ -24,26 +16,4 @@ public interface Caller {
|
|||||||
*/
|
*/
|
||||||
Class<?> getCallerCaller();
|
Class<?> getCallerCaller();
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得调用者,指定第几级调用者 调用者层级关系:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* 0 {@link cn.hutool.core.lang.caller.CallerUtil}
|
|
||||||
* 1 调用{@link cn.hutool.core.lang.caller.CallerUtil}中方法的类
|
|
||||||
* 2 调用者的调用者
|
|
||||||
* ...
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @param depth 层级。0表示{@link cn.hutool.core.lang.caller.CallerUtil}本身,1表示调用{@link CallerUtil}的类,2表示调用者的调用者,依次类推
|
|
||||||
* @return 第几级调用者
|
|
||||||
*/
|
|
||||||
Class<?> getCaller(int depth);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否被指定类调用
|
|
||||||
*
|
|
||||||
* @param clazz 调用者类
|
|
||||||
* @return 是否被调用
|
|
||||||
*/
|
|
||||||
boolean isCalledBy(Class<?> clazz);
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package com.aizuda.easy.retry.common.log.lang;
|
package com.aizuda.easy.retry.common.log.lang;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 调用者。可以通过此类的方法获取调用者、多级调用者以及判断是否被调用
|
* 调用者。可以通过此类的方法获取调用者、多级调用者以及判断是否被调用
|
||||||
*
|
*
|
||||||
@ -12,15 +14,6 @@ public class LogCaller {
|
|||||||
INSTANCE = tryCreateCaller();
|
INSTANCE = tryCreateCaller();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得调用者
|
|
||||||
*
|
|
||||||
* @return 调用者
|
|
||||||
*/
|
|
||||||
public static Class<?> getCaller() {
|
|
||||||
return INSTANCE.getCaller();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得调用者的调用者
|
* 获得调用者的调用者
|
||||||
*
|
*
|
||||||
@ -30,51 +23,6 @@ public class LogCaller {
|
|||||||
return INSTANCE.getCallerCaller();
|
return INSTANCE.getCallerCaller();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得调用者,指定第几级调用者<br>
|
|
||||||
* 调用者层级关系:
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* 0 CallerUtil
|
|
||||||
* 1 调用CallerUtil中方法的类
|
|
||||||
* 2 调用者的调用者
|
|
||||||
* ...
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @param depth 层级。0表示CallerUtil本身,1表示调用CallerUtil的类,2表示调用者的调用者,依次类推
|
|
||||||
* @return 第几级调用者
|
|
||||||
*/
|
|
||||||
public static Class<?> getCaller(int depth) {
|
|
||||||
return INSTANCE.getCaller(depth);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否被指定类调用
|
|
||||||
*
|
|
||||||
* @param clazz 调用者类
|
|
||||||
* @return 是否被调用
|
|
||||||
*/
|
|
||||||
public static boolean isCalledBy(Class<?> clazz) {
|
|
||||||
return INSTANCE.isCalledBy(clazz);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取调用此方法的方法名
|
|
||||||
*
|
|
||||||
* @param isFullName 是否返回全名,全名包括方法所在类的全路径名
|
|
||||||
* @return 调用此方法的方法名
|
|
||||||
* @since 5.2.4
|
|
||||||
*/
|
|
||||||
public static String getCallerMethodName(boolean isFullName) {
|
|
||||||
final StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[2];
|
|
||||||
final String methodName = stackTraceElement.getMethodName();
|
|
||||||
if (false == isFullName) {
|
|
||||||
return methodName;
|
|
||||||
}
|
|
||||||
|
|
||||||
return stackTraceElement.getClassName() + "." + methodName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 尝试创建{@link Caller}实现
|
* 尝试创建{@link Caller}实现
|
||||||
*
|
*
|
||||||
@ -84,7 +32,7 @@ public class LogCaller {
|
|||||||
Caller caller;
|
Caller caller;
|
||||||
try {
|
try {
|
||||||
caller = new StackWalkerCaller();
|
caller = new StackWalkerCaller();
|
||||||
if (null != caller.getCaller() && null != caller.getCallerCaller()) {
|
if (Objects.nonNull(caller.getCallerCaller())) {
|
||||||
return caller;
|
return caller;
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
@ -94,5 +42,4 @@ public class LogCaller {
|
|||||||
caller = new StackTraceCaller();
|
caller = new StackTraceCaller();
|
||||||
return caller;
|
return caller;
|
||||||
}
|
}
|
||||||
// ---------------------------------------------------------------------------------------------- static interface and class
|
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package com.aizuda.easy.retry.common.log.lang;
|
|||||||
|
|
||||||
import cn.hutool.core.exceptions.UtilException;
|
import cn.hutool.core.exceptions.UtilException;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -10,23 +11,10 @@ import java.io.Serializable;
|
|||||||
* @author wodeyangzipingpingwuqi
|
* @author wodeyangzipingpingwuqi
|
||||||
*/
|
*/
|
||||||
public class StackTraceCaller implements Caller, Serializable {
|
public class StackTraceCaller implements Caller, Serializable {
|
||||||
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
private static final int OFFSET = 2;
|
private static final int OFFSET = 2;
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<?> getCaller() {
|
|
||||||
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
|
||||||
if (OFFSET + 1 >= stackTrace.length) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
final String className = stackTrace[OFFSET + 1].getClassName();
|
|
||||||
try {
|
|
||||||
return Class.forName(className);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
throw new UtilException(e, "[{}] not found!", className);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<?> getCallerCaller() {
|
public Class<?> getCallerCaller() {
|
||||||
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
||||||
@ -41,28 +29,4 @@ public class StackTraceCaller implements Caller, Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<?> getCaller(int depth) {
|
|
||||||
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
|
||||||
if (OFFSET + depth >= stackTrace.length) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
final String className = stackTrace[OFFSET + depth].getClassName();
|
|
||||||
try {
|
|
||||||
return Class.forName(className);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
throw new UtilException(e, "[{}] not found!", className);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCalledBy(Class<?> clazz) {
|
|
||||||
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
|
|
||||||
for (final StackTraceElement element : stackTrace) {
|
|
||||||
if (element.getClassName().equals(clazz.getName())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package com.aizuda.easy.retry.common.log.lang;
|
|||||||
|
|
||||||
import cn.hutool.core.exceptions.UtilException;
|
import cn.hutool.core.exceptions.UtilException;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@ -12,27 +13,17 @@ import java.util.stream.Stream;
|
|||||||
* @since 2.6.0
|
* @since 2.6.0
|
||||||
*/
|
*/
|
||||||
public class StackWalkerCaller implements Caller, Serializable {
|
public class StackWalkerCaller implements Caller, Serializable {
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@Override
|
private static final int OFFSET = 2;
|
||||||
public Class<?> getCaller() {
|
|
||||||
StackWalker instance = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);
|
|
||||||
StackWalker.StackFrame walk = (StackWalker.StackFrame) instance
|
|
||||||
.walk((Function<Stream<StackWalker.StackFrame>, Object>) stackFrameStream ->
|
|
||||||
stackFrameStream.skip(2).findFirst().get());
|
|
||||||
try {
|
|
||||||
return Class.forName(walk.getClassName());
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
throw new UtilException(e, "[{}] not found!", walk.getClassName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<?> getCallerCaller() {
|
public Class<?> getCallerCaller() {
|
||||||
|
|
||||||
StackWalker instance = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);
|
StackWalker instance = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);
|
||||||
StackWalker.StackFrame walk = (StackWalker.StackFrame) instance
|
StackWalker.StackFrame walk = (StackWalker.StackFrame) instance
|
||||||
.walk((Function<Stream<StackWalker.StackFrame>, Object>) stackFrameStream ->
|
.walk((Function<Stream<StackWalker.StackFrame>, Object>) stackFrameStream ->
|
||||||
stackFrameStream.skip(3).findFirst().get());
|
stackFrameStream.skip(OFFSET + 1).findFirst().get());
|
||||||
try {
|
try {
|
||||||
return Class.forName(walk.getClassName());
|
return Class.forName(walk.getClassName());
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
@ -40,13 +31,4 @@ public class StackWalkerCaller implements Caller, Serializable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<?> getCaller(int depth) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCalledBy(Class<?> clazz) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.aizuda.easy.retry.server.web.controller;
|
||||||
|
|
||||||
|
import com.aizuda.easy.retry.server.web.service.WorkflowNodeService;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xiaowoniu
|
||||||
|
* @date 2023-12-23 17:47:51
|
||||||
|
* @since 2.6.0
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/workflow/node")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class WorkflowNodeController {
|
||||||
|
private final WorkflowNodeService workflowNodeService;
|
||||||
|
|
||||||
|
@PostMapping("/stop/{id}")
|
||||||
|
public Boolean stop(@PathVariable("id") Long id) {
|
||||||
|
return workflowNodeService.stop(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/retry/{id}")
|
||||||
|
public Boolean retry(@PathVariable("id") Long id) {
|
||||||
|
return workflowNodeService.retry(id);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.aizuda.easy.retry.server.web.service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xiaowoniu
|
||||||
|
* @date 2024-02-03 21:24:52
|
||||||
|
* @since 2.6.0
|
||||||
|
*/
|
||||||
|
public interface WorkflowNodeService {
|
||||||
|
Boolean stop(Long id);
|
||||||
|
|
||||||
|
Boolean retry(Long id);
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.aizuda.easy.retry.server.web.service.impl;
|
||||||
|
|
||||||
|
import com.aizuda.easy.retry.server.web.service.WorkflowNodeService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xiaowoniu
|
||||||
|
* @date 2024-02-03 21:25:00
|
||||||
|
* @since 2.6.0
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class WorkflowNodeServiceImpl implements WorkflowNodeService {
|
||||||
|
@Override
|
||||||
|
public Boolean stop(Long id) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean retry(Long id) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user