The following bugs have been fixed in XMLink

Bug Number



BLOCKTIME support added for Tuxedo 6 since customers may want to use BLOCKTIME, in addition to (or instead of SVCTIMEOUT) to allow clients to recover from unforseen circumstances.


Note that we do not use blocking calls for Tuxedo 6, because while a call is being blocked, we cannot make other TAPI calls from other threads.  This is because the Tuxedo 6 libraries are not thread safe.


Added support for tpurcode(). User return code cna be used to return Tuxedo error codes from the server. This is needed because the server is used as a proxy for the client, in order to invoke services in a transactional context for Tuxedo 6.


In addition to support for Tuxedo.tpurcode(), Interaction.getWarnings() and Interaction.clearWarnings() can be used. These methods are part of the CCI interface, but were previously unused by our product. Now, whenever a non-zero user code is returned, a TuxedoReturnCodeWarning is created and added to the head of a linked list associated with the Interaction. TuxedoReturnCodeWarning extends ResourceWarning, and these can be chained. ResourceWarning implements setLinkedException() and getLinkedException(). Note that no Exception is thrown. They are simply added to the chain. Interaction.getWarnings() will return the head of the chain, which is the most recent ResourceWarning generated. It will return null if there are none. It can be reset to null by Interaction.clearWarnings(). The warnings are also cleared if you call Interaction.close(). TuxedoReturnCodeWarning implements getReturnCode(), which returns a long, and getInteractionSpec(), which returns the InteractionSpec instance associated with the service call that generated the return code. toString() can be used to generate a String of the form "<function-name> returned <code>." Note that the a TuxedoReturnCodeWarning will be generated for a non-zero user return code, regardless of whether TPSUCCESS or TPFAIL is returned by the service as well. Thus Interaction.getWarings() can be used directly after Interaction.execute() is called, as well as in an exception handler block.