Git Product home page Git Product logo

smartengine's People

Contributors

cgfalcon avatar coyote-wang avatar dependabot[bot] avatar jannlim avatar joshuajeme avatar likaer avatar styletang avatar tigerwingxys avatar vavi avatar yfcchilly avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

smartengine's Issues

考虑未来加入历史记录表吗?

考虑未来加入历史记录表吗?
随着流程的增加,表中的数据会越来越多
考虑把已完结的流程存入历史记录表来减轻审批中数据表的压力吗?

smart-engine-core 3.0.0 并行网关异常处理

并行网关执行的时候,默认使用便利模式; 当实现了ExecutorService后, 使用并行模式这里看代码是
在 ParalleGatewayBehiavior 中的处理

executorService.invokeAll(tasks);

执行的所有并行callable, 这里好像没有异常处理呢, 当某一个并行线程抛出异常的时候, 这里就把异常吃掉了整个流程不报错; 我理解这里应该可以定制线程中抛出异常中断流程或者继续执行呢, 这个部分是怎么考虑的呢

启动流程时加锁的锁关键字问题

1.流程启动DefaultProcessCommandService.start方法中,业务加锁,此处新增流程实例,然后根据流程实例id加锁,那么不是相同的业务在并发的场景下还是会创建出2个流程实例,这个地方的锁似乎是没有用的。

private void tryInsertProcessInstanceIfNeedLock(ProcessEngineConfiguration processEngineConfiguration,
                                                    ProcessInstance processInstance) {
        LockStrategy lockStrategy = processEngineConfiguration.getLockStrategy();
        if(null != lockStrategy){


            ProcessInstance newProcessInstance =  processInstanceStorage.insert(processInstance, processEngineConfiguration);

            lockStrategy.tryLock(newProcessInstance.getInstanceId());
        }
    }

2.在子流程创建的时候,如果加了锁策略,会导致子流程实例无法创建,代码跑到update方法中去了。

public static ProcessInstance insertAndPersist(ProcessInstance processInstance, Map<String, Object> request,
                                                   ProcessEngineConfiguration processEngineConfiguration) {
        ProcessInstance newProcessInstance ;
        //TUNE 可以在对象创建时初始化,但是这里依赖稍微有点问题
        AnnotationScanner annotationScanner = processEngineConfiguration.getAnnotationScanner();
        ProcessInstanceStorage processInstanceStorage = annotationScanner.getExtensionPoint(
            ExtensionConstant.COMMON,ProcessInstanceStorage.class);
        LockStrategy lockStrategy = processEngineConfiguration.getLockStrategy();
        if(null != lockStrategy){
            newProcessInstance =  processInstanceStorage.update(processInstance, processEngineConfiguration);
        }else{
             newProcessInstance =  processInstanceStorage.insert(processInstance, processEngineConfiguration);
        }
        persisteVariableInstanceIfPossible(request, processEngineConfiguration,
            newProcessInstance, AdHocConstant.DEFAULT_ZERO_VALUE);
        persist(newProcessInstance,processEngineConfiguration);
        return newProcessInstance;
    }

有配套的modeler设计器或idea插件么

bpmn和标准的语法还是有差异。请问有配套的设计器和idea插件么,开发起来感觉没有那么习惯。

另外提个小意见,如果流程定义,持久化在远端存储里,在应用端采用custom来跑。两个extension使用起来,都比较费劲:
1)应用端,集成client和custom扩展包,但是需要从远端加载流程定义,并deploy到本地,需要自己实现storage和dao层
2)管理端,只需要deploy流程定义到远程存储,只能使用mysql扩展,但是facade没有只deploy远端的接口。只能直接从dao层开始自己包装。

关于参数传递的问题。

好像不支持显示支持方法调用和参数传递。
<serviceTask id="executeTask" name="ExecuteTask" smart:class="com.alibaba.simplest.bpm.util.AuditProcessServiceTaskDelegation"> </serviceTask>

这个里边能传递参数么例如
<serviceTask id="executeTask" name="ExecuteTask" smart:class="springBean.method(param1,param2)"> </serviceTask>

如果要实现这个需要怎么扩展呢, 能一些思路么。

显示的调用方法,开发同学看起来更直观, 不然针对每个任务都需要写个代理类

并行网关Session的NPE问题

