public String getMessage() { StringBuffer errorMessage = new StringBuffer(); errorMessage.append("collected "); errorMessage.append(exceptions.size()); errorMessage.append(" exception(s):"); for (int i = 0; i < exceptions.size(); i++) { errorMessage.append(System.getProperty("line.separator")); Throwable throwable = (Throwable) exceptions.get(i); String message = throwable.getMessage(); XAResourceHolderState holderState = (XAResourceHolderState) resourceStates.get(i); if (holderState != null) { errorMessage.append(" ["); errorMessage.append(holderState.getUniqueName()); errorMessage.append(" - "); } errorMessage.append(throwable.getClass().getName()); if (throwable instanceof XAException) { XAException xaEx = (XAException) throwable; errorMessage.append("("); errorMessage.append(Decoder.decodeXAExceptionErrorCode(xaEx)); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaEx); if (extraErrorDetails != null) errorMessage.append(" - ").append(extraErrorDetails); errorMessage.append(")"); } errorMessage.append(" - "); errorMessage.append(message); errorMessage.append("]"); } return errorMessage.toString(); }
/** * Create the exception analyzer. * @return the exception analyzer. */ public static ExceptionAnalyzer getExceptionAnalyzer() { ExceptionAnalyzer analyzer = exceptionAnalyzerRef.get(); if (analyzer == null) { String exceptionAnalyzerName = getConfiguration().getExceptionAnalyzer(); analyzer = new DefaultExceptionAnalyzer(); if (exceptionAnalyzerName != null) { try { analyzer = (ExceptionAnalyzer) ClassLoaderUtils.loadClass(exceptionAnalyzerName).newInstance(); } catch (Exception ex) { log.warn("failed to initialize custom exception analyzer, using default one instead", ex); } } if (!exceptionAnalyzerRef.compareAndSet(null, analyzer)) { analyzer.shutdown(); analyzer = exceptionAnalyzerRef.get(); } } return analyzer; }
errorMessage.append("("); errorMessage.append(Decoder.decodeXAExceptionErrorCode(xaEx)); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaEx); if (extraErrorDetails != null) errorMessage.append(" - ").append(extraErrorDetails); errorMessage.append(")");
/** * Create the exception analyzer. * @return the exception analyzer. */ public static ExceptionAnalyzer getExceptionAnalyzer() { ExceptionAnalyzer analyzer = exceptionAnalyzerRef.get(); if (analyzer == null) { String exceptionAnalyzerName = getConfiguration().getExceptionAnalyzer(); analyzer = new DefaultExceptionAnalyzer(); if (exceptionAnalyzerName != null) { try { analyzer = (ExceptionAnalyzer) ClassLoaderUtils.loadClass(exceptionAnalyzerName).newInstance(); } catch (Exception ex) { log.warn("failed to initialize custom exception analyzer, using default one instead", ex); } } if (!exceptionAnalyzerRef.compareAndSet(null, analyzer)) { analyzer.shutdown(); analyzer = exceptionAnalyzerRef.get(); } } return analyzer; }
public String getMessage() { StringBuilder errorMessage = new StringBuilder(); errorMessage.append("collected "); errorMessage.append(exceptions.size()); errorMessage.append(" exception(s):"); for (int i = 0; i < exceptions.size(); i++) { errorMessage.append(System.getProperty("line.separator")); Throwable throwable = exceptions.get(i); String message = throwable.getMessage(); XAResourceHolderState holderState = resourceStates.get(i); if (holderState != null) { errorMessage.append(" ["); errorMessage.append(holderState.getUniqueName()); errorMessage.append(" - "); } errorMessage.append(throwable.getClass().getName()); if (throwable instanceof XAException) { XAException xaEx = (XAException) throwable; errorMessage.append("("); errorMessage.append(Decoder.decodeXAExceptionErrorCode(xaEx)); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaEx); if (extraErrorDetails != null) errorMessage.append(" - ").append(extraErrorDetails); errorMessage.append(")"); } errorMessage.append(" - "); errorMessage.append(message); errorMessage.append("]"); } return errorMessage.toString(); }
/** * Create the exception analyzer. * @return the exception analyzer. */ public static ExceptionAnalyzer getExceptionAnalyzer() { ExceptionAnalyzer analyzer = exceptionAnalyzerRef.get(); if (analyzer == null) { String exceptionAnalyzerName = getConfiguration().getExceptionAnalyzer(); analyzer = new DefaultExceptionAnalyzer(); if (exceptionAnalyzerName != null) { try { analyzer = (ExceptionAnalyzer) ClassLoaderUtils.loadClass(exceptionAnalyzerName).newInstance(); } catch (Exception ex) { log.warn("failed to initialize custom exception analyzer, using default one instead", ex); } } if (!exceptionAnalyzerRef.compareAndSet(null, analyzer)) { analyzer.shutdown(); analyzer = exceptionAnalyzerRef.get(); } } return analyzer; }
public String getMessage() { StringBuilder errorMessage = new StringBuilder(); errorMessage.append("collected "); errorMessage.append(exceptions.size()); errorMessage.append(" exception(s):"); for (int i = 0; i < exceptions.size(); i++) { errorMessage.append(System.getProperty("line.separator")); Throwable throwable = exceptions.get(i); String message = throwable.getMessage(); XAResourceHolderState holderState = resourceStates.get(i); if (holderState != null) { errorMessage.append(" ["); errorMessage.append(holderState.getUniqueName()); errorMessage.append(" - "); } errorMessage.append(throwable.getClass().getName()); if (throwable instanceof XAException) { XAException xaEx = (XAException) throwable; errorMessage.append("("); errorMessage.append(Decoder.decodeXAExceptionErrorCode(xaEx)); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaEx); if (extraErrorDetails != null) errorMessage.append(" - ").append(extraErrorDetails); errorMessage.append(")"); } errorMessage.append(" - "); errorMessage.append(message); errorMessage.append("]"); } return errorMessage.toString(); }
/** * Create the exception analyzer. * @return the exception analyzer. */ public static ExceptionAnalyzer getExceptionAnalyzer() { ExceptionAnalyzer analyzer = exceptionAnalyzerRef.get(); if (analyzer == null) { String exceptionAnalyzerName = getConfiguration().getExceptionAnalyzer(); analyzer = new DefaultExceptionAnalyzer(); if (exceptionAnalyzerName != null) { try { analyzer = (ExceptionAnalyzer) ClassLoaderUtils.loadClass(exceptionAnalyzerName).newInstance(); } catch (Exception ex) { log.warn("failed to initialize custom exception analyzer, using default one instead", ex); } } if (!exceptionAnalyzerRef.compareAndSet(null, analyzer)) { analyzer.shutdown(); analyzer = exceptionAnalyzerRef.get(); } } return analyzer; }
public String getMessage() { StringBuffer errorMessage = new StringBuffer(); errorMessage.append("collected "); errorMessage.append(exceptions.size()); errorMessage.append(" exception(s):"); for (int i = 0; i < exceptions.size(); i++) { errorMessage.append(System.getProperty("line.separator")); Throwable throwable = (Throwable) exceptions.get(i); String message = throwable.getMessage(); XAResourceHolderState holderState = (XAResourceHolderState) resourceStates.get(i); if (holderState != null) { errorMessage.append(" ["); errorMessage.append(holderState.getUniqueName()); errorMessage.append(" - "); } errorMessage.append(throwable.getClass().getName()); if (throwable instanceof XAException) { XAException xaEx = (XAException) throwable; errorMessage.append("("); errorMessage.append(Decoder.decodeXAExceptionErrorCode(xaEx)); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaEx); if (extraErrorDetails != null) errorMessage.append(" - ").append(extraErrorDetails); errorMessage.append(")"); } errorMessage.append(" - "); errorMessage.append(message); errorMessage.append("]"); } return errorMessage.toString(); }
errorMessage.append("("); errorMessage.append(Decoder.decodeXAExceptionErrorCode(xaEx)); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaEx); if (extraErrorDetails != null) errorMessage.append(" - ").append(extraErrorDetails); errorMessage.append(")");
errorMessage.append("("); errorMessage.append(Decoder.decodeXAExceptionErrorCode(xaEx)); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaEx); if (extraErrorDetails != null && extraErrorDetails.trim().length() > 0) { errorMessage.append(" - ").append(extraErrorDetails);
errorMessage.append("("); errorMessage.append(Decoder.decodeXAExceptionErrorCode(xaEx)); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaEx); if (extraErrorDetails != null && extraErrorDetails.trim().length() > 0) { errorMessage.append(" - ").append(extraErrorDetails);
/** * Recover all configured resources and fill the <code>recoveredXidSets</code> with all recovered XIDs. * Step 1. */ private void recoverAllResources() { // a cloned registeredResources Map must be iterated as the original one can be modified in the loop for (Map.Entry<String, XAResourceProducer> entry : new HashMap<String, XAResourceProducer>(registeredResources).entrySet()) { String uniqueName = entry.getKey(); XAResourceProducer producer = entry.getValue(); try { if (log.isDebugEnabled()) { log.debug("performing recovery on " + uniqueName); } Set<BitronixXid> xids = recover(producer); if (log.isDebugEnabled()) { log.debug("recovered " + xids.size() + " XID(s) from resource " + uniqueName); } recoveredXidSets.put(uniqueName, xids); producer.setFailed(false); } catch (XAException ex) { producer.setFailed(true); registeredResources.remove(uniqueName); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(ex); log.warn("error running recovery on resource '" + uniqueName + "', resource marked as failed (background recoverer will retry recovery)" + " (error=" + Decoder.decodeXAExceptionErrorCode(ex) + ")" + (extraErrorDetails == null ? "" : ", extra error=" + extraErrorDetails), ex); } catch (Exception ex) { producer.setFailed(true); registeredResources.remove(uniqueName); log.warn("error running recovery on resource '" + uniqueName + "', resource marked as failed (background recoverer will retry recovery)", ex); } } }
/** * Recover all configured resources and fill the <code>recoveredXidSets</code> with all recovered XIDs. * Step 1. */ private void recoverAllResources() { // a cloned registeredResources Map must be iterated as the original one can be modified in the loop for (Map.Entry<String, XAResourceProducer> entry : new HashMap<String, XAResourceProducer>(registeredResources).entrySet()) { String uniqueName = entry.getKey(); XAResourceProducer producer = entry.getValue(); try { if (log.isDebugEnabled()) log.debug("performing recovery on " + uniqueName); Set<BitronixXid> xids = recover(producer); if (log.isDebugEnabled()) log.debug("recovered " + xids.size() + " XID(s) from resource " + uniqueName); recoveredXidSets.put(uniqueName, xids); producer.setFailed(false); } catch (XAException ex) { producer.setFailed(true); registeredResources.remove(uniqueName); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(ex); log.warn("error running recovery on resource '" + uniqueName + "', resource marked as failed (background recoverer will retry recovery)" + " (error=" + Decoder.decodeXAExceptionErrorCode(ex) + ")" + (extraErrorDetails == null ? "" : ", extra error=" + extraErrorDetails), ex); } catch (Exception ex) { producer.setFailed(true); registeredResources.remove(uniqueName); log.warn("error running recovery on resource '" + uniqueName + "', resource marked as failed (background recoverer will retry recovery)", ex); } } }
/** * Recover all configured resources and fill the <code>recoveredXidSets</code> with all recovered XIDs. * Step 1. */ private void recoverAllResources() { // a cloned registeredResources Map must be iterated as the original one can be modified in the loop for (Map.Entry<String, XAResourceProducer> entry : new HashMap<String, XAResourceProducer>(registeredResources).entrySet()) { String uniqueName = entry.getKey(); XAResourceProducer producer = entry.getValue(); try { if (log.isDebugEnabled()) { log.debug("performing recovery on " + uniqueName); } Set<BitronixXid> xids = recover(producer); if (log.isDebugEnabled()) { log.debug("recovered " + xids.size() + " XID(s) from resource " + uniqueName); } recoveredXidSets.put(uniqueName, xids); producer.setFailed(false); } catch (XAException ex) { producer.setFailed(true); registeredResources.remove(uniqueName); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(ex); log.warn("error running recovery on resource '" + uniqueName + "', resource marked as failed (background recoverer will retry recovery)" + " (error=" + Decoder.decodeXAExceptionErrorCode(ex) + ")" + (extraErrorDetails == null ? "" : ", extra error=" + extraErrorDetails), ex); } catch (Exception ex) { producer.setFailed(true); registeredResources.remove(uniqueName); log.warn("error running recovery on resource '" + uniqueName + "', resource marked as failed (background recoverer will retry recovery)", ex); } } }
/** * Recover all configured resources and fill the <code>recoveredXidSets</code> with all recovered XIDs. * Step 1. */ private void recoverAllResources() { // a cloned registeredResources Map must be iterated as the original one can be modified in the loop for (Map.Entry<String, XAResourceProducer> entry : new HashMap<String, XAResourceProducer>(registeredResources).entrySet()) { String uniqueName = entry.getKey(); XAResourceProducer producer = entry.getValue(); try { if (log.isDebugEnabled()) log.debug("performing recovery on " + uniqueName); Set<BitronixXid> xids = recover(producer); if (log.isDebugEnabled()) log.debug("recovered " + xids.size() + " XID(s) from resource " + uniqueName); recoveredXidSets.put(uniqueName, xids); producer.setFailed(false); } catch (XAException ex) { producer.setFailed(true); registeredResources.remove(uniqueName); String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(ex); log.warn("error running recovery on resource '" + uniqueName + "', resource marked as failed (background recoverer will retry recovery)" + " (error=" + Decoder.decodeXAExceptionErrorCode(ex) + ")" + (extraErrorDetails == null ? "" : ", extra error=" + extraErrorDetails), ex); } catch (Exception ex) { producer.setFailed(true); registeredResources.remove(uniqueName); log.warn("error running recovery on resource '" + uniqueName + "', resource marked as failed (background recoverer will retry recovery)", ex); } } }
private void handleXAException(XAResourceHolderState failedResourceHolder, XAException xaException) throws XAException { switch (xaException.errorCode) { case XAException.XA_HEURRB: forgetHeuristicRollback(failedResourceHolder); return; case XAException.XA_HEURCOM: case XAException.XA_HEURHAZ: case XAException.XA_HEURMIX: log.error("heuristic rollback is incompatible with the global state of this transaction - guilty: " + failedResourceHolder); throw xaException; default: String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaException); log.warn("resource '" + failedResourceHolder.getUniqueName() + "' reported " + Decoder.decodeXAExceptionErrorCode(xaException) + " when asked to rollback transaction branch. Transaction is prepared and will rollback via recovery service when resource availability allows." + (extraErrorDetails == null ? "" : " Extra error=" + extraErrorDetails), xaException); } }
private void handleXAException(XAResourceHolderState failedResourceHolder, XAException xaException) throws XAException { switch (xaException.errorCode) { case XAException.XA_HEURRB: forgetHeuristicRollback(failedResourceHolder); return; case XAException.XA_HEURCOM: case XAException.XA_HEURHAZ: case XAException.XA_HEURMIX: log.error("heuristic rollback is incompatible with the global state of this transaction - guilty: " + failedResourceHolder); throw xaException; default: String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaException); log.warn("resource '" + failedResourceHolder.getUniqueName() + "' reported " + Decoder.decodeXAExceptionErrorCode(xaException) + " when asked to rollback transaction branch. Transaction is prepared and will rollback via recovery service when resource availability allows." + (extraErrorDetails == null ? "" : " Extra error=" + extraErrorDetails), xaException); } }
private void handleXAException(XAResourceHolderState failedResourceHolder, XAException xaException) throws XAException { switch (xaException.errorCode) { case XAException.XA_HEURRB: forgetHeuristicRollback(failedResourceHolder); return; case XAException.XA_HEURCOM: case XAException.XA_HEURHAZ: case XAException.XA_HEURMIX: log.error("heuristic rollback is incompatible with the global state of this transaction - guilty: " + failedResourceHolder); throw xaException; default: String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaException); log.warn("resource '" + failedResourceHolder.getUniqueName() + "' reported " + Decoder.decodeXAExceptionErrorCode(xaException) + " when asked to rollback transaction branch. Transaction is prepared and will rollback via recovery service when resource availability allows." + (extraErrorDetails == null ? "" : " Extra error=" + extraErrorDetails), xaException); } }
private void handleXAException(XAResourceHolderState failedResourceHolder, XAException xaException) throws XAException { switch (xaException.errorCode) { case XAException.XA_HEURRB: forgetHeuristicRollback(failedResourceHolder); return; case XAException.XA_HEURCOM: case XAException.XA_HEURHAZ: case XAException.XA_HEURMIX: log.error("heuristic rollback is incompatible with the global state of this transaction - guilty: " + failedResourceHolder); throw xaException; default: String extraErrorDetails = TransactionManagerServices.getExceptionAnalyzer().extractExtraXAExceptionDetails(xaException); log.warn("resource '" + failedResourceHolder.getUniqueName() + "' reported " + Decoder.decodeXAExceptionErrorCode(xaException) + " when asked to rollback transaction branch. Transaction is prepared and will rollback via recovery service when resource availability allows." + (extraErrorDetails == null ? "" : " Extra error=" + extraErrorDetails), xaException); } }