Extract more common parts
diff --git a/modules/core/src/main/java/org/apache/synapse/message/processors/forward/ForwardingJob.java b/modules/core/src/main/java/org/apache/synapse/message/processors/forward/ForwardingJob.java
index e8a1670..d487247 100644
--- a/modules/core/src/main/java/org/apache/synapse/message/processors/forward/ForwardingJob.java
+++ b/modules/core/src/main/java/org/apache/synapse/message/processors/forward/ForwardingJob.java
@@ -255,9 +255,7 @@
         } else {
             // This Means we have invoked an out only operation
             // remove the message and reset the count
-            messageStore.poll();
-            processor.resetSentAttemptCount();
-            sendResponseToReplySeq(outCtx);
+            doPostSuccessTasks(outCtx);
         }
     }
 
@@ -279,38 +277,48 @@
         if (isHttpStatusCodeError(outCtx)) {
             if (isRetryHttpStatusCode(outCtx)) {
                 doPostErrorTasks(inMsgCtx, outCtx);
+            } else {
+                doPostSuccessTasks(outCtx);
             }
         } else {
             doPostErrorTasks(inMsgCtx, outCtx);
         }
     }
 
+    private void doPostSuccessTasks(MessageContext outCtx) {
+        messageStore.poll();
+        processor.resetSentAttemptCount();
+        sendResponseToReplySeq(outCtx);
+    }
+
     private void doPostErrorTasks(MessageContext inMsgCtx, MessageContext outCtx) {
         if (maxDeliverAttempts > 0) {
             processor.incrementSendAttemptCount();
         }
         sendItToFaultSequence(outCtx);
         if (maxDeliverAttempts > 0) {
-            if (processor.getSendAttemptCount() >= maxDeliverAttempts) {
+            handleMaxDeliveryAttempts(inMsgCtx);
+        }
+        errorStop = true;
+    }
+
+    private void handleMaxDeliveryAttempts(MessageContext inMsgCtx) {
+        if (processor.getSendAttemptCount() >= maxDeliverAttempts) {
+            if (isMaxDeliverAttemptDropEnabled) {
+                //Since explicitly enabled the message drop after max delivery attempt
+                // message has been removed and reset the delivery attempt count of the processor
+                processor.resetSentAttemptCount();
+                messageStore.poll();
+            } else {
                 deactivate(processor, inMsgCtx);
             }
         }
-        errorStop = true;
     }
 
     private boolean handleOutOnlyError(MessageContext inMsgCtx) {
         if (maxDeliverAttempts > 0) {
             processor.incrementSendAttemptCount();
-            if (processor.getSendAttemptCount() >= maxDeliverAttempts) {
-                if (isMaxDeliverAttemptDropEnabled) {
-                    //Since explicitly enabled the message drop after max delivery attempt
-                    // message has been removed and reset the delivery attempt count of the processor
-                    processor.resetSentAttemptCount();
-                    messageStore.poll();
-                } else {
-                    deactivate(processor, inMsgCtx);
-                }
-            }
+            handleMaxDeliveryAttempts(inMsgCtx);
         }
         return true;
     }