final protected void eventPrecommitAdd(MessageItem msg, final TransactionCommon transaction) throws SIDiscriminatorSyntaxException, SIResourceException
    {
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
            SibTr.entry(tc, "eventPrecommitAdd", new Object[] { msg, transaction });

        if (!(_destination.isToBeDeleted()))
        {
            if (msg.isTransacted() && (!(msg.isToBeStoredAtSendTime())))
            {
                // LockR the destination to prevent reallocation from occurring on the chosen localisation
                LockManager reallocationLock = _destination.getReallocationLockManager();
                reallocationLock.lock();
                try
                {
                    // If we fixed the ME it'll be in the routing address in the message
                    SIBUuid8 fixedME = null;
                    JsDestinationAddress routingAddr = msg.getMessage().getRoutingDestination();
                    if (routingAddr != null)
                        fixedME = routingAddr.getME();

                    // If the sender prefers any local ME over others then we'll give it a go
                    SIBUuid8 preferredME = null;
                    if (msg.preferLocal())
                    {
                        if (_destination.hasLocal())
                            preferredME = _messageProcessor.getMessagingEngineUuid();
                    }
                    // 176658.3.5
                    OutputHandler handler = _destination.choosePtoPOutputHandler(fixedME,
                                                                                 preferredME,
                                                                                 !msg.isFromRemoteME(),
                                                                                 msg.isForcePut(),
                                                                                 null);

                    if (handler == null)
                    {
                        // We can't find a suitable localisation.
                        // Although a queue must have at least one localisation this is
                        // possible if the sender restricted the potential localisations
                        // using a fixed ME or a scoping alias (to an out-of-date set of
                        // localisation)

                        if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                        {
                            SibTr.debug(tc, "No suitable OutputHandler found for " + _destination.getName() + " (" + fixedME + ")");
                        }

                        //Put the message to the exception destination.
                        handleUndeliverableMessage(_destination
                                                   , null // null LinkHandler
                                                   , msg
                                                   , SIRCConstants.SIRC0026_NO_LOCALISATIONS_FOUND_ERROR
                                                   , new String[] { _destination.getName() }
                                                   , transaction);
                    }
                    else
                    {
                        //Indicate in the message if this was a guess
                        msg.setStreamIsGuess(handler.isWLMGuess());

                        // put the message to the output handler
                        handler.put(msg, transaction, null, true);
                    }
                } finally
                {
                    // unlock the reallocation lock
                    reallocationLock.unlock();
                }
            }
        }
        else
        {
            //The destination has been deleted.  Put the message to the exception destination#
            ExceptionDestinationHandlerImpl exceptionDestinationHandlerImpl =
                            (ExceptionDestinationHandlerImpl) _messageProcessor.createExceptionDestinationHandler(null);

            //Set indicator to send the message to the exception destination immediately,
            //rather than registering it for pre-prepare of the transaction, as this is
            //pre-prepare of the transaction!
            msg.setStoreAtSendTime(true);

            String destName = _destination.getName();
            if (_destination.isLink())
                destName = ((LinkHandler) _destination).getBusName();

            final UndeliverableReturnCode rc =
                            exceptionDestinationHandlerImpl.handleUndeliverableMessage(msg
                                                                                       , transaction
                                                                                       , SIRCConstants.SIRC0032_DESTINATION_DELETED_ERROR
                                                                                       , new String[] { destName,
                                                                                                       _messageProcessor.getMessagingEngineName() });
            if (rc != UndeliverableReturnCode.OK)
            {
                if (rc == UndeliverableReturnCode.DISCARD)
                {
                    //The message is to be discarded.  Do nothing and it will disappear.
                }
                else
                {
                    if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                        SibTr.exit(tc, "eventPrecommitAdd", "WsRuntimeException");
                    //We cannot put the message to the exception destination.  All we can
                    //do in this case is rollback the users transaction.  This is done by
                    //throwing an exception that is caught by the transaction manager.
                    throw new WsRuntimeException(
                                    nls.getFormattedMessage(
                                                            "DESTINATION_DELETED_ERROR_CWSIP0247",
                                                            new Object[] { _destination.getName(),
                                                                          rc },
                                                            null));
                }
            }
        }

        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
            SibTr.exit(tc, "eventPrecommitAdd");
    }
final protected void eventPrecommitAdd ( MessageItem msg , final TransactionCommon transaction ) throws SIDiscriminatorSyntaxException , SIResourceException { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEntryEnabled ( ) ) SibTr . entry ( tc , "eventPrecommitAdd" , new Object [ ] { msg , transaction } ) ; if ( ! ( _destination . isToBeDeleted ( ) ) ) { if ( msg . isTransacted ( ) && ( ! ( msg . isToBeStoredAtSendTime ( ) ) ) ) { LockManager reallocationLock = _destination . getReallocationLockManager ( ) ; reallocationLock . lock ( ) ; try { SIBUuid8 fixedME = null ; JsDestinationAddress routingAddr = msg . getMessage ( ) . getRoutingDestination ( ) ; if ( routingAddr != null ) fixedME = routingAddr . getME ( ) ; SIBUuid8 preferredME = null ; if ( msg . preferLocal ( ) ) { if ( _destination . hasLocal ( ) ) preferredME = _messageProcessor . getMessagingEngineUuid ( ) ; } OutputHandler handler = _destination . choosePtoPOutputHandler ( fixedME , preferredME , ! msg . isFromRemoteME ( ) , msg . isForcePut ( ) , null ) ; if ( handler == null ) { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isDebugEnabled ( ) ) { SibTr . debug ( tc , "No suitable OutputHandler found for " + _destination . getName ( ) + " (" + fixedME + ")" ) ; } handleUndeliverableMessage ( _destination , null , msg , SIRCConstants . SIRC0026_NO_LOCALISATIONS_FOUND_ERROR , new String [ ] { _destination . getName ( ) } , transaction ) ; } else { msg . setStreamIsGuess ( handler . isWLMGuess ( ) ) ; handler . put ( msg , transaction , null , true ) ; } } finally { reallocationLock . unlock ( ) ; } } } else { ExceptionDestinationHandlerImpl exceptionDestinationHandlerImpl = ( ExceptionDestinationHandlerImpl ) _messageProcessor . createExceptionDestinationHandler ( null ) ; msg . setStoreAtSendTime ( true ) ; String destName = _destination . getName ( ) ; if ( _destination . isLink ( ) ) destName = ( ( LinkHandler ) _destination ) . getBusName ( ) ; final UndeliverableReturnCode rc = exceptionDestinationHandlerImpl . handleUndeliverableMessage ( msg , transaction , SIRCConstants . SIRC0032_DESTINATION_DELETED_ERROR , new String [ ] { destName , _messageProcessor . getMessagingEngineName ( ) } ) ; if ( rc != UndeliverableReturnCode . OK ) { if ( rc == UndeliverableReturnCode . DISCARD ) { } else { if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEntryEnabled ( ) ) SibTr . exit ( tc , "eventPrecommitAdd" , "WsRuntimeException" ) ; throw new WsRuntimeException ( nls . getFormattedMessage ( "DESTINATION_DELETED_ERROR_CWSIP0247" , new Object [ ] { _destination . getName ( ) , rc } , null ) ) ; } } } if ( TraceComponent . isAnyTracingEnabled ( ) && tc . isEntryEnabled ( ) ) SibTr . exit ( tc , "eventPrecommitAdd" ) ; }
Method eventPrecommitAdd.

@param msg
@param transaction
@throws SIStoreException
@throws SIResourceException