@@ -0,0 +1,3525 @@
+/*%0A * The MIT License (MIT)%0A *%0A * Copyright (c) 2016 Lachlan Dowding%0A *%0A * Permission is hereby granted, free of charge, to any person obtaining a copy%0A * of this software and associated documentation files (the %22Software%22), to deal%0A * in the Software without restriction, including without limitation the rights%0A * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell%0A * copies of the Software, and to permit persons to whom the Software is%0A * furnished to do so, subject to the following conditions:%0A *%0A * The above copyright notice and this permission notice shall be included in all%0A * copies or substantial portions of the Software.%0A *%0A * THE SOFTWARE IS PROVIDED %22AS IS%22, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR%0A * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,%0A * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE%0A * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER%0A * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,%0A * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE%0A * SOFTWARE.%0A */%0A%0Apackage permafrost.tundra.server.invoke;%0A%0Aimport com.wm.app.b2b.server.BaseService;%0Aimport com.wm.app.b2b.server.ISRuntimeException;%0Aimport com.wm.app.b2b.server.invoke.ServiceStatus;%0Aimport com.wm.data.IData;%0Aimport com.wm.util.ServerException;%0Aimport java.util.Iterator;%0A%0A/**%0A * Converts any exceptions thrown by a trigger service to be instances of ISRuntimeException to support being retried.%0A */%0Apublic class TriggerRetryProcessor extends AbstractInvokeChainProcessor %7B%0A    /**%0A     * Initialization on demand holder idiom.%0A     */%0A    private static class Holder %7B%0A        /**%0A         * The singleton instance of the class.%0A         */%0A        private static final TriggerRetryProcessor INSTANCE = new TriggerRetryProcessor();%0A    %7D%0A%0A    /**%0A     * Disallow instantiation of this class.%0A     */%0A    private TriggerRetryProcessor() %7B%7D%0A%0A    /**%0A     * Returns the singleton instance of this class.%0A     *%0A     * @return The singleton instance of this class.%0A     */%0A    public static TriggerRetryProcessor getInstance() %7B%0A        return Holder.INSTANCE;%0A    %7D%0A%0A    /**%0A     * Processes a service invocation: if invoked by a trigger, converts all exceptions thrown to be instances of%0A     * ISRuntimeException so that the service can be retried.%0A     *%0A     * @param iterator          Invocation chain.%0A     * @param baseService       The invoked service.%0A     * @param pipeline          The input pipeline for the service.%0A     * @param serviceStatus     The status of the service invocation.%0A     * @throws ServerException  If the service invocation fails.%0A     */%0A    @Override%0A    public void process(Iterator iterator, BaseService baseService, IData pipeline, ServiceStatus serviceStatus) throws ServerException %7B%0A        boolean isTrigger = Thread.currentThread().getName().startsWith(%22TriggerTask%22);%0A        if (isTrigger) %7B%0A            try %7B%0A                super.process(iterator, baseService, pipeline, serviceStatus);%0A            %7D catch(Throwable ex) %7B%0A                // convert all exceptions to be instances of ISRuntimeException%0A                if (ex instanceof ISRuntimeException) %7B%0A                    throw (ISRuntimeException)ex;%0A                %7D else %7B%0A                    throw new ISRuntimeException(ex);%0A                %7D%0A            %7D%0A        %7D else %7B%0A            super.process(iterator, baseService, pipeline, serviceStatus);%0A        %7D%0A    %7D%0A%7D%0A

Add TriggerRetryProcessor which converts all exceptions for a trigger invoked service to be instances of ISRuntimeException so that the service can be retried automatically by the trigger