Async Java Miracles - part 2, or why is my instance not found
Arun from Dubai (and I must admit I am very happy to have fellow readers in the Emirates) wrote in today asking about my note on implementing an Aysnc callback for the BPEL API.
In a nutshell, when he runs his code for an async process he gets the famous ORABPEL-02152
Instance not found error.
First - why does this happen?
When an async instance is created through the API (com.oracle.bpel.client.IDeliveryService:post()) it will be enqueued into the "Delivery Queue", waiting to be picked up by a worker. This guarantees that each message reaching that point cannot get not lost, but implies a natural latency (time from message enqueuing, to time when a worker picks it up to create a physical new instance).
So far the theory - lets get to the code (looks like I forgot to mention this in my previous part so I add the "missing" code piece here)
[..]
/**
* CONSTANT: OraBPEL-02152 - Instance not found error
*/
public static final int INSTANCE_NOT_FOUND = 2152;
[..]
try {
// try to find the process instance
IInstanceHandle handle =
_finder.lookupInstanceByConversationId
(_conversationId, _auth);
} catch (ServerException eServerLookupAndFind) {
int errorCode =
((ServerException)eServerLookupAndFind.
getRootCause()).getErrorCode();
// could be that we we are to fast for getting an
// handle on the first attempt, if not we break
if (errorCode != INSTANCE_NOT_FOUND) {
// this is a real one - rethrow
} else {
// this is the case where the instance was not
// found - implement retry here
}
} catch (RemoteException remoteException) {
// this is a real one - handle it!
}
[..]
Note the catch block, that deciffers the exception, in the case of a ServerException
we can be sure that it contains a root cause - including the error code. It represents the real BPEL error (it's an prmitive int - no OraBPEL though :D ).
With this code in place, you have a handle to make your async callback running smoothly.
Nevertheless it's worth to mention that, every time an instance is not found in the dehydration store you'll see a log entry in the server (domain logs) showing so.
0 Comments:
Post a Comment
<< Home