@Override public void run() { if (this.acceptOnExecution) { this.workListener.workAccepted(new WorkEvent(this, WorkEvent.WORK_ACCEPTED, this.work, null)); } synchronized (this.monitor) { this.started = true; this.monitor.notify(); } this.workListener.workStarted(new WorkEvent(this, WorkEvent.WORK_STARTED, this.work, null)); try { this.work.run(); } catch (RuntimeException | Error ex) { this.workListener.workCompleted( new WorkEvent(this, WorkEvent.WORK_COMPLETED, this.work, new WorkCompletedException(ex))); throw ex; } this.workListener.workCompleted(new WorkEvent(this, WorkEvent.WORK_COMPLETED, this.work, null)); }
@Override protected void runWork() throws WorkCompletedException { // if there is security and elytron is enabled, we need to let the context run the remainder of the work // so the context can run the work as the specified Elytron identity if (securityIntegration.getSecurityContext() != null && ((CallbackImpl) workManager.getCallbackSecurity()).isElytronEnabled()) ((ElytronSecurityContext) securityIntegration.getSecurityContext()).runWork(() -> { try { WildflyWorkWrapper.super.runWork(); } catch (WorkCompletedException e) { ConnectorLogger.ROOT_LOGGER.unexceptedWorkerCompletionError(e.getLocalizedMessage(),e); } }); // delegate to super class if there is no elytron enabled else super.runWork(); } }
@Override public final WorkCompletedException cannotResumeInflowTransactionUnexpectedError(final Transaction txn, final Work work, final Exception e) { final WorkCompletedException result = new WorkCompletedException(String.format(getLoggingLocale(), cannotResumeInflowTransactionUnexpectedError$str(), txn, work), e); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String cannotSuspendInflowTransactionUnexpectedError = "WFLYTX0038: Unexpected error on suspending transaction for work %s";
public void after(TransactionContext workContext) throws WorkCompletedException { if (workContext.getXid() != null) { try { xaWork.end(workContext.getXid()); } catch (XAException e) { throw (WorkCompletedException)new WorkCompletedException("Transaction end failed for xid " + workContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e); } catch (SystemException e) { throw (WorkCompletedException)new WorkCompletedException("Transaction end failed for xid " + workContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e); } } }
/** * Execute the specified Work. * * @param work Work to be executed. * @throws WorkException Indicates that the Work execution has been * unsuccessful. */ private void executeWork(WorkerContext work, WorkExecutor workExecutor, Executor pooledExecutor) throws WorkException { work.workAccepted(this); try { workExecutor.doExecute(work, pooledExecutor); WorkException exception = work.getWorkException(); if (null != exception) { throw exception; } } catch (InterruptedException e) { WorkCompletedException wcj = new WorkCompletedException( "The execution has been interrupted.", e); wcj.setErrorCode(WorkException.INTERNAL); throw wcj; } }
@Override public final WorkCompletedException importedInflowTransactionIsInactive(final Xid xid, final Work work, final Exception e) { final WorkCompletedException result = new WorkCompletedException(String.format(getLoggingLocale(), importedInflowTransactionIsInactive$str(), xid, work), e); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String cannotResumeInflowTransactionUnexpectedError = "WFLYTX0037: Unexpected error on resuming transaction %s for work %s";
public void before(TransactionContext workContext) throws WorkCompletedException { if (workContext.getXid() != null) { try { long transactionTimeout = workContext.getTransactionTimeout(); //translate -1 value to 0 to indicate default transaction timeout. xaWork.begin(workContext.getXid(), transactionTimeout < 0 ? 0 : transactionTimeout); } catch (XAException e) { throw (WorkCompletedException)new WorkCompletedException("Transaction import failed for xid " + workContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e); } catch (InvalidTransactionException e) { throw (WorkCompletedException)new WorkCompletedException("Transaction import failed for xid " + workContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e); } catch (SystemException e) { throw (WorkCompletedException)new WorkCompletedException("Transaction import failed for xid " + workContext.getXid(), WorkCompletedException.TX_RECREATE_FAILED).initCause(e); } catch (ImportedTransactionActiveException e) { throw (WorkCompletedException)new WorkCompletedException("Transaction already active for xid " + workContext.getXid(), WorkCompletedException.TX_CONCURRENT_WORK_DISALLOWED).initCause(e); } } }
/** * Execute the specified Work. * * @param work Work to be executed. * @exception WorkException Indicates that the Work execution has been * unsuccessful. */ private void executeWork(WorkerContext work, WorkExecutor workExecutor) throws WorkException { if (!isStarted()) { throw new IllegalStateException("This MuleWorkManager '" + name + "' is stopped"); } try { work.workAccepted(this); workExecutor.doExecute(work, workExecutorService); WorkException exception = work.getWorkException(); if (null != exception) { throw exception; } } catch (InterruptedException e) { WorkCompletedException wcj = new WorkCompletedException("The execution has been interrupted for WorkManager: " + name, e); wcj.setErrorCode(WorkException.INTERNAL); throw wcj; } }
@Override public void run() { if (this.acceptOnExecution) { this.workListener.workAccepted(new WorkEvent(this, WorkEvent.WORK_ACCEPTED, this.work, null)); } synchronized (this.monitor) { this.started = true; this.monitor.notify(); } this.workListener.workStarted(new WorkEvent(this, WorkEvent.WORK_STARTED, this.work, null)); try { this.work.run(); } catch (RuntimeException | Error ex) { this.workListener.workCompleted( new WorkEvent(this, WorkEvent.WORK_COMPLETED, this.work, new WorkCompletedException(ex))); throw ex; } this.workListener.workCompleted(new WorkEvent(this, WorkEvent.WORK_COMPLETED, this.work, null)); }
@Override public final WorkCompletedException cannotFindOrImportInflowTransaction(final Xid xid, final Work work, final Exception e) { final WorkCompletedException result = new WorkCompletedException(String.format(getLoggingLocale(), cannotFindOrImportInflowTransaction$str(), xid, work), e); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String importedInflowTransactionIsInactive = "WFLYTX0036: Imported jca inflow transaction with xid %s of work %s is inactive";
/** * setup transaction-work-context for the work * * @param tic transaction-context * @param listener listener that has to be notified */ private void setupTransactionWorkContext(TransactionContext tic, WorkContextLifecycleListener listener) throws WorkCompletedException { try { setupExecutionContext(tic); notifyContextSetupComplete(listener); } catch (Exception e) { notifyContextSetupFailure(listener, WorkContextErrorCodes.CONTEXT_SETUP_FAILED); //TODO WorkCompletedException wce = new WorkCompletedException(e.getMessage()); wce.initCause(e); throw wce; } }
WorkCompletedException wce = new WorkCompletedException(); wce.setErrorCode(WorkContextErrorCodes.DUPLICATE_CONTEXTS); logger.log(Level.WARNING, RAR_EXECUTION_CONTEXT_DUPLICATE, new Object[]{ic.getClass().getName(), wce}); notifyContextSetupFailure(listener, WorkContextErrorCodes.DUPLICATE_CONTEXTS); WorkCompletedException wce = new WorkCompletedException(); wce.setErrorCode(WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE); logger.log(Level.WARNING, RAR_EXECUTION_CONTEXT_NOT_SUPPORT, new Object[]{ic.getClass().getName(), wce}); notifyContextSetupFailure(listener, WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE);
@Override protected void runWork() throws WorkCompletedException { // if there is security and elytron is enabled, we need to let the context run the remainder of the work // so the context can run the work as the specified Elytron identity if (securityIntegration.getSecurityContext() != null && ((CallbackImpl) workManager.getCallbackSecurity()).isElytronEnabled()) ((ElytronSecurityContext) securityIntegration.getSecurityContext()).runWork(() -> { try { WildflyWorkWrapper.super.runWork(); } catch (WorkCompletedException e) { ConnectorLogger.ROOT_LOGGER.unexceptedWorkerCompletionError(e.getLocalizedMessage(),e); } }); // delegate to super class if there is no elytron enabled else super.runWork(); } }
throw new WorkCompletedException(jtaLogger.logMesg.getString("com.arjuna.ats.internal.jta.transaction.arjunacore.jca.busy"), WorkException.TX_CONCURRENT_WORK_DISALLOWED);
@Override public final WorkCompletedException importedInflowTransactionIsInactive(final Xid xid, final Work work, final Exception e) { final WorkCompletedException result = new WorkCompletedException(String.format(getLoggingLocale(), importedInflowTransactionIsInactive$str(), xid, work), e); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String cannotResumeInflowTransactionUnexpectedError = "WFLYTX0037: Unexpected error on resuming transaction %s for work %s";
/** * setup security work context for the work * * @param securityWorkContext security work context * @param listener listener to be notified * @param raName resource-adapter name */ private void setupSecurityWorkContext(SecurityContext securityWorkContext, WorkContextLifecycleListener listener, String raName) throws WorkCompletedException{ try { Subject executionSubject = new Subject(); Subject serviceSubject = new Subject(); //TODO need to populate with server's credentials ? //Map securityMap = getSecurityWorkContextMap(raName); Map securityMap = getWorkContextMap(raName); CallbackHandler handler = new ConnectorCallbackHandler(executionSubject, runtime.getCallbackHandler(), securityMap); securityWorkContext.setupSecurityContext(handler, executionSubject, serviceSubject); notifyContextSetupComplete(listener); } catch (Exception e) { logger.log(Level.WARNING, RAR_SETUP_SECURITY_CONTEXT_ERROR, e); notifyContextSetupFailure(listener, WorkContextErrorCodes.CONTEXT_SETUP_FAILED); WorkCompletedException wce = new WorkCompletedException(e.getMessage()); wce.initCause(e); throw wce; } }
final WorkCompletedException wce = new WorkCompletedException("Invalid ExecutionContext", WorkException.TX_RECREATE_FAILED); Tr.error(tc, "WTRN0091_ASSOCIATE_FAILED", new Object[] { null, null }); if (tc.isEntryEnabled()) Tr.exit(tc, "associate", "Invalid ExecutionContext"); final WorkCompletedException wce = new WorkCompletedException("Invalid Xid", WorkException.TX_RECREATE_FAILED); Tr.error(tc, "WTRN0091_ASSOCIATE_FAILED", new Object[] { ec, ec.getTransactionTimeout()}); if (tc.isEntryEnabled()) Tr.exit(tc, "associate", "Invalid Xid"); final WorkCompletedException wce = new WorkCompletedException(WorkException.TX_RECREATE_FAILED, e); Tr.error(tc, "WTRN0091_ASSOCIATE_FAILED", new Object[] { ec, ec.getTransactionTimeout()}); if (tc.isEntryEnabled()) Tr.exit(tc, "associate", wce); final WorkCompletedException wce = new WorkCompletedException("Already associated", WorkException.TX_RECREATE_FAILED); if (tc.isEntryEnabled()) Tr.exit(tc, "associate", "Already associated"); throw wce; final WorkCompletedException wce = new WorkCompletedException("Null providerId", WorkException.TX_RECREATE_FAILED); Tr.error(tc, "WTRN0091_ASSOCIATE_FAILED", new Object[] { ec, ec.getTransactionTimeout()}); if (tc.isEntryEnabled()) Tr.exit(tc, "associate", "Invalid providerId: " + providerId); final WorkCompletedException wce = new WorkCompletedException("Already have an association or already prepared", WorkException.TX_CONCURRENT_WORK_DISALLOWED); if (tc.isEntryEnabled()) Tr.exit(tc, "associate", "Already have an association or already prepared"); throw wce; final WorkCompletedException wce = new WorkCompletedException("resume threw InvalidTransactionException", e); wce.setErrorCode(WorkException.TX_RECREATE_FAILED); Tr.error(tc, "WTRN0091_ASSOCIATE_FAILED", new Object[] { ec, ec.getTransactionTimeout()}); if (tc.isEntryEnabled()) Tr.exit(tc, "associate", "resume threw InvalidTransactionException");
throw new WorkCompletedException(jtaLogger.i18NLogger.get_transaction_arjunacore_jca_busy(), WorkException.TX_CONCURRENT_WORK_DISALLOWED);
@Override public final WorkCompletedException cannotResumeInflowTransactionUnexpectedError(final Transaction txn, final Work work, final Exception e) { final WorkCompletedException result = new WorkCompletedException(String.format(getLoggingLocale(), cannotResumeInflowTransactionUnexpectedError$str(), txn, work), e); final StackTraceElement[] st = result.getStackTrace(); result.setStackTrace(Arrays.copyOfRange(st, 1, st.length)); return result; } private static final String cannotSuspendInflowTransactionUnexpectedError = "WFLYTX0038: Unexpected error on suspending transaction for work %s";
for (WorkContextHandler workContextHandler: sortedHandlers) { if (workContextHandler.supports(workContext.getClass())) { throw new WorkCompletedException("Duplicate WorkContext: " + workContext, WorkContextErrorCodes.DUPLICATE_CONTEXTS); throw new WorkCompletedException("Unhandled WorkContext: " + workContext, WorkContextErrorCodes.UNSUPPORTED_CONTEXT_TYPE); workException = (WorkException) (e instanceof WorkCompletedException ? e : new WorkCompletedException("Unknown error", WorkCompletedException.UNDEFINED).initCause(e)); workListener.workCompleted(new WorkEvent(this, WorkEvent.WORK_REJECTED, adaptee, workException));