Welcome

Sipariş İş Akışı Örneği İle JBPM Spring WebFlow Entegrasyonu-II

Geçen yazımda sipariş iş akışı örneğinden bahsetmeye başlamıştık. Bu yazımda da örneğe devam ederek sipariş iş akışında kullanıcılara atanmış görevlerin işletilmesi ve satın alama iş adımının gerçekleştirilmesi ile süreci sonuna kadar incelemeye devam edeceğiz.

Kullanıcının Kendisine Atanmış Bir Görevi(Task) Yürütmesi

Bu aşamada JBPM task name (sorguSonuclari.selectedRow.name) SWF tarafındaki flow id’sine karşılık gelmektedir. Ayrıca _jbpmTaskId request parametresi ile redirect edilen flow’un hangi JBPM task instance’ını yükleyeceği belirtilir. Bu sayede kullanıcıya atanmış herhangi bir task üzerinden ilgili SWF flow’u başlatılarak task’ın SWF tarafında işletimine devam edilmiş olunur.

Stok kontrol ve bütçe kontrol senaryoları birbirine benzemektedir. Bunların önemli kısımları üzerinden geçerek SWF JBPM entegrasyonunu incelemeye devam edelim.

    
        
    
<flow>
    <on-start>
        <set name="flowScope.siparis" value="processScope.siparis"/>
    </on-start>

    ...

    <action-state id="onayAction">
        <evaluate expression="processScope.setVariable('stokOnayDurum', new Boolean(true))"/>
        ...
    </action-state>
    <action-state id="redAction">
        <evaluate expression="processScope.setVariable('stokOnayDurum', new Boolean(false))"/>
        ...
    </action-state>
    <end-state id="end" view="flowRedirect:anasayfa-flow" commit="true">
        <attribute name="jbpmEndTask" value="true" type="boolean"/>
    </end-state>
</flow> 

Stok kontrol flow’u başladığında JBPM process’inden siparis nesnesi alınarak SWF flow scope’a aktarılır. SWF flow’ları içerisinden o anda üzerinde çalışılan process ve task instance’larının değişkenlerine daha rahat erişebilmek amacı ile SWF’nin RequestControlContextImpl sınıfına processScope ve taskScope özelliklerini ekledik. Bu sayede SWF’de request, flash ve flow scope’lardaki değişkenlere nasıl erişiliyorsa, process ve task instance’larındaki değişkenlere de aynı syntax ile erişmek mümkün olmuştur.

Stok kontrolünü yapan kullanıcı siparişe onay verirse processScope’daki stokOnayDurum boolean değişkeninin değeri true, red verirse false olarak set edilir. stokOnayDurum değişkeni JBPM tarafında “Satin Alma Karar” Decision state’inde stok ve bütçe kontrol işlemlerinin sonucunu tespit aşamasında kullanılacaktır. Stok kontrol flow’u sonlandığında ise o andaki aktif JBPM taskı da sonlandırılır.

Satın Alma İş Adımı

Stok ve bütçe kontrol taskları, ilgili kullanıcılar tarafından yürütüldüğü vakit iş akışı satın alma aşamasına gelecektir.


Satın almadan sorumlu kullanıcı sisteme girip kendisine atanmış satın alma işlemini onaylarsa iş akışı başarılı biçimde sonlanacak, siparişi veren kullanıcıya da siparişin onaylandığına dair bir e-posta mesajı gönderilecektir. Aksi takdirde iş akışı siparişin iptali ile sonlanmış olacak kullanıcıya da bu yönde bir e-posta JBPM tarafından gönderilecektir.

<flow>
    ...
    <view-state id="satinAlma" view="/content/jbpm/siparisKontrol.xhtml">
        <transition to="end" on="onay"/>
        <transition to="end" on="red"/>
    </view-state>

    <end-state id="end" commit="true" view="flowRedirect:anasayfa-flow">
        <attribute name="jbpmEndTaskWithTransition" value="true" type="boolean"/>
    </end-state>
</flow>
       
        
    

Satın alma flow’unda kullanıcı onay veya red butonlarından hangisine tıklarsa SWF tarafında o butona karşılık gelen transition flow’u end state’ine geçirip sonlandırmaktadır. Bu aşamada JBPM satın alma task’ına da hangi transition ile bir sonraki node’a geçeceğinin söylenmesi gerekir. Bunun için jbpmEndTaskWithTransition attribute’u kullanılmıştır. SWF tarafında end state’e gelindiği vakit bu attribute mevcutsa end-state’e getiren son transition’ın event-id’si JBPM task’ına sinyal gönderirken transition name olarak kullanılmıştır.

Bundan sonraki yazımda JBoss JBPM Console’un uygulama içerisinde gömülü olarak çalıştırılmasından, console vasıtası ile process’lerin deploy edilmesinden ve yönetilmesinden bahsedeceğim.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.