class MethodDispatchStrategy extends AbstractDispatcher {

    public void dispatch(Notification notification) {

        try {
            // Try to send the message to the gateway
            sendNotification(notification);
        }
        catch (DispatchException e) {
           logger.error("Failed to dispatch notification: {}:", notification, e);
            // Send the task to the retry processor for later retry attempt
            instrumentFailedDispatch(notification.getMethod(), e);
            retryProcessor.retry(notification, e);
        }
        catch (DispatchUnsupportedByUserException | NoSuchProviderException e) {
            // Unable to dispatch notification, but should not be retried
           logger.error("Failed to dispatch notification: {}:", notification, e);
            instrumentFailedDispatch(notification.getMethod(), e);
            audit.log(notification, AuditEventState.ERROR, e);
        }
        catch (RuntimeException e) {
           logger.error("Failed unexpectedly during dispatch of notification {}:", notification, e);
            // Something unexpectedly catastrophic happened; terminal state
            instrumentFailedDispatch(notification.getMethod(), e);
            audit.log(notification, AuditEventState.FAILED, e);
        }
    }

    public  MethodDispatchStrategy(NotificationAuditor audit, RetryProcessor retryProcessor, RetryManager retryManager, NotificationProviderRegistry providerRegistry);

}