custom模式,并行网关在执行的时候有一个NPE的bug,线程池在复用的时候,多次运行同一个process,会出现一个奇怪的现象:

  1. 首次运行CustomExecutionInstanceStorage都可以拿到currentSession
  2. 多次运行,线程池都是复用的情况下,开始出现NPE。
  3. 增大线程池后,NPE首次出现的时机延缓。差不多都是复用的线程后,最终还是出现NPE

初步怀疑InheritableThreadLocal,线程池中ThreadLocal变量拷贝有点问题。docs中注释有声明只要在子线程创建的时候,才会拷贝线程变量。

Inheritable thread-local variables are used in preference to ordinary thread-local variables when the per-thread-attribute being maintained in the variable (e.g., User ID, Transaction ID) must be automatically transmitted to any child threads that are created

以下是堆栈内容

java.lang.NullPointerException: null at com.alibaba.smart.framework.engine.persister.custom.CustomExecutionInstanceStorage.findActiveExecution(CustomExecutionInstanceStorage.java:95) at com.alibaba.smart.framework.engine.bpmn.behavior.gateway.ParallelGatewayBehavior.enter(ParallelGatewayBehavior.java:107) at com.alibaba.smart.framework.engine.pvm.impl.DefaultPvmActivity.enter(DefaultPvmActivity.java:32) at com.alibaba.smart.framework.engine.behavior.base.AbstractActivityBehavior.leave(AbstractActivityBehavior.java:127) at com.alibaba.smart.framework.engine.pvm.impl.DefaultPvmActivity.execute(DefaultPvmActivity.java:86) at com.alibaba.smart.framework.engine.pvm.impl.DefaultPvmActivity.enter(DefaultPvmActivity.java:43) at com.alibaba.smart.framework.engine.bpmn.behavior.gateway.ParallelGatewayBehavior$PvmActivityTask.call(ParallelGatewayBehavior.java:183) at com.alibaba.smart.framework.engine.bpmn.behavior.gateway.ParallelGatewayBehavior$PvmActivityTask.call(ParallelGatewayBehavior.java:171) at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) at java.util.concurrent.FutureTask.run(FutureTask.java) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)

另外两个bug上报下,下面是修改后的diff

  1. InstanceUtil的NPE
  2. 多线程导致的list迭代异常ConcurrentModificationException

mr.log

java.lang.NumberFormatException: For input string: "0dac1945-c1c6-4dec-b175-b5871d153da7"

ExecutionInstanceEntity executionInstanceEntity = new ExecutionInstanceEntity();
executionInstanceEntity.setId(Long.valueOf(executionInstance.getInstanceId()));

java.lang.NumberFormatException: For input string: "0dac1945-c1c6-4dec-b175-b5871d153da7"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:589)
at java.lang.Long.valueOf(Long.java:803)
at com.alibaba.smart.framework.engine.persister.database.service.RelationshipDatabaseExecutionInstanceStorage.buildExecutionInstanceEntity(RelationshipDatabaseExecutionInstanceStorage.java:49)

申请打个最新的包

目前2.5.7.2的版本不支持流程结束事件,看了源码,源码已经修复了,麻烦打个新的jar包。谢谢

同学,您这个项目引入了161个开源组件,存在7个漏洞,辛苦升级一下

检测到 alibaba/SmartEngine 一共引入了161个开源组件,存在7个漏洞

漏洞标题:Fastjson 1.2.25-1.2.47版本远程代码执行漏洞
缺陷组件:com.alibaba:[email protected]
漏洞编号:
漏洞描述:Fastjson 是Java语言实现的快速JSON解析和生成器,在1.2.25-1.2.47版本中攻击者可通过精心构造的JSON请求,绕过此前修复机制,远程执行任意代码。
漏洞原因:
攻击者可通过白名单类java.lang.Class绕过checkAutotype方法,利用fastjson的cache机制引入恶意类,并调用连接远程rmi主机,通过其中的恶意类执行代码。
影响范围:[1.2.25, 1.2.48)
最小修复版本:1.2.48
缺陷组件引入路径:com.alibaba.smart.framework:[email protected]>com.alibaba:[email protected]

另外还有7个漏洞,详细报告:https://mofeisec.com/jr?p=a692b9

smart-engine-core 3.0.0 并行网关异常处理

并行网关执行的时候,默认使用便利模式; 当实现了ExecutorService后, 使用并行模式这里看代码是
在 ParalleGatewayBehiavior 中的处理

