Maximo Open Forum

 View Only

 Maximo Integration - Skip inbound event with customized response

  • Everything Maximo
  • Integrations
Soroush Allahparast's profile image
Soroush Allahparast posted 06-14-2022 05:18
Hi,
I am looking for a solution that many other platforms have but I oddly don't find it in Maximo. There are times when my platform receives a Create event (SOAP) from another platform (sent to an enterprise service) but due to network problems Maximo's response doesn't reach its destination. The requester then sends another Create event and I end up with duplicate tickets with the same External ID. I can block/skip the second event using the platform tools / integration scripts but it doesn't solve the problem as the other platform remains blocked without the new ticket's ID.
The natural solution would be skipping the second event and sending instead a customized response containing the existing ticket's ID, but this kind of response doesn't seem to exist (please let me know if it does). I can only either accept the event or respond with an error which blocks the whole flow.
I know that there are a couple of workarounds, like changing the Create service to Sync (AddChange) and inserting the ticket's ID in the create event, essentially making it an update command, but I wanted to know if there exists a better solution to this. To be able to receive an integration event, analyze it before actually receiving it on the DB and if not OK, send a proper integration response (not a SOAP error) explaining the problem to the other platform.

Version: IBM Control Desk 7.6.1.2 (equivalent to Maximo 7.6.1.1)

Thanks,
Soroush
Prashant Sharma's profile image
Prashant Sharma
Hi Soroush,

So I understand correctly you have an enterprise web service that is being called by the external system and sometimes due to the n/w issue response from ICD doesn't reach to the external system? Every request in ICD will provide an HTTP Code in Response when successful it will be 200 and in case of any kind of error, it will give a code other than 200. How this external system knows whether it has to send that record again - does it look for a status code 200 and sends the record again if not received it again? or does it look for something else before it sends the data again to ICD?

Can you share what response are you sending from ICD first? Also if you are sending a response then what exactly do you want to send in that response which is not available today?

Thanks
Prashant
Soroush Allahparast's profile image
Soroush Allahparast
Hi Prashant,

"you have an enterprise web service that is being called by the external system and sometimes due to the n/w issue response from ICD doesn't reach to the external system?"

Yes, that is correct.

"Every request in ICD will provide an HTTP Code in Response when successful it will be 200 and in case of any kind of error, it will give a code other than 200. How this external system knows whether it has to send that record again - does it look for a status code 200 and sends the record again if not received it again? or does it look for something else before it sends the data again to ICD?"

Yes, it sends a request and awaits ICD's response (200 HTTP, with SOAP structure). If it doesn't receive a response after a certain Conn.Timeout (usually 1 min), it tries to send the event again and again until it gets a correct 200 response containing the ID it needs.

"Can you share what response are you sending from ICD first? Also if you are sending a response then what exactly do you want to send in that response which is not available today?"

It's a modified version of the standard ICD response. So when I receive the first call, I would respond with something like this:
<INCIDENT>
   <TICKETID>I-2326612</TICKETID>
   <RESULTMESSAGE>OK</RESULTMESSAGE>
</INCIDENT>

If the external system doesn't get this message and tries to resend me the Create event, I want to skip the event, not creating a new ticket, and send something like:
<INCIDENT>
   <TICKETID>I-2326612</TICKETID>    <- the same Ticket Id
   <RESULTMESSAGE>Ticket has already been created!</RESULTMESSAGE>
</INCIDENT>

so, an HTTP 200 response which lets the external system know what has happened and gives it the TicketID it needs instead of something like:
<ns0:Fault xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.w3.org/2003/05/soap-envelope">
   <faultcode>ns0:Server</faultcode>
   <faultstring>Ticket has already been created!</faultstring>
</ns0:Fault>

which blocks the whole flow. My understanding of the ICD is that, if I receive an event I either have to accept it and apply it, or give out an error. There's no accepting and not applying logic AFAIK. The workaround of passing the event as an update also comes to mind, but having a Create only service at hand makes it a bit difficult to implement.

Regards,
Prashant Sharma's profile image
Prashant Sharma

Hi- Ok, for this there is no OOB method available because you are already sending what is possible OOB.  You need to try handling this in response via Processing or User Exist Class.

Alternative, can you ask this external system to query the SR via WebService, and if there exist combination with then don't send again. This query has to be done everytime before it send the data. You'll also require some unique key to ensure external system can identify the record uniquely w/o any error. 

Thanks,

Prashant