feat: 3.1.0

1. 新增任务节点手动停止、重试接口
This commit is contained in:
byteblogs168 2024-02-03 22:19:25 +08:00
parent 5e27915052
commit 83af125978
7 changed files with 74 additions and 147 deletions

View File

@ -1,7 +1,5 @@
package com.aizuda.easy.retry.common.log.lang;
import cn.hutool.core.lang.caller.CallerUtil;
/**
* 调用者接口<br>
* 可以通过此接口的实现类方法获取调用者多级调用者以及判断是否被调用
@ -10,12 +8,6 @@ import cn.hutool.core.lang.caller.CallerUtil;
*
*/
public interface Caller {
/**
* 获得调用者
*
* @return 调用者
*/
Class<?> getCaller();
/**
* 获得调用者的调用者
@ -24,26 +16,4 @@ public interface Caller {
*/
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);
}

View File

@ -1,5 +1,7 @@
package com.aizuda.easy.retry.common.log.lang;
import java.util.Objects;
/**
* 调用者可以通过此类的方法获取调用者多级调用者以及判断是否被调用
*
@ -12,15 +14,6 @@ public class LogCaller {
INSTANCE = tryCreateCaller();
}
/**
* 获得调用者
*
* @return 调用者
*/
public static Class<?> getCaller() {
return INSTANCE.getCaller();
}
/**
* 获得调用者的调用者
*
@ -30,51 +23,6 @@ public class LogCaller {
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}实现
*
@ -84,7 +32,7 @@ public class LogCaller {
Caller caller;
try {
caller = new StackWalkerCaller();
if (null != caller.getCaller() && null != caller.getCallerCaller()) {
if (Objects.nonNull(caller.getCallerCaller())) {
return caller;
}
} catch (Throwable e) {
@ -94,5 +42,4 @@ public class LogCaller {
caller = new StackTraceCaller();
return caller;
}
// ---------------------------------------------------------------------------------------------- static interface and class
}

View File

@ -2,6 +2,7 @@ package com.aizuda.easy.retry.common.log.lang;
import cn.hutool.core.exceptions.UtilException;
import java.io.Serial;
import java.io.Serializable;
/**
@ -10,23 +11,10 @@ import java.io.Serializable;
* @author wodeyangzipingpingwuqi
*/
public class StackTraceCaller implements Caller, Serializable {
@Serial
private static final long serialVersionUID = 1L;
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
public Class<?> getCallerCaller() {
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;
}
}

View File

@ -2,6 +2,7 @@ package com.aizuda.easy.retry.common.log.lang;
import cn.hutool.core.exceptions.UtilException;
import java.io.Serial;
import java.io.Serializable;
import java.util.function.Function;
import java.util.stream.Stream;
@ -12,27 +13,17 @@ import java.util.stream.Stream;
* @since 2.6.0
*/
public class StackWalkerCaller implements Caller, Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Override
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());
}
}
private static final int OFFSET = 2;
@Override
public Class<?> getCallerCaller() {
StackWalker instance = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);
StackWalker.StackFrame walk = (StackWalker.StackFrame) instance
.walk((Function<Stream<StackWalker.StackFrame>, Object>) stackFrameStream ->
stackFrameStream.skip(3).findFirst().get());
stackFrameStream.skip(OFFSET + 1).findFirst().get());
try {
return Class.forName(walk.getClassName());
} 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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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;
}
}