2016-01-13 54 views
0

我有得到一個可運行於以下參考文獻中描述的方式運行的問題:彈簧狀態機的任務執行不點火

http://docs.spring.io/autorepo/docs/spring-statemachine/1.0.0.M3/reference/htmlsingle/#statemachine-examples-tasks

TasksHandler handler = TasksHandler.builder() 
    .task("1", sleepRunnable()) 
    .task("2", sleepRunnable()) 
    .task("3", sleepRunnable()) 
    .build(); 
handler.runTasks(); 

我的實現看起來是這樣的:

private Action<States, Events> getUnlockedAction() { 
    return new Action() { 
     @Override 
     public void execute(StateContext sc) { 
      System.out.println("in action.."); 
      handler = new TasksHandler.Builder().taskExecutor(taskExecutor()).task("1", dp.runProcess(1)).build(); 
      handler.addTasksListener(new MyTasksListener()); 

      handler.runTasks(); 

      System.out.println("after action.."); 
     } 

    }; 
} 

TaskExecutor的初始化如下所示:

@Bean 
public TaskExecutor taskExecutor() { 
    ThreadPoolTaskExecutor te = new ThreadPoolTaskExecutor(); 
    te.setMaxPoolSize(50); 
    te.setThreadNamePrefix("LULExecutor-"); 
    te.setCorePoolSize(25); 
    te.initialize(); 
    return te; 
} 

我對DP(數據處理器)的代碼如下所示:

@Component 
@Qualifier("dataProcessor") 
public class ADataProcessor { 

    public Runnable runProcess(final int i) { 
    return new Runnable() { 
     @Async 
     @Override 
     public void run() { 
      long delay = (long) ((Math.random() * 10) + 1) * 1000; 
      System.out.println("In thread " + i + "... sleep for " + delay); 
      try { 
       Thread.sleep(delay); 
      } catch (InterruptedException ex) { 
       Logger.getLogger(FSMFactoryConfig.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      System.out.println("After thread " + i + "..."); 
     } 

    }; 
    } 
} 

當我執行我的代碼,我看到消息「在行動..」和「行動後..」無延遲..

當我使用以下命令:

   taskExecutor().execute(dp.runProcess(1)); 
      taskExecutor().execute(dp.runProcess(2)); 
      taskExecutor().execute(dp.runProcess(3)); 
      taskExecutor().execute(dp.runProcess(4)); 
      taskExecutor().execute(dp.runProcess(5)); 
      taskExecutor().execute(dp.runProcess(6)); 

我得到了我會從使用TasksHandler期待..

  • 狀態改變到UNLOCKED
  • 在螺紋2 ...睡眠10000
  • 在螺紋3 ...睡眠5000
  • 在螺紋4 ...睡眠8000
  • 在螺紋5。 ..睡了4000
  • 在用線6 ...睡了4000
  • 在線程1 ...睡了9000
  • 2016年1月13日下午12點32分13秒 - org.springframework.scheduling.concurrent .ThreadPoolTask​​Executor初始化爲
  • INFO:初始化的ExecutorService
  • 狀態改變到LOCKED
  • 螺紋5之後...
  • 螺紋6之後...
  • 線程3之後...
  • 螺紋4 ...後
  • 線程1之後...
  • 線程2之後...

ñ在使用TasksHandler時會顯示睡眠延遲之前或之後的其中一條消息。所以我的問題,我怎樣才能真正執行我的runnable?如果我做得正確,我應該檢查什麼?

回答

0

我想你已經有些誤解了一些東西。首先,您鏈接到tasks樣本,將原始想法轉化爲tasks recipe。這也是值得去看unit tests任務。

您註冊了帶有taskhandler的runnables從中獲得一個狀態機來啓動它,然後告訴處理程序運行任務。

我現在認識到,在文檔中,我應該更清楚一點它的用法。

+0

啊,我會看看..非常感謝! –