成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

spring statemachine的企業(yè)可用級開發(fā)指南5-傳遞參數(shù)的message

YacaToy / 476人閱讀

摘要:創(chuàng)建了后,狀態(tài)機就可以不只是傳一個,可以組合和數(shù)據(jù)內(nèi)容一起發(fā)送給狀態(tài)機變化的處理類了。到這里為止,狀態(tài)機通過對象就和其他的業(yè)務代碼做到了數(shù)據(jù)連接。

在企業(yè)開發(fā)中,數(shù)據(jù)在不同的業(yè)務間傳輸是最常見的工作,所以雖然我們的主架構(gòu)是用的狀態(tài)機,也就是從流程狀態(tài)的角度來看待這個項目,但在具體業(yè)務中,每個狀態(tài)的轉(zhuǎn)變中會牽涉到各類業(yè)務,這些業(yè)務有些需要收到狀態(tài)機變化的通知,需要把狀態(tài)值傳遞給業(yè)務類和業(yè)務方法,同樣的,在處理狀態(tài)變化是,也需要獲取業(yè)務數(shù)據(jù),方便不同的業(yè)務在同一個狀態(tài)變化環(huán)節(jié)做各自的業(yè)務,下面我們就講下這個數(shù)據(jù)在spring statemachine里面的傳遞。

這次我們的順序變一下,由外部傳入一個訂單號到controller開始:

@RequestMapping("/testOrderState")

public void testOrderState(String orderId) throws Exception {

    StateMachine stateMachine = orderStateMachineBuilder.build(beanFactory);
    System.out.println(stateMachine.getId());

    // 創(chuàng)建流程
    stateMachine.start();

    // 觸發(fā)PAY事件
    stateMachine.sendEvent(OrderEvents.PAY);

    // 觸發(fā)RECEIVE事件
    Order order = new Order(orderId, "547568678", "廣東省深圳市", "13435465465", "RECEIVE");
    Message message = MessageBuilder.withPayload(OrderEvents.RECEIVE).setHeader("order", order).build();
    stateMachine.sendEvent(message);

    // 獲取最終狀態(tài)
    System.out.println("最終狀態(tài):" + stateMachine.getState().getId());
}

controller收到request請求的參數(shù),orderId,然后狀態(tài)機依次觸發(fā)事件,到觸發(fā)RECEIVE事件的時候,我們新建了一個Order,并把orderId塞進去了,其實更多的情況應該是我們拿到orderId,然后查詢數(shù)據(jù)庫,得到order數(shù)據(jù)對象,這里為了簡化代碼,就新建一個啦。

然后就是真正的主角登場了,Message。它其實不是spirng statemachine專屬的,它是spring里面通用的一種消息工具,看它的源代碼:

package org.springframework.messaging;

public interface Message {

/**
 * Return the message payload.
 */
T getPayload();

/**
 * Return message headers for the message (never {@code null} but may be empty).
 */
MessageHeaders getHeaders();

}
它由兩個部分組成,看圖就知道了,和代碼里面是一致的

在spring statemachine里面,我們把狀態(tài)塞到message的payload里面,然后把需要傳遞的業(yè)務數(shù)據(jù)(例子里面就是order對象)塞到header里面。創(chuàng)建message用的是messagebuilder,看它的名字就知道是專門創(chuàng)建message的。

Message message = MessageBuilder.withPayload(OrderEvents.RECEIVE).setHeader("order", order).build();

    stateMachine.sendEvent(message);

創(chuàng)建了message后,狀態(tài)機sendEvent就可以不只是傳一個event,可以組合event(OrderEvents.RECEIVE)和數(shù)據(jù)內(nèi)容(order)一起發(fā)送給狀態(tài)機變化的處理類eventconfig了。讓我們看eventConfig的處理:

/**

 * WAITING_FOR_RECEIVE->DONE 執(zhí)行的動作
 */
@OnTransition(source = "WAITING_FOR_RECEIVE", target = "DONE")
public void receive(Message message) {
    System.out.println("傳遞的參數(shù):" + message.getHeaders().get("order"));
    logger.info("---用戶已收貨,訂單完成---");
}

首先,receive方法的參數(shù)由之前的為空:

public void receive() {

    logger.info("---用戶已收貨,訂單完成---");

}
改成了Message message,這樣就能從message的getHeaders里面取到傳遞過來的數(shù)據(jù)對象了。

另外如果我們需要傳遞多個數(shù)據(jù)對象怎么辦呢,比如我們在實際業(yè)務中,除了傳訂單數(shù)據(jù),可能還需要把商品數(shù)據(jù),或者支付結(jié)果數(shù)據(jù)也傳過來,那么也容易,我們還是從controller里面開始:

Message message = MessageBuilder.withPayload(OrderEvents.RECEIVE).setHeader("order", order).setHeader("otherobj", "otherobjvalue").build();
在后面繼續(xù)setHeader就好了,然后到eventConfig里面:

