use of org.mule.runtime.core.internal.exception.MessagingException in project mule by mulesoft.
the class DefaultMessageProcessorChainTestCase method testErrorNotificationsMessagingException.
@Test
public void testErrorNotificationsMessagingException() throws Exception {
List<MessageProcessorNotification> notificationList = new ArrayList<>();
setupMessageProcessorNotificationListener(notificationList);
DefaultMessageProcessorChainBuilder builder = new DefaultMessageProcessorChainBuilder();
final CoreEvent messagingExceptionEvent = getTestEventUsingFlow("other");
final MessagingException messagingException = new MessagingException(messagingExceptionEvent, illegalStateException);
builder.chain(new ExceptionThrowingMessageProcessor(messagingException));
final CoreEvent inEvent = getTestEventUsingFlow("0");
try {
process(builder.build(), inEvent);
} catch (Throwable t) {
assertThat(t, instanceOf(IllegalStateException.class));
assertThat(notificationList, hasSize(2));
MessageProcessorNotification preNotification = notificationList.get(0);
MessageProcessorNotification postNotification = notificationList.get(1);
assertPreNotification(inEvent, preNotification);
assertThat(postNotification.getAction().getActionId(), equalTo(MESSAGE_PROCESSOR_POST_INVOKE));
// Existing MessagingException.event is updated to include error
assertThat(postNotification.getEvent(), not(messagingExceptionEvent));
assertPostErrorNotification(inEvent, postNotification);
}
}
use of org.mule.runtime.core.internal.exception.MessagingException in project mule by mulesoft.
the class FlowProcessingPhase method runPhase.
@Override
public void runPhase(final FlowProcessingPhaseTemplate flowProcessingPhaseTemplate, final MessageProcessContext messageProcessContext, final PhaseResultNotifier phaseResultNotifier) {
Runnable flowExecutionWork = () -> {
try {
FlowConstruct flowConstruct = registry.<FlowConstruct>lookupByName(messageProcessContext.getMessageSource().getRootContainerLocation().toString()).get();
try {
final AtomicReference exceptionThrownDuringFlowProcessing = new AtomicReference();
TransactionalExecutionTemplate<CoreEvent> transactionTemplate = createTransactionalExecutionTemplate(muleContext, messageProcessContext.getTransactionConfig().orElse(new MuleTransactionConfig()));
CoreEvent response = transactionTemplate.execute(() -> {
try {
Object message = flowProcessingPhaseTemplate.getOriginalMessage();
if (message == null) {
return null;
}
CoreEvent muleEvent = flowProcessingPhaseTemplate.getEvent();
muleEvent = flowProcessingPhaseTemplate.beforeRouteEvent(muleEvent);
muleEvent = flowProcessingPhaseTemplate.routeEvent(muleEvent);
muleEvent = flowProcessingPhaseTemplate.afterRouteEvent(muleEvent);
sendResponseIfNeccessary(messageProcessContext.getMessageSource(), flowConstruct, muleEvent, flowProcessingPhaseTemplate);
return muleEvent;
} catch (Exception e) {
exceptionThrownDuringFlowProcessing.set(e);
throw e;
}
});
if (exceptionThrownDuringFlowProcessing.get() != null && !(exceptionThrownDuringFlowProcessing.get() instanceof ResponseDispatchException)) {
sendResponseIfNeccessary(messageProcessContext.getMessageSource(), flowConstruct, response, flowProcessingPhaseTemplate);
}
flowProcessingPhaseTemplate.afterSuccessfulProcessingFlow(response);
} catch (ResponseDispatchException e) {
flowProcessingPhaseTemplate.afterFailureProcessingFlow(e);
} catch (MessagingException e) {
sendFailureResponseIfNeccessary(messageProcessContext.getMessageSource(), flowConstruct, e, flowProcessingPhaseTemplate);
flowProcessingPhaseTemplate.afterFailureProcessingFlow(e);
}
phaseResultNotifier.phaseSuccessfully();
} catch (Exception e) {
MuleException me = new DefaultMuleException(e);
try {
flowProcessingPhaseTemplate.afterFailureProcessingFlow(me);
} catch (MuleException e1) {
logger.warn("Failure during exception processing in flow template: " + e.getMessage());
if (logger.isDebugEnabled()) {
logger.debug("Failure during exception processing in flow template: ", e);
}
}
phaseResultNotifier.phaseFailure(e);
}
};
if (messageProcessContext.supportsAsynchronousProcessing()) {
try {
messageProcessContext.getFlowExecutionExecutor().execute(flowExecutionWork);
} catch (SchedulerBusyException e) {
phaseResultNotifier.phaseFailure(e);
}
} else {
flowExecutionWork.run();
}
}
use of org.mule.runtime.core.internal.exception.MessagingException in project mule by mulesoft.
the class ModuleFlowProcessingPhase method runPhase.
@Override
public void runPhase(final ModuleFlowProcessingPhaseTemplate template, final MessageProcessContext messageProcessContext, final PhaseResultNotifier phaseResultNotifier) {
try {
final MessageSource messageSource = messageProcessContext.getMessageSource();
final FlowConstruct flowConstruct = (FlowConstruct) componentLocator.find(messageSource.getRootContainerLocation()).get();
final ComponentLocation sourceLocation = messageSource.getLocation();
final Consumer<Either<MessagingException, CoreEvent>> terminateConsumer = getTerminateConsumer(messageSource, template);
final CompletableFuture<Void> responseCompletion = new CompletableFuture<>();
final CoreEvent templateEvent = createEvent(template, sourceLocation, responseCompletion, flowConstruct);
try {
FlowProcessor flowExecutionProcessor = new FlowProcessor(template, flowConstruct.getExceptionListener(), templateEvent);
flowExecutionProcessor.setAnnotations(flowConstruct.getAnnotations());
final SourcePolicy policy = policyManager.createSourcePolicyInstance(messageSource, templateEvent, flowExecutionProcessor, template);
final PhaseContext phaseContext = new PhaseContext(template, messageProcessContext, phaseResultNotifier, terminateConsumer);
just(templateEvent).doOnNext(onMessageReceived(template, messageProcessContext, flowConstruct)).flatMap(request -> from(policy.process(request))).flatMap(policyResult -> policyResult.reduce(policyFailure(phaseContext, flowConstruct, messageSource), policySuccess(phaseContext, flowConstruct, messageSource))).doOnSuccess(aVoid -> phaseResultNotifier.phaseSuccessfully()).doOnError(onFailure(flowConstruct, messageSource, phaseResultNotifier, terminateConsumer)).doAfterTerminate(() -> responseCompletion.complete(null)).subscribe();
} catch (Exception e) {
from(template.sendFailureResponseToClient(new MessagingExceptionResolver(messageProcessContext.getMessageSource()).resolve(new MessagingException(templateEvent, e), muleContext), template.getFailedExecutionResponseParametersFunction().apply(templateEvent))).doOnTerminate(() -> phaseResultNotifier.phaseFailure(e)).subscribe();
}
} catch (Exception t) {
phaseResultNotifier.phaseFailure(t);
}
}
use of org.mule.runtime.core.internal.exception.MessagingException in project mule by mulesoft.
the class BeginAndResolveTransactionInterceptor method execute.
@Override
public T execute(ExecutionCallback<T> callback, ExecutionContext executionContext) throws Exception {
byte action = transactionConfig.getAction();
int timeout = transactionConfig.getTimeout();
boolean resolveStartedTransaction = false;
Transaction tx = TransactionCoordination.getInstance().getTransaction();
if (action == TransactionConfig.ACTION_ALWAYS_BEGIN || (action == TransactionConfig.ACTION_BEGIN_OR_JOIN && tx == null)) {
if (logger.isDebugEnabled()) {
logger.debug("Beginning transaction");
}
executionContext.markTransactionStart();
tx = transactionConfig.getFactory().beginTransaction(muleContext);
// Timeout is a traversal attribute of all Transaction implementations.
// Setting it up here for all of them rather than in every implementation.
tx.setTimeout(timeout);
resolveStartedTransaction = true;
if (logger.isDebugEnabled()) {
logger.debug("Transaction successfully started: " + tx);
}
}
T result;
try {
result = next.execute(callback, executionContext);
resolveTransactionIfRequired(resolveStartedTransaction);
return result;
} catch (MessagingException e) {
if (processOnException) {
resolveTransactionIfRequired(resolveStartedTransaction || mustResolveAnyTransaction);
}
throw e;
}
}
use of org.mule.runtime.core.internal.exception.MessagingException in project mule by mulesoft.
the class SourceErrorException method toMessagingException.
public MessagingException toMessagingException(Collection<ExceptionContextProvider> exceptionContextProviders, MessageSource messageSource) {
MessagingException messagingException = new MessagingException(CoreEvent.builder(getEvent()).error(ErrorBuilder.builder(getCause()).errorType(getErrorType()).build()).build(), getCause());
EnrichedNotificationInfo notificationInfo = createInfo(messagingException.getEvent(), messagingException, null);
exceptionContextProviders.forEach(cp -> {
cp.getContextInfo(notificationInfo, messageSource).forEach((k, v) -> messagingException.getInfo().putIfAbsent(k, v));
});
return messagingException;
}
Aggregations