update(REQ-2516) - 对 Starter 中的门面 API 进行技术推演

This commit is contained in:
wangli 2024-05-28 16:59:38 +08:00
parent 2c20b69cb9
commit 0744014f64
9 changed files with 188 additions and 10 deletions

View File

@ -69,6 +69,11 @@
<artifactId>workflow-engine-server</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.workflow</groupId>
<artifactId>workflow-engine-spring-boot-starter</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.axzo.maokai</groupId>
<artifactId>maokai-api</artifactId>

View File

@ -21,6 +21,10 @@
<redisson.version>3.25.0</redisson.version>
</properties>
<dependencies>
<dependency>
<groupId>cn.axzo.workflow</groupId>
<artifactId>workflow-engine-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>cn.axzo.framework</groupId>
<artifactId>axzo-web-spring-boot-starter</artifactId>

View File

@ -6,10 +6,13 @@ import cn.axzo.framework.rocketmq.EventConsumer;
import cn.axzo.framework.rocketmq.EventHandlerRepository;
import cn.axzo.framework.rocketmq.EventProducer;
import cn.axzo.framework.rocketmq.RocketMQEventProducer;
import cn.axzo.workflow.starter.common.annotation.EnableWorkflowClient;
import cn.axzo.workflow.starter.invoke.ComplexInvokeClient;
import cn.axzo.workflow.starter.mq.broadcast.consumer.WorkflowEngineBroadcastEventListener;
import cn.axzo.workflow.starter.mq.retry.consumer.WorkflowEngineClientRetryEventListener;
import cn.axzo.workflow.starter.mq.retry.producer.RpcInvokeEventProducer;
import cn.axzo.workflow.starter.service.WorkflowEngineServiceFacade;
import feign.Client;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
@ -37,6 +40,7 @@ import java.util.function.Consumer;
*/
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(WorkflowEngineProperties.class)
@EnableWorkflowClient
public class WorkflowEngineAutoConfiguration {
private final Logger log = LoggerFactory.getLogger(WorkflowEngineAutoConfiguration.class);
@ -55,6 +59,10 @@ public class WorkflowEngineAutoConfiguration {
return new WorkflowEngineServiceFacade(workflowEngineClientEventProducer, workflowEngineProperties);
}
@Bean
public Client ComplexInvokeClient() {
return new ComplexInvokeClient();
}
/**
* 客户端 RPC Retry 事件生产者

View File

@ -0,0 +1,14 @@
package cn.axzo.workflow.starter.api;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
/**
* 模拟生成的受限访问的接口定义
*
* @author wangli
* @since 2024/5/28 16:12
*/
public interface WorkflowCoreService {
String createProcessInstance(BpmnProcessInstanceCreateDTO dto);
}

View File

@ -0,0 +1,29 @@
package cn.axzo.workflow.starter.common.annotation;
import cn.axzo.workflow.starter.invoke.WorkflowEngineClientRegistrar;
import org.springframework.context.annotation.Import;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* TODO
*
* @author wangli
* @since 2024/5/28 16:27
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(WorkflowEngineClientRegistrar.class)
public @interface EnableWorkflowClient {
String[] basePackages() default {"cn.axzo.workflow.starter.api"};
String name() default "workflow-engine-client";
String url() default "${axzo.service.workflow-engine:workflow-engine:8080}";
}

View File

@ -0,0 +1,26 @@
package cn.axzo.workflow.starter.invoke;
import feign.Client;
import feign.Request;
import feign.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
/**
* TODO
*
* @author wangli
* @since 2024/5/28 15:23
*/
public class ComplexInvokeClient implements Client {
private final Logger log = LoggerFactory.getLogger(ComplexInvokeClient.class);
@Override
public Response execute(Request request, Request.Options options) throws IOException {
log.info("ComplexInvokeClient execute");
return null;
}
}

View File

@ -0,0 +1,100 @@
package cn.axzo.workflow.starter.invoke;
import cn.axzo.workflow.starter.common.annotation.EnableWorkflowClient;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
/**
* TODO
*
* @author wangli
* @since 2024/5/28 16:18
*/
public class WorkflowEngineClientRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware {
private ResourceLoader resourceLoader;
private Environment environment;
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
LinkedHashSet<BeanDefinition> candidateComponents = new LinkedHashSet<>();
ClassPathScanningCandidateComponentProvider scanner = getScanner();
scanner.setResourceLoader(this.resourceLoader);
Set<String> basePackages = getBasePackages(metadata);
for (String basePackage : basePackages) {
candidateComponents.addAll(scanner.findCandidateComponents(basePackage));
}
for (BeanDefinition candidateComponent : candidateComponents) {
if (candidateComponent instanceof AnnotatedBeanDefinition) {
AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;
AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
Assert.isTrue(annotationMetadata.isInterface(), "@FeignClient can only be specified on an interface");
Map<String, Object> attributes = new HashMap<>();
registerWorkflowEngineClient(registry, annotationMetadata, attributes);
}
}
}
private void registerWorkflowEngineClient(BeanDefinitionRegistry registry, AnnotationMetadata annotationMetadata, Map<String, Object> attributes) {
}
protected ClassPathScanningCandidateComponentProvider getScanner() {
return new ClassPathScanningCandidateComponentProvider(false, this.environment) {
@Override
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
boolean isCandidate = false;
if (beanDefinition.getMetadata().isIndependent()) {
if (!beanDefinition.getMetadata().isAnnotation()) {
isCandidate = true;
}
}
return isCandidate;
}
};
}
protected Set<String> getBasePackages(AnnotationMetadata metadata) {
Map<String, Object> attributes = metadata.getAnnotationAttributes(EnableWorkflowClient.class.getCanonicalName());
Set<String> basePackages = new HashSet<>();
for (String pkg : (String[]) attributes.get("basePackages")) {
if (StringUtils.hasText(pkg)) {
basePackages.add(pkg);
}
}
return basePackages;
}
}

View File

@ -14,6 +14,4 @@ public interface ProcessInstanceListener extends ProcessListener {
void deleted();
void created();
}

View File

@ -7,8 +7,6 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCre
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
import cn.axzo.workflow.starter.WorkflowEngineProperties;
import cn.axzo.workflow.starter.common.exception.CreateProcessInstanceException;
import cn.axzo.workflow.starter.service.impl.AsynchronousService;
import cn.axzo.workflow.starter.service.impl.SynchronousService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -24,15 +22,11 @@ import java.util.Map;
public class WorkflowEngineServiceFacade {
private final Logger log = LoggerFactory.getLogger(WorkflowEngineServiceFacade.class);
private final EventProducer workflowEngineClientEventProducer;
private final AsynchronousService asynchronousService;
private final SynchronousService synchronousService;
private final WorkflowEngineProperties workflowEngineProperties;
public WorkflowEngineServiceFacade(EventProducer workflowEngineClientEventProducer, AsynchronousService asynchronousService, SynchronousService synchronousService,
public WorkflowEngineServiceFacade(EventProducer workflowEngineClientEventProducer,
WorkflowEngineProperties workflowEngineProperties) {
this.workflowEngineClientEventProducer = workflowEngineClientEventProducer;
this.asynchronousService = asynchronousService;
this.synchronousService = synchronousService;
this.workflowEngineProperties = workflowEngineProperties;
}
@ -46,7 +40,7 @@ public class WorkflowEngineServiceFacade {
* @throws {@link CreateProcessInstanceException} 创建流程实例失败时抛出异常
*/
public String createProcessInstanceSync(BpmnProcessInstanceCreateDTO dto) {
return synchronousService.createProcessInstance(dto);
return null;
}
/**