update(REQ-2516) - 对 Starter 中的门面 API 进行技术推演
This commit is contained in:
parent
2c20b69cb9
commit
0744014f64
5
pom.xml
5
pom.xml
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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 事件生产者
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -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}";
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -14,6 +14,4 @@ public interface ProcessInstanceListener extends ProcessListener {
|
||||
|
||||
void deleted();
|
||||
|
||||
void created();
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
Reference in New Issue
Block a user