System.out.println("傳遞的參數(shù):" + message.getHeaders().get("order"));
System.out.println("傳遞的參數(shù):" + message.getHeaders().get("otherObj"));
運行后看日志:

傳遞的參數(shù):Order [id=null, userId=547568678, address=廣東省深圳市, phoneNum=13435465465, state=RECEIVE]
傳遞的參數(shù):otherObjValue
可知兩個的數(shù)據(jù)都傳遞到了eventConfig里面了,這個就實現(xiàn)了多個數(shù)據(jù)對象的同時傳遞。

到這里為止,狀態(tài)機通過message對象就和其他的業(yè)務代碼做到了數(shù)據(jù)連接。其實這個很關(guān)鍵,只有做到和其他業(yè)務的數(shù)據(jù)傳遞,才能算的上真正的可用。

下一章我們繼續(xù)講狀態(tài)機的持久化問題和怎么在非起始狀態(tài)開始創(chuàng)建狀態(tài)機

碼云配套代碼地址

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/74981.html

相關(guān)文章

  • spring statemachine企業(yè)可用開發(fā)指南8-復雜狀態(tài)機實現(xiàn)

    摘要:講講復雜流程的需求除了上面文章里面提到的一根筋狀態(tài)機流程,實際的企業(yè)應用中狀態(tài)機的流程會更加復雜,而我們最常用到的就是。當然,里面還有很多其他的東西,大部分是處理復雜狀態(tài)機流程的,以后有機會我們再展開講。 1、講講復雜流程的需求除了上面文章里面提到的一根筋狀態(tài)機流程,實際的企業(yè)應用中狀態(tài)機的流程會更加復雜,而我們最常用到的就是choice。它類似于java的if語句,作為條件判斷的分支...

    jzzlee 評論0 收藏0
  • spring statemachine企業(yè)可用開發(fā)指南3-多個狀態(tài)機共存

    摘要:雖然多個狀態(tài)機的問題解決了,但是對于實際的企業(yè)應用而言,還是有問題。這個問題就用到了狀態(tài)機的持久化,我們下一章就談談持久化問題。 1、多個狀態(tài)機的搞法在實際的企業(yè)應用中,基本不可能只有一個狀態(tài)機流程在跑,比如訂單,肯定是很多個訂單在運行,每個訂單都有自己的訂單狀態(tài)機流程,但上一章的例子,大家可以試一下,當執(zhí)行到一個狀態(tài)時,再次刷新頁面,不會有任何日志出現(xiàn),當一個狀態(tài)流程執(zhí)行到某個狀態(tài),...

    zhongmeizhi 評論0 收藏0
  • spring statemachine企業(yè)可用開發(fā)指南6-持久化

    摘要:目前為止,我們都是從狀態(tài)流程的開始階段創(chuàng)建一個狀態(tài)機,然后一路走下去。然后就可以愉快的在里面看怎么用了發(fā)送事件持久化恢復狀態(tài)機后的狀態(tài)為執(zhí)行完保存后,大家可以自己在客戶端查看以下,是不是有內(nèi)容保存進去了。 目前為止,我們都是從狀態(tài)流程的開始階段創(chuàng)建一個狀態(tài)機,然后一路走下去。但在實際業(yè)務中,狀態(tài)機可能需要在某個環(huán)節(jié)停留,等待其他業(yè)務的觸發(fā),然后再繼續(xù)下面的流程。比如訂單,可能在支付環(huán)節(jié)...

    Jioby 評論0 收藏0
  • spring statemachine企業(yè)可用開發(fā)指南4-多種狀態(tài)機共存

    摘要:目前為止,多個狀態(tài)機和多種狀態(tài)機都可以在里面實現(xiàn)了,下一章我們來解決下狀態(tài)機和實際業(yè)務間的數(shù)據(jù)傳輸問題,畢竟我們不是為了讓狀態(tài)機自個獨自玩耍,和業(yè)務數(shù)據(jù)互通有無才是企業(yè)開發(fā)的正道。 在上一章的例子中,我們實現(xiàn)了多個狀態(tài)機并存執(zhí)行,不同的訂單有各自的狀態(tài)機運行,但只有一種狀態(tài)機,這顯然不能滿足實際業(yè)務的要求,比如我就遇到了訂單流程和公文審批流程在同一個項目的情況,所以我們這一章講怎么讓多...

    boredream 評論0 收藏0
  • spring statemachine企業(yè)可用開發(fā)指南2-先跑起來

    摘要:先來一個,它的主要作用就告訴狀態(tài)機的初始狀態(tài)應該啥樣,然后把整個狀態(tài)流程都用代碼配置出來。繼承了類,表明身份,我就是來配置狀態(tài)機的初始狀態(tài),并描繪一下狀態(tài)流程的全過程。 上一篇說了很多廢話,這一篇就不嘮叨,先跑起來 1、來個spring boot去start.spring.io新建一個springboot的項目,雖然我對spirngboot也有不少的牢騷,但作為demo的開始,還是一個...

    lvzishen 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<