JBPM与设计模式之职责链模式
??? 上篇我們了解并學習了JBPM的長事務實現,其中用到了設計模式中的職責鏈模式和命令模式;這塊還是很有厚重感的,我們可以從中學到很多的東西;今天我們先來學習一下職責鏈模式。
?????? 職責鏈模式定義
?????? 使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關系;將這些對象連成一條鏈,并沿這條鏈傳遞該請求,直到有一個對象處理該請求。
?????? 職責鏈模式的優點
?????? 1.客戶提交一個請求,其沿著這條鏈傳遞直到得到處理;
?????? 2. 發送者和接受者都沒有對方的明確信息信息;
?????? 3. 鏈中對象也不知道鏈的結構,簡化了鏈中對象的鏈接關系,它僅需要維持其后繼者的引
用,而不用持有它所有的候選者;
??? 職責鏈模式UML圖
???
????????
??????JBPM職責鏈模式UML圖
??? ???下面結合JBPM的攔截器代碼簡單介紹一下這個模式
???? Client:
客戶端定制攔截器裝配策略通過jbpm.tx.*.cfg.xml(本文結合hibernate講解)中定義
?????? 解析配置策略形成職責鏈是在流程引擎初始化時完成,JBPM中定義了兩種攔截器裝配策略
?????? 同一個線程的命令嵌套調用的命令共用環境資源
????
View Code ?1?<command-service?name="txRequiredCommandService">?2???????<skip-interceptor?/>
?3???????<retry-interceptor?/>
?4???????<environment-interceptor?/>
?5???????<standard-transaction-interceptor?/>
?6?</command-service>
?7?每個命令調用都新建環境資源
?8?<command-service?name="newTxRequiredCommandService">
?9???????<retry-interceptor?/>
10???????<environment-interceptor?policy="requiresNew"?/>
11???????<standard-transaction-interceptor?/>
12?</command-service>
?? 客戶端的請求就是完成一定業務功能的腳本命令
??
View Code ?1?public?interface?Command<T>?extends?Serializable?{?2???
?3???T?execute(Environment?environment)?throws?Exception;
?4?}
?5?
?6?public?class?SaveTaskCmd?extends?AbstractCommand<String>?{
?7?
?8???private?static?final?long?serialVersionUID?=?1L;
?9???
10???protected?TaskImpl?task;
11?
12???public?SaveTaskCmd(TaskImpl?task)?{
13?????this.task?=?task;
14???}
15?
16???public?String?execute(Environment?environment)?throws?Exception?{
17?????DbSession?dbSession?=?environment.get(DbSession.class);
18?
19?????if?(task.isNew())?{
20???????if?(task.getSuperTaskDbid()!=null)?{
21?????????TaskImpl?parentTask?=?dbSession.get(TaskImpl.class,?task.getSuperTaskDbid());
22?????????parentTask.addSubTask(task);
23?????????task.setSuperTaskDbid(null);
24???????}
25???????
26???????dbSession.save(task);
27???????
28???????HistoryEvent.fire(new?TaskCreated(task));
29?
30?????}?else?{
31???????dbSession.update(task);
32?
33???????HistoryEvent.fire(new?TaskUpdated(task));
34?????}
35?
36?????return?task.getId();
37???}
38?}
??
?? 客戶端調用
?? taskService. assignTask(task.getId(),userId);?
? ChainHandle:
?JBPM并沒用完全照搬職責鏈的定義, 雖然在每個攔截器中都可以處理請求,但是JBPM設計的只能在DefaultCommandService里處理請求,然后再攔截器中處理環境資源初始化和長事務的管理等。
?根據以上分析,職責鏈ChainHandler實現如下
? ?執行處理請求
?
View Code ?1?public?interface?CommandService?{?2???
?3???String?NAME_TX_REQUIRED_COMMAND_SERVICE?=?"txRequiredCommandService";
?4???String?NAME_NEW_TX_REQUIRED_COMMAND_SERVICE?=?"newTxRequiredCommandService";
?5?
?6???/**
?7????*?@throws?JbpmException?if?command?throws?an?exception.
?8????*/
?9???<T>?T?execute(Command<T>?command);
10?}
11?
12?public?class?DefaultCommandService?implements?CommandService?{
13?
14???private?static?final?Log?log?=?Log.getLog(DefaultCommandService.class.getName());
15?
16???public?<T>?T?execute(Command<T>?command)?{
17?????EnvironmentImpl?environment?=?EnvironmentImpl.getCurrent();
18?????
19?????try?{
20???????return?command.execute(environment);
21???????
22?????}?catch?(RuntimeException?e)?{
23???????log.info("exception?while?executing?command?"+command,?e);
24???????throw?e;
25???????
26?????}?catch?(Exception?e)?{
27???????log.info("exception?while?executing?command?"+command,?e);
28???????throw?new?JbpmException("exception?while?executing?command?"+command,?e);
29?????}
30???}
31?}
??? 職責鏈流傳控制
???
View Code ?1?public?abstract?class?Interceptor?implements?CommandService?{?2?
?3???protected?CommandService?next;
?4?
?5???public?CommandService?getNext()?{
?6?????return?next;
?7???}
?8???public?void?setNext(CommandService?next)?{
?9?????this.next?=?next;
10???}
11?}
12?
13?public?class?SkipInterceptor?extends?Interceptor?{
14???
15???static?DefaultCommandService?defaultCommandService?=?new?DefaultCommandService();
16?
17???public?<T>?T?execute(Command<T>?command)?{
18?????EnvironmentImpl?environment?=?EnvironmentImpl.getCurrent();
19?????//?if?there?is?an?environment?active
20?????if?(environment!=null)?{
21???????//?skip?the?rest?of?the?interceptor?stack?and?just?execute?the?command
22???????return?defaultCommandService.execute(command);
23?????}
24?
25?????return?next.execute(command);
26???}
27?
28?}
???? JBPM職責鏈執行流程
| -- |
轉載于:https://www.cnblogs.com/wufengtinghai/archive/2011/06/26/2090673.html
總結
以上是生活随笔為你收集整理的JBPM与设计模式之职责链模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我是买家项目随想-展望2011
- 下一篇: SYBASE的管理(三)