2016-03-10 45 views
0

我試圖使用Spring狀態機在我的項目,因爲有一個目標是Order幾個國家如何使用Spring狀態機的訂單對象

  • 支付
  • 包裝的
  • DELIVERED
  • 取消
  • 退還

該對象可以實現如下

public class Order { 
    private String id; 
    private Customer customer; 
    private OrderState state; 
// Some other fields with getter and setter 
} 

和我介紹OrderService,從數據庫獲取訂單,設置一些信息,包括OrderState,然後保存到數據庫。

但是我不知道如何將Spring狀態機應用到這一個中,是不是太複雜了,用這種簡單的目的呢?

+0

*這樣簡單的目的* - 像什麼?你沒有描述如何處理狀態之間的轉換,允許哪些轉換等等。如果你只是將狀態存儲在'Order'中,那麼簡單枚舉就足夠了。 –

+0

從Spring狀態機文檔中,我將不得不實現一個StateChange Listener,然後從DB獲取訂單,設置狀態並保存回DB。所有這些步驟將由Listener類而不是OrderService完成。我不知道我們是否有另一種實現方式 –

回答

5

定義你的狀態

public enum OrederStates { 
    NEW, PAID, PACKAGED; // etc 
} 

然後定義事件,

public enum OrderEvents { 
    PAYMENT, PACK, DELIVER; // etc 
} 

然後宣佈你的事件偵聽器

@WithStateMachine 
public class OrderEventHandler { 
    @Autowired 
    OrderService orderService; 

    @OnTransition(src= "NEW",target = "PAID") 
    handlePayment() { 
     // Your code orderService.* 
     // .. 
    } 
    // Other handlers 
} 

現在,應用程序配置爲使用狀態機

@Configuration 
@EnableStateMachine 
static class Config1 extends EnumStateMachineConfigurerAdapter<States, Events> { 

    @Override 
    public void configure(StateMachineStateConfigurer<States, Events> states) 
      throws Exception { 
     states 
      .withStates() 
       .initial(OrderStates.NEW) 
       .states(EnumSet.allOf(OrderStates.class)); 
    } 

    @Override 
    public void configure(StateMachineTransitionConfigurer<States, Events> transitions) 
      throws Exception { 
     transitions 
      .withExternal() 
       .source(OrderStates.NEW).target(OrderStates.PAID) 
       .event(OrderEvents.PAYMENT) 
       .and() 
      .withExternal() 
       .source(OrderStates.PAID).target(OrderStates.PACKED) 
       .event(OrderEvents.PACK); 
    } 
} 

最後用它在你的應用程序/控制器

public class MyApp { 

    @Autowired 
    StateMachine<States, Events> stateMachine; 

    void doSignals() { 
     stateMachine.start(); 
     stateMachine.sendEvent(OrderEvents.PAYMENT); 
     stateMachine.sendEvent(Events.PACK); 
    } 
} 

使用此guide入門與狀態機,這referce瞭解更多信息。

+0

感謝您的建議,我正在開發處理這些訂單的REST服務,1服務的參數可能有2個參數:orderId和event。 因此,我必須從該orderId參數中獲取特定順序,並通過該給定事件將狀態更改爲目標狀態,我不知道如何在那裏執行該操作。請幫助檢查 –

+1

handlePayment應該公開,根據我得到的異常。 – Petar