[BPMN] สรุป Step การพัฒนา BPMN Application ด้วย Camunda BPMN Engine

หลังจากได้ลอง BPMN Engine ตัว Activiti ไป ช่วงมกราคม และลองตัว jBPM ไป แต่ไม่ค่อย Work เท่าไหร่ คราวนี้มาถึงคิวของ Camunda  บ้างแล้วครับ

Camunda BPMN Engine คือ อะไร

  • เป็น BPMN Engine ที่แตกสาย (Fork มาจาก Project ของ Activiti เพื่อเน้นการพัฒนาส่วนของ Engine เอาไปใช้พัฒนา Application ได้ง่ายขึ้น และเพิ่มมาตรฐานใหม่อย่าง DMN และ CMMN ทางที่ OMG (Object Management Group) ได้ประกาศขึ้นมา และนำมาใช้เพื่อลดความซับซ้อนของ BPMN ครับ

ขั้นตอนการพัฒนา BPMN Application บน Camunda

  • สร้างแบบจำลอง BPMN ก่อนครับ โดยทาง Camunda ได้เตรียมตัว Camunda Modeler ไว้ให้ครับ
  • ลงมือทำแบบจำลองครับ อันนี้เป็นแบบจำลองของ https://fundamentals-of-bpm.org ที่ถูกอ้างอิงใน Paper หลายๆอันครับ
  • นำแบบจำลองมาสร้างเป็นเว็บแอปพลิเคชันต่อครับ โดยผมใช้ Eclipse เพื่อบิ้วไฟล์ .war สำหรับไป Deploy ครับ
    • ถ้าใครไม่รู้โครงสร้างของ Project ไม่เป็นได้ครับ ใช้ Maven Project Templates (Archetypes) ได้เลยครับ
    • จากนั้นวางไฟล์ .BPMN ไว้ที่ Folder Resource ครับ
    • ถ้ามีทำ Custom UI ก็วางไฟล์ UI ไว้ใน Folder WebApp ครับ
  • จากนั้นใช้คำสั่ง  maven -install  เพื่อบิ้วตัว .war ขึ้นมาครับ

ติดตั้งแบบจำลอง

  • download Camunda BPMN Engine มาจากนั้นแตกไฟล์ Zip start-camunda.bat จากนั้นเรียกไฟล์ (Windows) เพื่อ Start Server ซึ่งเมื่อ Start เรียบร้อยแล้ว มันพาไปหน้าจอ Welcome ซึ่งมี 3 Module หลังที่ต้องสนใจครับ
    • Cockpit – เอาไว้ Monitoring จัดการกับ Process
    • Task – เอาไว้สำหรับให้ User แต่ละ Role เข้ามาใช้งาน เพื่อเดินกระบวนการ ทางหน้าที่ของแต่ละ User
    • Admin – เอาไว้จัดการสิทธิ์ทั้งหลาย
  • ถ้าเข้ามาใน Cockpit ด้วย username  demo  password  demo  พบว่ามี sample process deploy รอไว้แล้วครับ ต่่อไปเรา Deploy Process อันใหม่ที่ทำ เพิ่มครับ
  • นำไฟล์ .war ที่ได้ เข้าไปวางในโพลเดอร์  <<SERVER-PATH>>\camunda-bpm-enigne\server\apache-tomcat-x.x.xx\webapps จากนั้นรอตัว Tomcat มัน Deploy Process ครับ โดยมีข้อความแจ้งผล ดังรูป
  • ลองไปดูใน Cockpit มี Process ที่ Deploy ทั้งหมด 3 ตัวครับ

ทดสอบใช้งานครับ

  • Start Process ให้ทำงานก่อนครับ โดยเข้าไปที่ Camunda-Task จากนั้น Start Process
  • เลือก Process ที่ได้เพิ่ง Deploy ไปเลยครับ
  • ระบบขึ้น Form ให้กรอก ดังรูป
  • สำหรับการทดสอบมี 6 กรณีทดสอบ
    • กรณี Happy Flow
    • กรณี ผู้ใช้กรอกข้อมูลไม่ครบ จนกลับมาที่ Task “Update Loan Application”
    • กรณี เจ้าหน้าที่ฝ่ายสินเชื่อ(Loan Officer) ตรวจที่ Task “Assess eligibility” แล้วคุณสมบัติไม่ตรง
    • กรณี ผู้ใช้กรอกข้อมูลไม่ครบ จนกลับมาที่ Task “Update Loan Application” แล้วค้างที่ Task นั้น 5 วัน ระบบต้อง Reject ทิ้ง
    • กรณี เจ้าหน้าที่ฝ่ายสินเชื่อ(Loan Officer) ตรวจที่ Task “Verify repayment agreement” แล้วค้างที่ Task นั้น 14 วัน ระบบต้อง Reject ทิ้ง

Note

  • ถ้าใช้ Form ของ Camunda ระวังพวก Date Type “Date” ที่ต้องเป็น ISO 8601 ไม่งั้นมัน Render Form ไม่ขึ้น

Reference

จะคุยกับลูกค้าแล้ว เราตกลงกันภายในแล้ว หรือยัง ?

สำหรับ Blog ตอนนี้ เป็น Blog ที่บ่นถึงปัญหาที่มักพบเจอในองค์กรที่รับพัฒนาซอฟต์แวร์ และก่อให้เกิดปัญหาจนเรียกว่า End Phase

ปัญหาที่ 1 : ก่อนเริ่มต้นโครงการ ตกลงกันภายในแล้ว หรือยัง ?

  • ตัวละครที่เกี่ยวข้อง – ทุกฝ่ายที่ช่วยให้ลูกค้า ตัดสินใจซื้อสินค้า และบริการจากเรา
  • จุดประเด็น
    • อย่าแถ ถ้าไม่รู้จริง หรือตกลงกันก่อน เคสนี้ผมโดนมากับตัวเลยครับ 555 ก่อนที่ทีม Technical เข้าไปคุยกับลูกค้า ฝ่ายที่ต้องไปคุยก่อน คือ ทีม Marketing / Business คุยก็ลูกค้าอย่างไร ไม่รู้ เนื้องานงอกเฉย พอทีม Technical เข้าไปคุยต่อฉันตอบไปคนละทางกับทีมแรก แต่สิ่งที่ลูกค้ารู้ Fact แรกที่ได้รับมัน คือ ความจริง
    • เรื่องของเวลา อย่ามั่ว ถ้าอยากได้โครงการ เพราะ บางครั้งการบีบเวลาที่มากจนเกินไป งานเสร็จจริง แต่คุณภาพโหลยโถ่ย แถมทีมงานลาออก สิ่งที่ทีม PM และ Marketing ควรทำ คือ หาจุดที่เหมาะสมของเวลา ไม่ใช่ทำได้เสมอ เพราะในมุมมองของฝั่ง Technical พวกคุณ ไม่ได้ทำงานดึกข้ามคืนด้วยกันนะ และทุกคนมีแผนการจัดการเวลาของตัวเอง

ปัญหาที่ 2 : ทำอะไร ควรมีหลักฐาน !!!

  • ตัวละครที่เกี่ยวข้อง – ทุกทีมที่เกี่ยวกับการพัฒนาระบบในมุมเชิงเทคนิค / เชิงธุรกิจ และเชิงการจัดการ
  • จุดประเด็น
    • การเก็บ Requirement ไม่ใช่หน้าที่ของทีม Marketing การประเมินขอบเขต และราคา ควรเอาทุกฝ่ายช่วยกัน อย่างโปรเจคล่าลุดที่ผมเจอ Marketing จัดการทุกอย่างทั้ง Scope / Time และ Cost แถมดันไปเขียนสัญญาปลายเปิด ทีม Technical ที่ทำ ซวยสิครับ ทุกทีมออกไปหมดแล้ว เหลือทีม Technical มาตามเช็ด ตามล้าง นี่แหละ คือ End Phase งานที่ไม่สามารถทำเสร็จได้ ภายในระยะเวลาที่กำหนดไว้ของโครงการ
    • คุยกับลูกค้าที่น่ารักแล้ว หรือยัง แม้ว่าจะมีเอกสาร อย่าง Software Requirement Specification(SRS) แต่เคยจี้ให้ลูกค้าที่น่ารักอ่านกัน หรือยัง !! บอกหรือยังว่ามัน คือ ขอบเขตที่ทำ ผมเคยเจอคำพูดนึงที่เจ็บจิ๊ดมากกก SRS มันเป็นแค่เอกสารบอกโครงหยาบๆ ที่ทำงาน ผมเลยสวนกลับไปว่า งั้นผมประเมินราราคาหยาบๆ แบบเผื่อๆ ให้พี่ได้ไหม ในเมื่อพี่ก็อยากได้ระบบอยู่แล้ว หัวร้อนเลยทีเดียว ทำไปแก้ไป
    • ช่วง UAT != ช่วงเก็บ Requirement เป็นหลายที่มากๆ ที่ลูกค้ามองว่าช่วง UAT คือ ช่วงการเก็บ Requirement ใหม่ จากระบบที่พัฒนาจนเสร็จ จริงได้คำว่าเก็บ ผมมองว่ามันใช้คำผิดนะ พอใช้คำว่าเก็บ ลูกค้ามองว่ามันคงทำได้ง่าย แค่หยิบมันมา แต่สิ่งที่ทีมพัฒนาหยิบ มันจับต้องได้ไม่ได้

ปัญหาที่ 3 : ตกลงกันแล้ว ว่าใคร ทำอะไร ที่ไหน แล้ว หรือยัง ?

  • ตัวละครที่เกี่ยวข้อง – ทุกทีม
  • จุดประเด็น
    • จากบทสนทนานี้ จงวิเคราะห์
      • เดี๋ยวทีม Technical เข้ามาดูต่อให้ค่ะ จากคำกล่าวของทีม Marketing เมื่อ 2 สัปดาห์ก่อนหน้า
      • ลูกค้า : คุณช่วยดูสิ่งที่ผมแจ้งกับทีม Marketing
      • ทีม Technical : (คิดในใจ เรื่องอะไร !!!!) แล้วตอบ กำลังวิเคราะห์อยู่ครับ
      • ลูกค้า : ก็ Marketing บอกทำ POC สัปดาห์หน้าไป คุณเตรียม Demo ของระบบยัง (ทำไมมันเลื่อนเร็วขึ้น แถมเป็นคนละเรื่องอีก)
      • ทีม Technical : (…… ถาม Marketing หน้าที่ผมช่ายไหม Marketing ตอบสั้นๆ ว่าช่าย หัวร้อนกันเลยทีเดียว) อ๋อๆ ขอ Setup ระบบแปบนึงครับ

สำหรับ Blog นี้ ผมคงเน้นปัญหาที่สำคัญ คือ การสื่อสาร ทำความเข้าใจ และสร้างข้อตกลง ไม่งั้นก็จะเกิดเป็นปัญหา อย่างที่ผมเผชิญอยู่กับตัวรายงาน Data Set ที่ต้องส่ง BOT ไปๆมาๆ เหลือคนดูแล คือ ผมคนเดียว และทีมอื่นๆ หายไปหมด …… สุดท้ายพอแบบมีปัญหาอะไรไป ก็ได้แค่บ่น หรือเขียน Spec แบบจิ๊กกัดได้เท่านั้น T_____T

ใจเขา ใจเรา ทำงานของตัวเองให้ดีที่สุดแล้ว หรือยัง !!!

[BPMN] Loop หรือ การทำซ้ำ

แม้ว่าตัว BPMN ถูกออกแบบมาสำหรับทางฝั่ง Business แต่มีการทำบางอย่าง ที่ยังต้องใช้มีการทำวนซ้ำ หรือ ถ้าในภาษา Technical ของ Developer ทั้งหลาย ว่าวนลูป (Loop) ครับ สำหรับใน BPMN สามารถเขียนได้ 2 แบบครับ ได้แก่

  • Loop Activity
  • Non-Loop Activity

Loop Activity

โดย Loop Activity คือ Loop ที่เกิดกำหนด Property ของตัว Activity ครับ ถึงถ้าไปดูใน Spec ของ BPMN อยู่ในรูปแบบของ XML Tag StandardLoopCharacteristics

มาลองดูตัวอย่างกันครับ ภาพด้านล่าง ผมเอามาจาก Tools Visual Paradigm Modeler ครับ เป็น

  • สัญลักษณ์ลูกศรวน บนตัว Activity
  • การกำหนด Attribute ใน XML Tag StandardLoopCharacteristics โดยอยู่ในส่วนของ Standard Loop Specification

Note: แต่ Loop Activity BPMN-Engine ที่เป็น Open-Source ณ ปี 2018 ทั้งหมด ยังไม่ Support ครับ

Non-Loop Activity

ส่วน Non-Loop Activity นั้น มองภาพที่ใหญ่ขึ้นจาก Activity เดี๋ยวๆ โดยการสร้าง Loop จากการใช้ Exclusive Gateway นำมาประกอบกันครับ มาลองดูตัวอย่างกันครับ

  • อย่าง Loop ที่ถ้าใช้ Loop Activity testBefore=true สามารถปรับเป็น Exclusive Gateway ได้ตาม Pattern ดังนี้ครับ
  • อย่าง Loop ที่ถ้าใช้ Loop Activity testBefore=false สามารถปรับเป็น Exclusive Gateway ได้ตาม Pattern ดังนี้ครับ

หมายเหตุ

  • คำอธิบายนี้อิงตาม Spec ของ BPMN 2.0 ที่ทาง OMG ได้ประกาศไว้ครับ
  • ถ้าไปดูตัว BPMN-Engine อาจจะยังทำไม่ครบตาม Spec ของ OMG อันนี้ผมเข้าใจว่า เพราะมันมี Non-Loop Activity ที่สามารถทำงานทดแทนได้อยู่แล้วครับ

[BPMN] ลองใช้ Process ที่ได้เพิ่งสร้างกัน

จาก Blog ตอนก่อนหน้าที่เราได้ทำอะไรไปหลายๆอย่าง ทั้ง

มาใน Blog ตอนนี้ เรามาใช้ ลองเป็น End-User ของ Process ที่ทำครับ โดยหลังจาก Deploy Process เราต้องเข้าในส่วนของ Activiti Task กันครับ มาทวนภาพรวม Process กันก่อนครับ ดังรูป

เริ่่มลองใช้งาน Process โดยต้อง Login เป็น User ที่อยู่ใน Group Employee ครับ

สวมบทบาทเป็น Employee  กันครับ

  • Login เข้าระบบด้วย User ที่อยู่ใน Group Employee ครับ
  • เข้ามาที่ เลือก Task App ครับ
  • มา Start Procrss ที่ Deploy ไว้กันเลย
  • เจอ Process ที่สร้างไว้แล้ว เลือกเลยครับ
  • ตรงนี้ เราเห็นแล้วว่า Active Process ขึ้นมาแล้วครับ

    • ถ้ากด Show Diagram เห็นว่า Task นี้ ยังอยู่ที่ Employee Request Budget ครับ
  • ถ้าต้องการทำ Task ใน Process นั้น ให้ Double Click ที่ Active ซึ่งถ้าต้องการทำ Process ต่อก็สามารถกด Claim ได้เลยครับ
  • จากนั้นกรอกข้อมูลที่จำเป็นลงไปครับ
  • พอกลับมาดูที่ Process ตอนนี้ Active Task อยู่ที่ Manager แล้วครับ

    • ถ้ากด Show Diagram เห็นว่า Task นี้ ยังอยู่ที่ Manager Review / Approve ครับ เพราะ วงเงินที่ขอไว้เกินกำหนด 1,000 บาท
  • สังเกตุดีๆครับ ตอนนี้ Assigned to nobody ครับ ให้เพิ่มคนที่อยู่ในกลุ่ม Manager ดังนี้
    • เลือก Involve someone else and start collaborating
    • จากนั้นเลือก User ในกลุ่ม Manager ครับ

Manager เข้ามา Claim Task ว่าจะอนุมัติ หรือไม่ ?

  • Login เข้าระบบด้วย User ที่อยู่ใน Group Manager ครับ
  • พอเข้ามาที่ Task App จะเจอว่ามี TaskManager Review / Approve รออยู่ครับ
  • Manager Claim Task นั้นไปครับ
  • ปรากฏว่า Manager ไม่อนุมัติ (แล้วจะทำอย่างไรต่อ !!!)
  • ตอนนี้ Process เลย วนกลับไปที่ Employee ให้ใส่ข้อมูลวงเงินมาใหม่

เมื่อ Employee แก้ข้อมูลใหม่ แล้วส่งงานกลับมาให้ Manager

  • ตอนนี้ ถ้าสังเกตุ Complete Task หลังจาก Employee ใส่ข้อมูลมาใหม่แล้ว
  • หลังจาก Manager อนุมัติแล้ว งานส่งต่อไปให้กับฝ่ายบัญชี-การเงินครับ

เมื่อฝ่ายบัญชีจัดการเสร็จแล้ว จบกระบวนการ

  • Login เข้าระบบด้วย User ที่อยู่ใน Group Accountant ครับ
  • พอมาดูที่ Task Manager ส่งงานมาให้แล้วครับ (เพราะ วงเงินที่ขออนุมัติแล้ว)
  • จากนั้น Claim Task
  • แต่เนื้องจาก Task นี้เป็น Task สุดท้ายแล้ว และก็ไม่มีิ Process อะไร นักบัญชีเลยกด Complete Task ไปครับ

จบไปแล้วกับ Blog เรื่องยาวครับ แม้ว่า Process ที่ทำเป็น Demo อาจจะไม่สมจริงเท่าไหร่นะครับ หากทุกท่านอ่านแล้วสงสัยอะไร สามารถทักมาได้ หรือทวงติงกรณีที่ผมเขียนผิดครับ ^__^

 

 

[BPMN] ลองเอา Process ที่ทำมา Deploy ขึ้นกัน

จาก Blog ก่อนหน้านี้ที่ได้ลองสร้าง Process ไปแล้ว คราวนี้ลองเอา Process ที่ทำ มาผูกให้เป็น Application โดยใช้ Activiti-App ตัว Kick Start ครับ เนื่องจาก Form ที่ทำโดยใช้ Activiti Designer ยังไม่สมบูรณ์ครับ เลยต้องเอามาปรับปรุงใน Kick Start  โดยการเพิ่ม Form ลงไป เพราะใน Process ที่ทำไว้ก่อนหน้านั้น เราได้กำหนดแค่ภาพรวม Workflow ไว้แล้ว

จริงๆมาสร้าง Workflow ในตัว Kickstart ได้เลยนะ ไม่ต้องผ่านตัว Eclipse Designer ก็ได้ครับ

เพิ่ม User และ Group ที่เกี่ยวข้อง

  • ถ้าดูจาก Process ได้สร้างขึ้นมา มีกลุ่มคนที่เกี่ยวข้องอยู่ 3 กลุ่ม ได้แก่ Accountant, Employee และ Manager ตามรูปเลย
  • สิ่งที่ต้องทำ คือ ทำให้ User และ Group เหล่านี้ มีตัวตนจริงๆ บน BPMN Engine โดยการเพิ่มเข้าไปในส่วนของ Identity management จากตัว Activiti-App เข้าทาง localhost:8080/activiti-app (ถ้ามีการเปลี่ยน Port หรือ URL ปรับแก้ให้ตรงกับที่ติดตั้งด้วย)
    • เพิ่ม User อันนี้ยัดได้ตามใจเลย
    • เพิ่ม Group ได้แก่ Accountant, Employee และ Manager
  • ถ้าทำตามนี้มี User ในแต่ละ Group ประมาณนี้

มาปรับ Process ให้ตามขั้นตอน ดังนี้

  • เพิ่ม GUI Form
    • ใน Activity Employee Request Budget สำหรับ Employee ในกรอกจำนวนเงินที่ต้องการขอเบิก
      • เลือก Activity ก่อน มาดูในส่วนของ Panel ข้างล่าง เลือก Reference Form
      • เลือก New Form
      • จากนั้นลาก Number Control
      • และกำหนด Property ตามรูป
      • **ข้อควรระวัง: ให้กำหนด Id ของ Control ให้ตรงกับ Condition ที่เขียนไว้ ซึ่งที่ส่วนที่นำไปใช้ต่อ คือ Sequence Flow ที่มี Conditional Expression ดังนี้
      • จากนั้นกด Save
    • ใน Activity  Manager Review / Approve สำหรับให้ Manager ตรวจทาน และอนุม้ติ ผลการร้องขอเบิกเงิน
      • เลือก Activity ก่อน มาดูในส่วนของ Panel ข้างล่าง เลือก Reference Form
      • เลือก New Form
      • จากนั้นลาก Drop Down Control
      • และกำหนด Property ตามรูป
      • อย่าลืมใส่ Option Value เพื่อเอาไปใช้งานกับ Sequence Flow ต่อไป
      • จากนั้นกด Save
  • ปรับเรื่อง Owner ในแต่ละ Actvity ให้ลงตาม Group – ในที่นี้ยกตัวอย่างของ Activity  Accountant Acknowledge โดยต้องให้ User ที่อยู่ในกลุ่ม Accountant เข้ามาจัดการครับ ส่วนที่ Group เหลือ Employee และ Manager ลองปรับตามได้
    • เลือก Activity  Accountant Acknowledge  ก่อน มาดูในส่วนของ Panel ข้างล่าง เลือก Assignments
    • โดยเจ้า Assignments เลือกได้ 2 แบบ
      • Fixed Values – กำหนดค่าลงไปเลย
      • Identity Store – ใช้ User & Group ที่ได้สร้างในตัว  Identity management โดยในที่นี้ใช้วิธีการนี้
    • กำหนด Candinate Group
    • เลือก Group ที่ต้องการในที่นี้ กลุ่ม Accountant

แปลง Process เป็น App เพื่อ Deploy

  • ใน Activiti-App ในส่วน KickStart ให้เลือก App จากนั้นเลือก Create App
  • กำหนดข้อมูลทั่วไปของ App จากนั้นกด Create ดังรูป
  • กำหนดสี และรูป
  • รวมถึง Process Definiton ที่ต้องการใช้
  • กด Save มีให้แก้ข้อมูลของ App รวมถึงการกด Publish เพื่อประกาศใช้งาน

หลังจาก Deploy (Publish Process ขึ้นไปแล้ว) ต่อไปจะเป็น Blog ที่ลอง Execute Process ที่ได้สร้างขึ้นมาครับ

 

[BPMN] Activiti สร้าง Unit Test

หลงจาก Blog ตอนที่แล้ว ที่ได้สร้าง Process ของการขอเบิกเงินไปแล้ว ตอนนี้เราต้องมา Proof ก่อนว่า Process ที่ทำนั้น มันใช้งานได้จริงๆ พร้อมที่นำไป Deploy ขึ้น Activiti Server ครับ โดยมีขั้นตอน ดังนี้

Step 1 : กำหนดโครงสร้างไฟล์ที่เกี่ยวข้องกันก่อน

Step 2 : สร้างไฟล์ Config ที่เกี่ยวข้อง

  • สร้างไฟล์แปลง Activiti Project ให้เป็น Maven Project ซึ่งมีไฟล์ pom.xml เพื่อเก็บ Dependency ต่างๆไว้ โดยสำหรับการ Test BPMN ต้องใช้ Dependency ที่จำเป็น ดังนี้
    • activiti-engine : สำหรับ Execute BPMN
    • JUnit : สำหรับทำ Unit Test
    • MySQL Connector/J : ใช้เชื่อมต่อ Database ของ activiti-engine
    • spring framework [Optional] : ในกรณีที่ต้องการใช้ Activiti กับ Spring
    • และสุดท้าย หน้าตาของไฟล์ pom.xml มี Dependency ดังนี้ครับ
  • สร้างไฟล์ activiti.cfg.xml โดยมีการกำหนดค่า ดังนี้

Step 3 : เอาไฟล์ Process มาใส่

  • เอาไฟล์ Process ที่ทำไว้ จาก Blog ตอนที่แล้วจะเป็นไฟล์ Test.bpmn เอามาวางไว้ที่ Path .../src/test/resources/ ดังรูป
  • หรืออาจจะอ้างไปที่ Path ของ project เลยก็ได้ครับ เช่น

Step 4 : สร้าง Unit Test ขึ้นครับ

  • ตั้งโครงใหม่ ให้มันเข้ากับ Activiti 6.0 และ JUnit 5 กันก่อนครับ

โดยใช้ Test แบ่งเป็นช่วงๆ ดังนี้

  • ส่วน @BeforeAll – ทำงานตอน Execute Test ครั้งแรก โดยสร้าง ActivitiRule ขึ้นมา เพื่อเตรียม Activiti-Engine ให้พร้อม
  • ส่วน @BeforeEach และ @AfterEach เป็นส่วนที่ทำงานก่อน และหลัง Test Case แต่ละอัน
    • @BeforeEach – ในที่นี้เป็นการ Deploy Process ที่เพิ่งสร้าง ให้ Activiti-Engine รู้จัก
    • @AfterEach – ในที่นี้เป็นการ ลบ หรือ Clear Process ที่เพิ่ง Deploy ออกจาก Activiti-Engine รู้จัก
  • ส่วน @Test เป็น Test Case ที่เตรียมไว้ ซึ่งมี 5 Test Case ดังนี้
    • TC1 test1ProcessIsStart – บอกว่า Process ที่ Deploy ไปพร้อมใช้งาน หรือไม่ ?
    • TC2 test2AssignValueInVariableBudgetAmount – ตอนที่สร้าง Process ขึ้นมา เราได้ยัดค่าตัวแปร BudgetAmount ลงไป โดยใน Test Case ดูจะดูว่า มันสามารถดึงค่าที่ได้ Pass เข้าไปได้ หรือไม่
    • TC3 test3AssignValueInVariableApproved – ตอนที่สร้าง Process ขึ้นมา เราได้ยัดค่าตัวแปร Approved ลงไป โดยใน Test Case ดูจะดูว่า มันสามารถดึงค่าที่ได้ Pass เข้าไปได้ หรือไม่
    • TC4 test4WhenEmployeeNeedBudgetMoreThan1K – ทดสอบตาม Scenario ที่ได้กำหนดไว้ ดังรูป
      โดย Code สำหรับทดสอบสามารถเขียนได้ ดังนี้
    • TC5 test5WhenEmployeeNeedBudgetLessThanOrEqual1K – ทดสอบตาม Scenario ที่ได้กำหนดไว้ ดังรูป
      โดย Code สำหรับทดสอบสามารถเขียนได้ ดังนี้

Step 5 : ทดสอบ Run Unit Test

  • คลิกขวาที่ UnitTest เลย ชื้อไฟล์ จากนั้น Run As >> JUnit ซึ่งทำเขียน Test ถูกต้อง ได้ผลลัพธ์ ดังนี้

ปัญหาที่เกิด

  • ทดสอบ Run Test แล้วเจอ Error java.lang.NoClassDefFoundError สามารถแก้ไขโดยเพิ่ม JUnit ที่ Java Build Path ดังรูป
  • ตอนนี้ตัว Activiti Framework ยังไม่รองรับ JUnit 5 นะครับ วิธีที่ผมแก้ มันแก้แบบลูกทุ่งไปก่อน เพราะ ตัว Class AcitiviRule มันช่วยทำให้ Test ได้ง่ายขึ้น
  • ลำดับของการ Execute Test ของ JUnit มันมั่วมากครับ

[BPMN] ลองสร้าง Process โดยใช้ Activiti Designer

หลังจากที่ได้ลงทุกอย่างพร้อมหมดแล้ว ทั้ง Activiti Framework, Eclipse Activiti Designer แล้ว คราวนี้มาลองใช้ Activiti Designer ลองสร้าง Process แบบง่ายๆขึ้นมาครับ จากนั้นน่าจะเป็น Blog ตอนถัดไปสำหรับการทำ Unit Test ของ Process ครับ เอาหละมาเริ่มกันเลยครับ

Step 1 : เตรียมตัว

Step 2 : Process ที่สร้าง BPMN

  • โดยเริ่มจากพนักงานทำเรื่องเสนอของเบิกงบประมาณ
  • ถ้างบที่เบิกน้อยกว่า หรือเท่ากับ 1,000 บาท – สามารถติดต่อนักบัญชีได้เลย
  • ถ้างบที่เบิกมากกว่า 1,000 บาท – ต้องให้ผู้จัดการตรวจสอบ และอนุมัติก่อนครับ
    • ถ้าผู้จัดการอนุมัติ  – ส่งเรื่องต่อให้นักบัญชีได้เลย
    • ถ้าไม่ผู้จัดการอนุมัติ – ส่งเรื่องกลับไปให้พนักงาน

Step 3 : สร้าง Activiti Project กัน

  • สร้าง Project โดยใช้ Activiti Designer หลังจากเปิดโปรแกรมขึ้นมาให้สร้าง Activiti Project โดยเปิดเมนู File >> New >> Project
  • ตั้งชื่อ Project แล้วกด Finish
  • มาดูโครงสร้าง Project กันดีกว่าครับ
  • จากรูปมาเจาะโครงสร้าง Project ดีกว่า ว่าแต่ละ Folder ใส่อะไรบ้าง

    • [1] Java – เก็บ Java Class ที่เกียวข้องกับแผนภาพ BPMN
    • [2] resources/diagrama – เก็บแผนภาพ BPMN
    • [3] Test – เก็บ Unit Test ของ BPMN
    • [4] resources – เก็บ Resource ที่ใช้สำหรับ Test

Step 4 : สร้าง BPMN Process กัน

  • คลิกขวาที่โพลเดอร์ diagrams เลือกเมนู New >> Other
  • เลือก Activiti Diagram แล้วกด Next ดังรูป
  • ตั้งชื่อ Process จากนั้นกด Finish
  • ตอนนี้มี BPMN Process ว่างๆขึ้นมา 1 แล้วครับ

Step 5 : สร้าง BPMM Process ตามโจทย์ที่กำหนดไว้ใน Step 2

  • ขั้นแรกไปดูที่ Patette จากนั้นลองลาก Component ต่างๆมาสร้าง Diagram ดังรูป
  • คลิกที่พื้นที่ว่างๆ กำหนด Procee ID และ Name ดังรูป

จากนี้ไปผมเจาะ เฉพาะจุดที่มี Config ที่สำคัญ และทำให้ตัว BPMN มันสามารถ Execute ได้จริงครับ

  • User Task ชื่อว่า  Employee Request Budget หน้าที่ของ Task นี้ให้พนักงานกรอกงบประมาณที่ต้องการ สำหรับการตั้งค่าอื่นๆ ให้ดูจากรูปด้านล่างเลยครับ

    This slideshow requires JavaScript.

  • Exclusive Gateway และ Sequence Flow ทั้ง 2 ได้แก่
    • Sequence Flow ชื่อว่า budgetAmountMoreThen1K โดยการผ่าน Flow นี้ไปได้ ต้องผ่านเงื่อนไขดังนี้ ${budgetAmount > 1000.00} โดยการกำหนดค่าสามารถดูได้จากรูปครับ

      This slideshow requires JavaScript.

    • Sequence Flow ชื่อว่า  budgetAmountLessOrEqual1K โดยการผ่าน Flow นี้ไปได้ ต้องผ่านเงื่อนไขดังนี้ ${budgetAmount <= 1000.00} โดยการกำหนดค่าสามารถดูได้จากรูปครับ

      This slideshow requires JavaScript.

  • User Task ชื่อว่า MangerReviewApproved หน้าที่ของ Task นี้ ให้หัวหน้า หรือผู้จัดการเข้ามาตัดสินใจ ว่าอนุมัติคำร้อง หรือไม่ โดยการกำหนดค่าสามารถดูได้จากรูปครับ

    This slideshow requires JavaScript.

  • แต่ User Task  MangerReviewApproved ประกอบไปด้วย Sequence Flow  2 เส้นทาง ได้แก่
    • Sequence Flow ชื่อว่า  ApprovedBudget โดยการผ่าน Flow นี้ไปได้ ต้องผ่านเงื่อนไขดังนี้ ${Approved == true} โดยการกำหนดค่าสามารถดูได้จากรูปครับ

      This slideshow requires JavaScript.

    • Sequence Flow ชื่อว่า  RejectBudget โดยการผ่าน Flow นี้ไปได้ ต้องผ่านเงื่อนไขดังนี้ ${Approved == false} โดยการกำหนดค่าสามารถดูได้จากรูปครับ

      This slideshow requires JavaScript.

  • User Task ชื่อว่า AccountantAck หน้าที่ของ Task นี้ บอกว่าฝ่ายการเงิน / บัญชีรับทราบเรื่องแล้ว

หลังจากมี Diagramแล้ว จริงๆ มันเรียกได้อีกชื่อว่า Process Definition ได้นะ สำหรับขั้นตอนต่อไปทำการทดสอบ โดยการทำ Unit Test ครับ ซึ่งผมเขียนอธิบายใน Blog ตอนถัดไปครับ

[BPMN] เปลี่ยน Activiti Framework มาใช้ MySQL

จาก Blog ตอนก่อนหน้าที่ได้ติดตั้งตัว Activiti Framework แต่ยังใช้ตัว H2 ซึ่งเป็น In-Memory Database คราวนี้ ลองมาเปลี่ยนใช้ DBMS เจ้าอื่นๆบ้าง โดยใช้ตัว MySQL ครับ เพิ่มให้ Web Application แต่ละตัวทำงานเชื่อมโยงกันได้ครับ หากย้อนกลับไปดูไฟล์ของ Activiti Framework ที่ Download มาพบว่าข้างในมี Folder database ดังรูปนะครับ

ลองเข้าลึกไปอีกที อ่ามีให้ครบครัน ทั้ง Create / Drop / Upgrade ครับ ต้องนี้คงต้องภาวนาขอให้ Script ที่ให้มามันครบนะครับ เพราะ ส่วนใหญ่ Open-Source มันจะตามอะไรกันยากนิดนึง ที่เขียน Blog ไว้ เพิ่มทวนความจำเหมือนกัน ไม่งั้นเดี๋ยวตอนกลับมาดูอีกทีจะลีมได้ครับ

หลังจากเห็นสิ่งที่ Activiti Framework เตรียมมาให้แล้ว คราวนี้ลองมาทำกันบ้าง ดีกว่า โดยมีขั้นตอน ดังนี้

Step 1 : เตรียมตัว

  • ลง Activiti Framework แล้ว
  • ติดตั้ง DBMS ในทีมนี้ ผมขอใช้ MySQL แล้วกันครับ แต่ถ้าว่างขอเสี่ยงลองตัว MariaDB ด้วย
  • เตรียมไฟล์ mysql-connector-java เอาไว้สำหรับเชือมต่อ MySQL หรือ MariaDB โดยในที่นี้ของใช้ไฟล์ mysql-connector-java-5.1.45.jar

Step 2 : ลงมือกันครับ

  • สำหรับวิธีการสำหรับสร้าง Database ขึ้นมานั้นมีหลายแบบครับ เดียว
  • สร้าง Database สำหรับ Activiti-App และ Activiti-Rest ในที่นี้กำหนดชื่อ Database เป็น activiti  ดังรูป
  • สร้าง Database สำหรับ Activiti-Admin ในที่นี้กำหนดชื่อ Database เป็น activitiadmin ดังรูป

Step 2.1 : Run ผ่าน Script SQL

  • จากนั้น Run Script ตาม Database ในแต่ละชนิดได้เลย อันนี้น่าจะเหมาะสำหรับ DBA ที่ต้อง Run Script ขึ้น Production ดังรูป

Step 2.2 : Config Properties Files และ XML File ที่เกี่ยวข้อง

  • สร้าง Database ในที่นี้กำหนดชื่อ Database เป็น activiti โดยถ้าลองขุดเข้าไปในไฟล์ activiti-engine-6.0.0.jar โดยข้างในมี Script เก็บไว้อยู่ ดังรูป

Step 2.2.1 : Config สำหรับ Activiti-App ใช้ Database “activiti

  • นำไฟล์ mysql-connector-java-5.1.45.jar Copy ไปวางไว้ใน Path <CATALINA_HOME>/webapps/activiti-app/WEB-INF/lib ดังรูป
  • ไฟล์ Properties อยู่ที่ <CATALINA_HOME>/webapps/activiti-app/WEB-INF/classes/META-INF/activiti-app/activiti-app.properties สำหรับการแก้ไข มีดังนี้
    • ของเดิม
    • ของใหม่

Step 2.2.2 : Config สำหรับ Activiti-Rest ใช้ Database “activiti

  • นำไฟล์ mysql-connector-java-5.1.45.jar Copy ไปวางไว้ใน Path <CATALINA_HOME>/webapps/activiti-rest/WEB-INF/lib ดังรูป
  • Config สำหรับ Activiti-Rest โดยไฟล์ Properties อยู่ที่ <CATALINA_HOME>/webapps/activiti-rest/WEB-INF/classes/db.properties สำหรับการแก้ไข มีดังนี้
    • ของเดิม
    • ของใหม่

Step 2.2.3 : Config สำหรับ Activiti-Admin ใช้ Database “activitiadmin

  • นำไฟล์ mysql-connector-java-5.1.45.jar Copy ไปวางไว้ใน Path <CATALINA_HOME>/webapps/activiti-admin/WEB-INF/lib ดังรูป
  • Config สำหรับ Activiti-Rest โดยไฟล์ Properties อยู่ที่ <CATALINA_HOME>/webapps/activiti-admin/WEB-INF/classes/META-INF/activiti-admin/activiti-admin.properties สำหรับการแก้ไข มีดังนี้
    • ของเดิม – ในไฟล์ถูก Comment ไว้หมดเลยครับ
    • ของใหม่ – อันนี้ผมเอา Config มาจากตัว Activity-App ครับ

หมายเหตุ  <CATALINA_HOME> คือ ที่ตั้งของ Tomcat Server เช่น D:\tomcat_8.5.24 ครับ

Step 3 : มาดูผลลัพธ์กันครับ

  • เมื่อทำเสร็จแล้ว อย่าลืม Start Tomcat ใหม่อีกครั้ง ถ้าทำตาม Step 2.2 ตัว Hibernate มันกำลังสร้าง Table และ Restore Default Data ให้ ลองสังเกตุดูจาก Log ได้้เลย
  • ลองมาดู Database activiti Table มีมาอื้อเลยครับ ดังรูป
  • ลองมาดู Database  activitiadmin Table มีมาอื้อเลยครับ ดังรูป

Step 4 : ทดสอบระบบนิดหน่อย

  • Activiti-App : ลอง Login เข้ามา พบ Default User ที่ระบบสร้างให้ ดังนี้
  • Activiti-Admin : Step แรกต้อง Set ให้มันเชื่อมต่อกับ Activiti-App ก่่อน
    • เข้ามาในส่วนของ End Point แก้ให้รู้จักกับ Activiti-App ถ้าเข้า Activi-App ผ่าน url ไหน ปรับ End Point ให้ตรงครับ เช่น  http://localhost:8080/activiti-app/ ดังรูป
    • พอตั้งค่าเสร็จ ลองมาดูใน Tab อื่นๆ พอ Demo Process ที่ถูก Deploy ไว้ครับ ดังรูป
  • Activiti-Rest : อันนี้ต้องใช้ Tools ช่วย โดยผมขอใช้ตัว Postman ครับ ซึ่งเรามีการกำหนด Request http://localhost:8080/activiti-rest/service/repository/deployments ส่วนค่าอิื่นๆ สามารถดูได้จากรูปได้เลย

Config อื่นๆที่่ควรรู้

  • แก้ไขไม่ให้ตัว Actvivi Framework – Auto Upgrade ตัว Database ในกรณีที่มีการเปลี่ยนเวอร์ชัน โดยต้องไปแก้ไขที่ engine.properties ซึ่งอยู่ใน Activit-Rest ดังนี้
    • เข้าไปที่  <CATALINA_HOME>/webapps/activiti-rest/WEB-INF/classes/ จากนั้นเปิดไฟล์ engine.properties โดยปรับแก้ Properties engine.schema.update ให้มีค่าเป็น false ตามตัวอย่างด้านล่าง
  • แก้ไขไม่ให้ตัว Actvivi Framework – ใส่ข้อมูล Demo ลงในระบบ โดยต้องไปแก้ไขที่ engine.properties ซึ่งอยู่ใน Activit-Rest ดังนี้
    • เข้าไปที่  <CATALINA_HOME>/webapps/activiti-rest/WEB-INF/classes/ จากนั้นเปิดไฟล์ engine.properties ถ้าไม่อยากให้ระบบมันสร้าง Demo Data ให้ เราสามารถเปลี่ยน properties ที่ต้องการให้มีค่าเป็น False ได้ครับ ตามตัวอย่างด้านล่าง ที่แก้ไข ไม่ให้ระบบใส่

[BPMN] ลง Eclipse Activiti Designer

Blog ช่วงนี้เป็นการสรุปลง Program ล้วนๆ เผื่อต้องมาทำเล่ม Project ตอนหลังจะได้ไม่ต้องระลึกชาติครับ สำหรับ Blog ตอนนี้เป็นการลงตัว BPMN 2.0 Designer บน Editor ยอดนิยมอย่าง Eclipse ครับ โดยการลงมีขั้นตอน ดังนี้

Step 1 : เตรียมตัว

  • Download Eclipse มาก่อนครับ ของผมใช้ Eclipse codename “Oxygen” ครับ สำหรับการ Download สิ่งที่แนะนำอย่าใช้ตัว “Eclipse installer by oomph” มันชอบไปทำ Cache ใน AppData ของ Windows สูญเสียเนื้อที่ไปครับ ถ้า SSD น้อยๆนี่ อาจจะตกใจได้แอบไปเก็บอะไรไม่รู้ เอาแบบ .zip มาแตกไฟล์ สบายใจกว่าครับ
  • URL ที่สำหรับ Download ควรเป็นอันนี้นะครับ http://www.eclipse.org/downloads/eclipse-packages/
  • อินเตอร์เนตสำหรับ Download Package

Step 2 : ติดตั้ง

  • เปิด Eclipse เลือก Workspace ให้เรียบร้อยครับ
  • จากนั้นไปที่เมนู Help >> Install New Software
  • กดปุ่ม Add จากนั้นทำการตั้งค่า ดังรูป

    • Name: Activiti BPMN 2.0 designer
    • Location: https://www.activiti.org/designer/update/
  • พอกด OK เสร็จ มัน List มาว่า เรากำลังลง Tools สำหรัีบสร้าง BPMN ของ Activiti ครับ จากนั้นกด Next
  • จากนั้นกด Next >> หน้าถัดมากด Next อีกทีครับ
  • จากนั้นเข้าหน้าจอ License Agreement เลือก Accept แล้วกด Finish ครับ
  • รอ Download ยาวๆไปครับ
  • ถ้าหากมีถามเรื่อง unsigned content กด Accept ไปครับ
  • พอลงเสร็จแล้ว Restart Eclipse ครับ

Step 3 : Test

  • พอ Eclipse เปิดอีกครั้ง ใช้เข้าไปที่เมนู File >> New Project มาดูใน Section ของ Activiti พบส่วนของ Activiti Project ดังรูป

[BPMN] ติดตั้ง Activiti Framework

หลังจาก Setup Apache Tomcat ไปแล้ว และรู้ Overview ของ Activiti ฺBPMN Framework คราวที่มาลงกันลองคิดตั้งกันคิดว่าครับ โดยมีขั้นตอน ดังนี้

Step 1 : เตรียมตัว

  • Setup Tomcat ให้พร้อมครับ ถ้าใครสงสัยสามารถไปอ่านได้จาก Blog ตอนนี้ ครับ
  • Download Activiti Framework มารอเลยครับ

Step 2 : แตกไฟล์ Activity Framework

  • หลังจาก Download มาเสร็จ ได้เป็นไฟล์ .zip มาครับ
  • ให้แตก Zip ออกมา โดยมีข้อมูลด้านใน ดังรูป

Step 3 : Deploy .War

  • เข้าไปที่โพลเดอร์ที่แตก Zip ออกมา จากนั้นเข้าไปทีโพลเดอร์ wars (ยกตัวอย่าง เช่น D:\activiti-6.0.0\wars ) โดยเราพบไฟล์ war 3 ไฟล์ ดังรูป
  • นำไฟล์ .war ทั้ง 3 ไปไว้ที่ CATALINA_HOME (Path ที่ติดตั้ง Tomcat อาทิ เช่น D:\tomcat_8.5.24 ) และเข้าไปที่โฟลเดอร์ webapps
  • จากนั้น Start Tomcat โดยผ่านไฟล์ startup.bat (Windows) หรือ startup.sh (Unix & Linux)
  • รอ Tomcat มัน Deploy ไฟล์ .war ทั้ง 3 ตัวครับ โดยสังเกตุได้จาก Log ดังนี้
    • Activiti-App

      This slideshow requires JavaScript.

    • Activiti-Admin

      This slideshow requires JavaScript.

    • Activiti-Rest

      This slideshow requires JavaScript.

  • หลังจากรอ Deploy มาสักพัก เมื่อเสร็จแล้ว ในโพลเดอร์ webapps มีตัว Web Apllication ของ Activiti-App, Activiti-Admin และ Activiti-Rest ถูกติดตั้งเรียบร้อยแล้วครับ
  • ซึ่งถ้าเข้าไปดูใน Tomcat Manager มีลักษณะ ดังนี้ครับ

Step 4 : Test Activiti Framework

  • Test Activiti-App

    This slideshow requires JavaScript.

    • โดยเข้าผ่าน URL http://localhost:8080/activiti-app/  ซึ่งมี Default Username admin และ Password test
  • Test Activiti-Admin

    This slideshow requires JavaScript.

    • โดยเข้าผ่าน URL http://localhost:8080/activiti-admin/ ซึ่งมี Default Username admin และ Password admin
  • Test Activiti-Rest

    • โดยเข้าผ่าน URL http://localhost:8080/activiti-rest ซึ่งมันขึ้นหน้าจอ Login มา แต่ตอนนี้ยังไม่สามารถใช้งานได้นะ
    • หมายเหตุ: ตัว Activiti-App ใช้ Database ร่วมกับ Activiti-Rest ซึ่งถ้าใช้ข้อมูล Demo ซึ่งเป็น H2 In-memory Database