K2 Workflow Error Retry with Coding

มีหลายคนเคยถามว่า เราจะรู้ได้ยังไงถ้า workflow เกิด error ขึ้นมา…

คำตอบง่ายๆ เลยคือ เข้าไปดูใน K2 Management Site ซิ หรือถ้าใครใช้ K2 version เก่าก่อนหน้า K2 4.7 ก็เข้าไปดูได้ใน K2 workspace => Management Console เอา

หน้าตาของ K2 Management Site ก็ตามด้านล่างนี่ล่ะ

K2 Management Site

ซึ่งใน K2 Management Site เราสามารถกดเข้าไปดู error ได้ใน Workflow Server => Errors จะมี list ของ error ที่เกิดใน workflow ขึ้นมาให้ดู

K2 Workflow Error Profile

คำถามถัดไปที่ส่วนใหญ่ถามก็คือ แล้วจะรู้ได้ยังไงว่า error เมื่อไหร่ แล้วทำให้ auto fix error ได้ไหม แยกตอบเป็นข้อๆ ตามด้านล่างคือ

  • Error เมื่อไหร่ => out of the box feature นั้นไม่มี แต่เราสามารถทำระบบแจ้งเตือนขึ้นมาเองได้
  • Auto fix error ได้ไหม => ต้องอธิบายเพิ่มเติมว่า K2 มีคำสั่งในการ retry ให้ workflow ลองทำงานที่ error อีกครั้ง ถ้าครั้งนี้ไม่ error workflow ก็จะทำงานต่อ error ก็จะหายไป แต่ถ้า retry แล้วยัง error ก็จะไม่หายครับ และเหมือนเดิม out of the box feature ไม่มี auto retry แต่เราทำเพิ่มได้เหมือนกัน

ก่อนที่จะไปทำ เรามาดู concept กันก่อน

ในการเชื่อมต่อกับ K2 เราแบ่งการเชื่อมต่อตามประเภทของหน้าที่ได้เป็น 2 แบบ คือ

  • แบบ User => ทำงานของตัวเอง
  • แบบ Administrator => จัดการงานของคนอื่น เหมือนที่เราทำใน K2 Management Site

ดังนั้นที่เราจะทำ auto error retry ก็จะทำด้วยแบบ Administrator โดย concept ของการทำจะเป็นตามด้านล่าง

  • Search error จาก error profile => โดยปกติ K2 จะมี error profile มาให้แล้ว 1 อันคือ “All” ถ้าอยากสร้างเพิ่มก็ได้ โดยกำหนดชื่อ workflow ที่เราจะเอามาสร้าง แต่ใน blog นี้เราเอาแบบง่ายสุดคือ ใช้ของที่เขามี
  • เมื่อได้ error มาแล้ว ก็ไปสั่ง retry error

เอาล่ะมาลงมือกันเลย

อย่างแรกเลยคือ ต้อง reference dll SourceCode.Workflow.Management.dll กับ SourceCode.HostClientAPI.dll จาก {Install Dir}\K2 blackpearl\bin

ประกาศ class WorkflowManagementServer ขึ้นมาก่อน

SourceCode.Workflow.Management.WorkflowManagementServer wfmServer = new SourceCode.Workflow.Management.WorkflowManagementServer();

สร้าง connection string เพื่อต่อกับ K2 server

SourceCode.Hosting.Client.BaseAPI.SCConnectionStringBuilder connectionString = new SourceCode.Hosting.Client.BaseAPI.SCConnectionStringBuilder();
connectionString.Host = “Your Server”;
connectionString.Integrated = true;
connectionString.IsPrimaryLogin = true;
connectionString.Port = 5252;

เปิด connection ไปที่ K2 server

wfmServer.CreateConnection();
wfmServer.Connection.Open(connectionString.ToString());

ทำการ search error profile จะได้ list ของ error profile ทั้งหมดออกมา

int errorProfileID = wfmServer.GetErrorProfile(“All”).ID;
SourceCode.Workflow.Management.ErrorLogs errorLogs = wfmServer.GetErrorLogs(errorProfileID);

เมื่อได้ list เราก็สามารถไปสั่ง retry error ได้ ที่ต้องมี checkCount ไว้ทำการเบรค loop ด้วย เพราะใน official document แจ้งว่า ไม่ควรสั่ง retry error ทีละมากๆ พร้อมกัน

foreach (SourceCode.Workflow.Management.ErrorLog errorLog in errorLogs)
{
if (checkCount == 10)
{
Thread.Sleep(10000);
checkCount = 0;
}
//to repair an IPC error, determine the error Type and call the appropriate method, e.g.
if (errorLog.TypeID == 20)
{
errorLog.LoadIPCErrorDetails(wfmServer);
wfmServer.RepairIPCError(errorLog.ID, errorLog.IPCErrorDetails.Server, errorLog.IPCErrorDetails.Port, errorLog.IPCErrorDetails.ConnectionString, errorLog.IPCErrorDetails.Process);
}
else
{
//to repair a general (non-IPC) error:
wfmServer.RetryError(errorLog.ProcInstID, errorLog.ID, Thread.CurrentPrincipal.Identity.ToString());
}
checkCount++;
}

แถมท้าย…

จากด้านบนเราทำ auto retry error ได้แล้ว แต่ก็สามารถต่อยอดได้อีก โดยอาจจะเอาไปทำเป็น application สำหรับส่ง list ของ error ให้ผู้ดูแล workflow นั้นๆ หรือตั้งเวลาให้ทำการ auto retry error ทุกๆ วันตามเวลาที่ต้องการ พร้อมทั้งส่งผลสรุปให้ผู้ดูแล workflow ด้วยก็ได้

ถ้าเราใช้ K2 4.7 หรือสูงกว่า เราสามารถใช้การตั้งเวลา start workflow เพื่อสั่งให้ workflow ทำงานตามเวลาที่เราต้องการก็ได้ โดยที่ไม่ต้องเขียนเป็นพวก windows services

Auto Error Retry Workflow

ถ้าใครอยากได้ application ที่มีความสามารถ

  • กำหนดผู้ดูแล workflow และส่ง email สรุป error ที่เกิดขึ้นรายวัน
  • ทำ auto error retry ให้ และส่ง email สรุปผล

สามารถติดต่อได้ที่ staff K2 ที่ท่านรู้จักนะครับ หรือจะเขียนเองโดยใช้ idea ตามด้านบนก็ได้ครับ :)