หลังจากงมๆมานานพอสมควรแล้วกับการใช้งาน Service Task กับ Web Service กับ Camunda BPMN Engine ครับ โดยสิ่งที่ผมใช้ คือ ตัว Camunda Connector ที่ช่วยให้เราสามารถ Config Web Service ได้ง่าย ไม่ต้องส่งงานให้ Delegate Code อย่าง BPMN Engine ของค่ายอื่นๆครับ สำหรับ
NOTE: สำหรับเรื่อง Service Task ตัว Spec ของ BPMN ไม่ได้ระบุใน Spec ชัดเจน ว่าต้องมีขั้นตอนการทำงานอย่างไร จึงเปิดให้ BPMN Engine แต่ละเจ้าสามารถเสริมเติมแต่ง Feature ได้เต็มที่ครับ
Camunda Connector
มี 3 รูปแบบ อ้างอิงจากเวอร์ชันที่ 7.9.0 ได้แก่
- HTTP Connector - พวก REST API ทั้งหลาย ใช้วิธี GET / POST และอื่นๆ แล้วเอา XML หรือ JSON มาใช้งานต่อ
- SOAP Connector - พวก WSDL หรือ SOAP แบบเดิม
- Custom - เขียน Code แล้วจัดการเองเลย
หลังจากเกริ่นนำได้ทดสอบ ตัว Connector แต่ละตัวกันแล้ว ตอนนี้มาดูตัวอย่างดีกว่าครับ โดยตัวอย่างที่ผมเขียนเป็นการใช้งาน HTTP Connector โดยใช้วิธี GET และผลลัพธ์ที่ได้ออกมาเป็นไฟล์ JSON ครับ เอาหละมาดูกันเลย ว่าเรา HTTP Connector แบบต้องใส่อะไรไปบ้าง
- url => บอกว่าให้ไปเอาข้อมูลมาจาก Domain ไหน อะไร ถ้าเป็นแบบ GET ต้องยัด Parameter ลงไปในนี้ด้วยครับ
- method => อันนี้กำหนดเป็น GET
- header => บอกว่า Request ของเรามีอะไรบ้าง โดยกำหนดเป็น Key
- key => Accept
- value => application/json - payload => ไม่จำเป็นสำหรับ Method GET นะครับ ใส่เข้าไป จากการที่ลองไล่ Code ดูมันไม่ได้สนใจนะครับ
ตัวอย่าง Process ของการดึงข้อมูลของกระทู้
มาดูตัวอย่างกันบ้างดีกว่าครับ โดยผมทำเป็น Process ของการดึงข้อมูลของกระทู้ครับ
- ข้อมูลจะถูก Mock มาจาก Open Source จาก https://jsonplaceholder.typicode.com/ อันนี้ผมเอาข้อมูล Mock จากตัว Web เลยครับ โดยใช้ URL https://jsonplaceholder.typicode.com/posts ซึ่งข้อมูลที่ได้มีผลลัพธ์ ดังนี้
[ { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" }, { "userId": 1, "id": 2, "title": "qui est esse", "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla" }, { "userId": 1, "id": 3, "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut", "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut" }, { "userId": 1, "id": 4, "title": "eum et est occaecati", "body": "ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit" }, { "userId": 1, "id": 5, "title": "nesciunt quas odio", "body": "repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque" }, ....
- Note: แต่เราสนใจเฉพาะ Id นะครับ ไม่ได้ ดึงมาหมด ดังนี้ URL อยู่ในรูป
https://jsonplaceholder.typicode.com/posts/<POST-ID>
{ "userId": 1, "id": 2, "title": "qui est esse", "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla" }
- ตัว BPMN Process - เดี๋ยวจะกล่าวในช่วงถัดไปครับ
มาเจาะลึกที่ BPMN Process ครับ
ในตัว BPMN ของเราประกอบด้วย Task ย่อย 3 Task ครับ
- Task "Enter Post Id"
เป็น User Task ให้ User กรอก Id ของ Post ที่ต้องการเรียกดูครับ
- Task "Test REST-API (GET)"
สำหรับ Task นี้ เป็น Service Task ครับ โดย Task นี้เป็นพระเอกเลยครับ เพราะใช้เชื่อมกับ Web Service ครับ โดยมีกำหนด Config เป็น Connector
- ภาพรวมของข้างในของ Connector
มาดูที่ส่วน Input ของตัว Connector ครับ มีจุดย่อยๆที่เราต้องมาทำความเข้า ดังนี้ครับ
- Connector-Id : ต้องเป็น http-connector เท่านั้น ห้ามตั้งชื่อเองนะครับ Engine ไม่รู้จัก
- URL - สังเกตุว่า ผมไม่ได้ Map เป็น Text ครับ ผมใช้เป็น Script แทน เพราะต้องการเอา Post Id เช่น 1 จากตัวแปรของ Process ${PostId} มาใส่ต่อท้าย URL ตามคำสั่ง ดังนี้
"https://jsonplaceholder.typicode.com/posts/${PostId}".toString()
ภาพรวมของ URL
- ส่วน Method
- ส่วน Header
- การจัดการ Output ครับ - ผลลัพธ์ของ Web Service อยู่ในรูปของ JSON ซึ่งผมจะเก็บไว้ใน postResult ครับ
เนื่องจาก ผมต้องการเอาผลลัพธ์ที่เป็น JSON มายังลงใน Variable ของ Process ครับ เพื่อเอาไปแสดงผลใน Task ถัดไปครับ เลยต้องทำเป็น Script เพื่อกำหนดค่าครับ
import groovy.json.JsonSlurper; jsonResponse= connector.getVariable("response"); out:println "jsonResponse :" + jsonResponse.getClass(); JsonSlurper jsonSlurper = new JsonSlurper(); Object result = jsonSlurper.parseText(jsonResponse); //Convert to MAP Map jsonResponseMap = (Map)result ; //Step Value to Process Engine connector.setVariable('userId', jsonResponseMap.get("userId")); connector.setVariable('id', jsonResponseMap.get("id")); connector.setVariable('title', jsonResponseMap.get("title")); connector.setVariable('body', jsonResponseMap.get("body")); //Return JSON to outpur variable postResult = result;
- Task "View Result"
เอาผลลัพธ์ที่ได้มาแสดงผลครับ โดยมีการ Config ดังนี้
- BPMN Model สามารถดูได้จาก GitHub เลยครับ
ทดสอบครับ
- Task "Enter Post Id" : ดึงข้อมูลของ Post Id 2
- Task "Test REST-API (GET)" : หน้าที่ของ Engine ทำครับ เราต้องจัดการอะไร
- Task "View Result" : ข้อมูลขึ้นเรียบร้อยครับ
จบไปแล้วกับการงมๆ Web Service กับ BPMN ครับ โดยผมคิดว่าคงใช้ json-server ซึ่งเป็น Standalone JSON Mock REST-API มาใช้ทำ Thesis ครับ
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.