executorService.invokeAll(tasks);

执行的所有并行callable, 这里好像没有异常处理呢, 当某一个并行线程抛出异常的时候, 这里就把异常吃掉了整个流程不报错; 我理解这里应该可以定制线程中抛出异常中断流程或者继续执行呢, 这个部分是怎么考虑的呢

对于持久化工作流模式业务逻辑发生exception的处理想法

现在看到SM的主要推进一个process运行的入口主要是start和signal,分别是流程的开始,和暂停之后的恢复运行
在典型的需要持久化的场景下,很可能运行时的节点内业务逻辑会发生exception,这种情况SM本身没有做任何的异常处理,也没有catch,直接会导致整个流程运行直接报错抛出exception,所有运行完的流程节点不会完成持久化信息全部丢失,这块方面想做一些贡献,请问下作者,有无这方面的考虑或者是方向?

ps:调研了集中节点内异常处理的方式
image
image

custom 模式和 database 模式可以同时存在吗?应该怎么配置?

目前引入两个包,就会冲突报错,找到了两个 ExecutionInstanceStorage

Failed to instantiate [com.alibaba.smart.framework.engine.SmartEngine]: Factory method 'constructSmartEngine' threw exception; nested exception is com.alibaba.smart.framework.engine.exception.EngineException: Duplicated bindKeyClass found interface com.alibaba.smart.framework.engine.instance.storage.ExecutionInstanceStorage for group common, because of duplicated annotation or init twice.

2.2.3.2版本InstanceAccessor实现类必须实现spring托管bean的疑问

看了2.2.3.2版本的更新内容,storage-mysql和storage-mongodb中都取消了对spring的依赖,但是却利用InstanceAccessor的实现类来实现spring容器中对象的获取,这样就规定了InstanceAccessor的实现类必须能从spring中获取对象,同时storage-mysql也是基于mybatis来进行数据的持久化。所以想请问一下,未来有将这块数据持久化相关内容完全脱离spring和mybatis的规划吗?

并行问题

@Override
public void enter(ExecutionContext context) {


    ActivityBehavior behavior = this.getBehavior();
    boolean needPause= behavior.enter(context, this);

    fireEvent(context,PvmEventConstant.ACTIVITY_START.name());


    if (needPause) {

        // break;
        return;
    }

    this.execute(context);
}

这里要不做个特判?behavior instanceof ParallelGatewayBehavior 则进行一些并行特殊处理,现在有npe问题,后面this.execute(context);也很奇怪

使用问题

有没有稳定的版本可以用于生产使用?有没有搭配的流程配置页面?

示例太少

目前项目示例太少,希望能多增加些示例,提供与springboot整合jar包。

DefaultDeploymentCommandService#updateDeployment does not update version column of se_deployment_instance

DeploymentInstance creation use version parsed from processDefinitionContent
com.alibaba.smart.framework.engine.service.command.impl.DefaultDeploymentCommandService#createDeployment .

But while updating DeploymentInstance, it ignored the version from processDefinitionContent, which break the consistency of version column of se_deployment_instance and the version in process_definition_content.

并行节点执行问题

并行节点执行时,ExecutionContext对象是共用的,executionContext.getActivityInstance()值会混乱

2.1.5版本并发网关上下文传递失败

通过设置添加ExecutorService的方式使用并行网关时,PersisterSession在主线程与线程池之间传递时偶发传递失败,出现NPE;
com.alibaba.smart.framework.engine.persister.custom.CustomExecutionInstanceStorage#findActiveExecution
ProcessInstance processInstance = PersisterSession.currentSession().getProcessInstance(processInstanceId);
其中PersisterSession.currentSession()返回null 导致NPE;
经检查发现PersisterSession.sessionThreadLocal 用的是InheritableThreadLocal, 在使用线程池时这个类是会出问题的, 建议改成transmittable-thread-local试一下;

有未来的演进路线图嘛?

仔细阅读了一下,感觉挺不错,但有几点疑虑
1、文档太少,都2.0版本了,没有案例,没有starter,没有sample,对于我们团队来说,社区支持还是很重要的;
2、有未来的技术或者版本推进路线图嘛,也好团队评估使用的前景如何
3、建议文档中,多增加点场景,例如,节点权限集成等内容

并行节点执行问题

并行节点执行时,ExecutionContext对象是共用的,executionContext.getActivityInstance()值会混乱

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.