Java 實(shí)現(xiàn)簡(jiǎn)單工作流

工作流主要運(yùn)用到反射機(jī)制

  1. 創(chuàng)建一張工作流表
    如:主鍵 | 工作流Code | 工作流內(nèi)容

其中工作流,內(nèi)容為Json格式

  1. 工作流內(nèi)容如下
{
  "procCode": "OPS",
  "procName": "c端補(bǔ)齊(乘客信息補(bǔ)全)",
  "taskControlVoList": [
    {
      "sortNo": "10",
      "taskCode": "OPC",
      "taskName": "檢查對(duì)應(yīng)的訂單信息是否存在",
      "tasklassName": "com.xf.flow.service.impl.OrderPeople10ServImpl"
    },
    {
      "sortNo": "20",
      "taskCode": "OPD",
      "taskName": "乘客數(shù)據(jù)庫(kù)落庫(kù)",
      "tasklassName": "com.xf.flow.service.impl.OrderPeople20ServImpl"
    },
    {
      "sortNo": "90",
      "taskCode": "RSP",
      "taskName": "響應(yīng)消息",
      "tasklassName": "com.xf.flow.service.impl.ApiResponseServImpl"
    }
  ]
}

3.java代碼現(xiàn)根據(jù)工作流的Code 獲取當(dāng)前的工作流
4.jsonStr ————>JsonObject————>獲取taskControlVoList
5.java的工作流代碼

 @Override
    public ApiResponse deal(String itemNo, Object objVo, String skey, InnerVo innerVo) {

        ApiResponse apiResponse = new ApiResponse();
        //查詢itemNo獲取流程實(shí)例
        ProcControlVo procControlVo = codeLibraryDao.queryProcConfig(itemNo);
        if (procControlVo == null) {
            return new ApiResponse(ResponseCodeEnums.stream_no_exist);
        }
        List<TaskControlVo>  taskControlVoList = procControlVo.getTaskControlVoList();
        taskControlVoList.sort((TaskControlVo h1, TaskControlVo h2) -> h1.getSortNo().compareTo(h2.getSortNo()));
        Iterator<TaskControlVo> itTask = taskControlVoList.iterator();

        //初始化內(nèi)部數(shù)據(jù)表
        String dataNo = taskManagerServ.initData(itemNo,skey,innerVo);

        //循環(huán)依次執(zhí)行流程任務(wù)
        String taskNo = null;
        while (itTask.hasNext()){
            TaskControlVo taskControlVo = itTask.next();
            String taskClassName = taskControlVo.getTasklassName();
            String taskItemNo = taskControlVo.getTaskCode();
            String taskName = taskControlVo.getTaskName();
            try {

                //初始化任務(wù)
                taskNo = taskManagerServ.initTask(taskItemNo,dataNo,innerVo);

                //執(zhí)行任務(wù)
                TaskServ taskServ = (TaskServ) SpringFactory.getBean(Class.forName(taskClassName));
                taskServ.init(taskNo,objVo);
                TaskAnswerVo taskAnwserVo = taskServ.deal(taskNo,objVo);

                //判斷任務(wù)執(zhí)行結(jié)果
                apiResponse = taskAnwserVo.getApiResponse();
                if(StringUtils.equals(ResponseCodeEnums.success.getStatus(),apiResponse.getStatus())) {
                    //完成任務(wù)
                    logger.info("==========>>>>> task execute success !!! taskCode={}, taskName={}, status={}, msg={}, nextTask={}",
                            taskItemNo,taskName,apiResponse.getStatus(),apiResponse.getMessage(),taskAnwserVo.isNextTask());
                    taskManagerServ.finTask(taskNo, apiResponse.getMessage());
                }else {
                    //異常任務(wù)
                    logger.info("==========>>>>> task execute error !!! taskCode={}, taskName={}, status={}, msg={}, nextTask={}",
                            taskItemNo,taskName,apiResponse.getStatus(),apiResponse.getMessage(),taskAnwserVo.isNextTask());
                    taskManagerServ.errTask(taskNo, apiResponse.getMessage());
                }

                //判斷流程是否繼續(xù)
                if(!taskAnwserVo.isNextTask()){
                    break;
                }
            } catch (Exception e) {
                //異常任務(wù)
                String errorMsg = getStackTrace(e);
                taskManagerServ.errTask(taskNo, errorMsg);
                logger.error("==========>>>>> Execute Task Error!!! skey={}, taskControlVo={}, errorMsg={}",skey,taskControlVo,errorMsg);
                //響應(yīng)異常
                return new ApiResponse(ResponseCodeEnums.flow_error);
            }
        }
        if(StringUtils.equals(ResponseCodeEnums.success.getStatus(),apiResponse.getStatus())) {
            //歸檔完成流程
            taskManagerServ.finData(dataNo);
        }
        return apiResponse;
    }
image.png

SpringFactory實(shí)現(xiàn)類

/**
 * Created by
 */
@Component
public class SpringFactory implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(SpringFactory.applicationContext == null) {
            SpringFactory.applicationContext = applicationContext;
        }
    }

    //獲取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    //通過name獲取 Bean.
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    //通過class獲取Bean.
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }

    //通過name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秤标,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炉抒,老刑警劉巖球拦,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隐圾,死亡現(xiàn)場(chǎng)離奇詭異望几,居然都是意外死亡绩脆,警方通過查閱死者的電腦和手機(jī)萤厅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門橄抹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)靴迫,“玉大人,你說我怎么就攤上這事楼誓∮裥浚” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵疟羹,是天一觀的道長(zhǎng)主守。 經(jīng)常有香客問我,道長(zhǎng)榄融,這世上最難降的妖魔是什么参淫? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮愧杯,結(jié)果婚禮上涎才,老公的妹妹穿的比我還像新娘。我一直安慰自己力九,他們只是感情好耍铜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跌前,像睡著了一般棕兼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抵乓,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天伴挚,我揣著相機(jī)與錄音,去河邊找鬼灾炭。 笑死章鲤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咆贬。 我是一名探鬼主播败徊,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掏缎!你這毒婦竟也來(lái)了皱蹦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤眷蜈,失蹤者是張志新(化名)和其女友劉穎沪哺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酌儒,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辜妓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籍滴。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酪夷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孽惰,到底是詐尸還是另有隱情晚岭,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布勋功,位于F島的核電站坦报,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏狂鞋。R本人自食惡果不足惜片择,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骚揍。 院中可真熱鬧构回,春花似錦、人聲如沸疏咐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浑塞。三九已至借跪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酌壕,已是汗流浹背掏愁。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卵牍,地道東北人果港。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像糊昙,于是被迫代替她去往敵國(guó)和親辛掠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353