Source: https://edwin.baculsoft.com/2020/06/creating-a-rest-api-call-with-workitemhandler-on-red-hat-process-automation-manager/
Usually we are using tasks for showing steps of process on top of Red Hat Process Automation Manager (RHPAM). But most of the time we need a customized task involved, thats where WorkItemHandler comes in handy.
For this demo, im trying to create a simple WorkItemHandler to create a custom task on top of RHPAM which is getting some response from a third party api provider.
So here is pretty much the raw concept,
As usual, for beginning we need to create a pom xml file, and it is important to put “scope” variable as provided.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <? xml version = "1.0" encoding = "UTF-8" ?> < project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > < modelVersion >4.0.0</ modelVersion > < groupId >com.edw</ groupId > < artifactId >AnimeWorkItemHandler</ artifactId > < version >1.0.4</ version > < description >a simple rest api to be used within RHPAM</ description > < packaging >jar</ packaging > < properties > < maven.compiler.source >1.8</ maven.compiler.source > < maven.compiler.target >1.8</ maven.compiler.target > </ properties > < distributionManagement > < repository > < id >repo-custom</ id > < url >http://nexus:8081/repository/pam/</ url > </ repository > < snapshotRepository > < id >repo-custom</ id > < url >http://nexus:8081/repository/pam/</ url > </ snapshotRepository > </ distributionManagement > < dependencies > < dependency > < groupId >org.jbpm</ groupId > < artifactId >jbpm-flow</ artifactId > < version >7.38.0.Final</ version > < scope >provided</ scope > </ dependency > < dependency > < groupId >org.codehaus.jackson</ groupId > < artifactId >jackson-core-asl</ artifactId > < version >1.9.9</ version > < scope >provided</ scope > </ dependency > < dependency > < groupId >org.codehaus.jackson</ groupId > < artifactId >jackson-mapper-asl</ artifactId > < version >1.9.9</ version > < scope >provided</ scope > </ dependency > < dependency > < groupId >org.codehaus.jackson</ groupId > < artifactId >jackson-xc</ artifactId > < version >1.9.9</ version > < scope >provided</ scope > </ dependency > </ dependencies > </ project > |
and simple java class to do a simple REST Api call,
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package com.edw; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.List; import org.codehaus.jackson.map.ObjectMapper; import org.drools.core.process.instance.WorkItemHandler; import org.kie.api.runtime.process.WorkItem; import org.kie.api.runtime.process.WorkItemManager; public class AnimeWorkItemHandler implements WorkItemHandler { public void abortWorkItem(WorkItem wi, WorkItemManager wim) { wim.abortWorkItem(wi.getId()); } // will try fire to https://jikan.moe/ api public void executeWorkItem(WorkItem wi, WorkItemManager wim) { String name = (String) wi.getParameter( "name" ); String nameResponse = "" ; String imageUrl = "" ; try { // api endpoint = https://api.jikan.moe/v3/search/character?q=???&limit=1 URL url = new URL(String.format( "https://api.jikan.moe/v3/search/character?q=%s&limit=1" , name)); URLConnection urlConnection = url.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( urlConnection.getInputStream())); String inputLine; StringBuffer stringBuffer = new StringBuffer(); while ((inputLine = in.readLine()) != null ) { stringBuffer.append(inputLine); } ObjectMapper objectMapper = new ObjectMapper(); HashMap jsonResult = objectMapper.readValue(stringBuffer.toString(), HashMap. class ); List<HashMap> results = (List<HashMap>) jsonResult.get( "results" ); nameResponse = (String) results.get( 0 ).get( "name" ); imageUrl = (String) results.get( 0 ).get( "image_url" ); in.close(); } catch (Exception e) { e.printStackTrace(); } HashMap result = new HashMap(); result.put( "nameResponse" , nameResponse); result.put( "imageUrl" , imageUrl); wim.completeWorkItem(wi.getId(), result); } } |
Once created, we need to build it by using an mvn command
1 | mvn clean package |
After jar has been build, next step is to upload that jar thru your Business Central,
If uploading success, we can see the uploaded jar file within our Nexus
Next is lets go to RHPAM dashboard, and create a work item definition
And put this values, make sure that the content of “parameters” and “result” is the same as on your java class, which in my case is “name”, “nameResponse” and “imageUrl”.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | [ [ "name" : "AnimeWorkItemHandler", "parameters" : [ "name" : new StringDataType() ], "results" : [ "nameResponse" : new StringDataType(), "imageUrl" : new StringDataType() ], "displayName" : "AnimeWorkItemHandler", "icon" : "" ] ] |
The next step, and pehaps the most important is, include our newly created jar file into RHPAM project. We can do so by going thru “Settings” tab, and create a new Work Item Handlers,
And import the library and dependency needed
The last is adding our new WorkItemHandler to our existing workflow,
So as you can see, it’s not that difficult to create a custom task on RHPAM. And for the full code for this project can be accessed on my github page,
1 | https://github.com/edwin/anime-work-item-handler |