use of org.jboss.narayana.rest.integration.api.HeuristicException in project narayana by jbosstm.
the class RecoveryManager method recreateParticipantInformation.
private ParticipantInformation recreateParticipantInformation(final RecoveryStore recoveryStore, final Uid uid) throws ObjectStoreException, IOException {
final InputObjectState inputObjectState = recoveryStore.read_committed(uid, PARTICIPANT_INFORMATION_RECORD_TYPE);
final String id = inputObjectState.unpackString();
if (ParticipantsContainer.getInstance().getParticipantInformation(id) != null) {
// Participant is already loaded.
return null;
}
final String applicationId = inputObjectState.unpackString();
if (!deserializers.containsKey(applicationId)) {
// There is no appropriate deserializer.
return null;
}
final String status = inputObjectState.unpackString();
final String recoveryUrl = inputObjectState.unpackString();
final Participant participant = recreateParticipant(inputObjectState, applicationId);
if (participant == null) {
// Deserializer failed to recreate participant.
return null;
}
final ParticipantInformation participantInformation = new ParticipantInformation(id, applicationId, recoveryUrl, participant, status);
if (!synchronizeParticipantUrlWithCoordinator(participantInformation)) {
try {
participant.rollback();
removeParticipantInformation(participantInformation);
// TODO is it OK to leave participant not rolled back in case of Exception?
} catch (HeuristicException e) {
LOG.warn(e.getMessage(), e);
} catch (ParticipantException e) {
LOG.warn(e.getMessage(), e);
}
return null;
}
return participantInformation;
}
use of org.jboss.narayana.rest.integration.api.HeuristicException in project narayana by jbosstm.
the class InboundBridgeParticipant method commitOnePhase.
@Override
public void commitOnePhase() {
if (LOG.isTraceEnabled()) {
LOG.trace("InboundBridgeParticipant.commitOnePhase: xid=" + xid);
}
startBridge();
final Vote outcome = prepareSubordinate();
if (LOG.isTraceEnabled()) {
LOG.trace("InboundBridgeParticipant.commitOnePhase: xid=" + xid + ", outcome=" + outcome);
}
if (outcome instanceof Prepared) {
try {
commitSubordinate();
} catch (HeuristicException e) {
}
}
cleanup();
}
use of org.jboss.narayana.rest.integration.api.HeuristicException in project narayana by jbosstm.
the class ParticipantResource method rollback.
private void rollback(final ParticipantInformation participantInformation) throws HeuristicException {
if (isHeuristic(participantInformation)) {
rollbackHeuristic(participantInformation);
} else {
final String previousStatus = participantInformation.getStatus();
participantInformation.setStatus(TxStatus.TransactionRollingBack.name());
try {
participantInformation.getParticipant().rollback();
} catch (HeuristicException e) {
if (!e.getHeuristicType().equals(HeuristicType.HEURISTIC_ROLLBACK)) {
participantInformation.setStatus(e.getHeuristicType().toTxStatus());
RecoveryManager.getInstance().persistParticipantInformation(participantInformation);
throw new HeuristicException(e.getHeuristicType());
}
} catch (ParticipantException e) {
participantInformation.setStatus(previousStatus);
throw e;
}
participantInformation.setStatus(TxStatus.TransactionRolledBack.name());
RecoveryManager.getInstance().removeParticipantInformation(participantInformation);
ParticipantsContainer.getInstance().removeParticipantInformation(participantInformation.getId());
}
}
use of org.jboss.narayana.rest.integration.api.HeuristicException in project narayana by jbosstm.
the class ParticipantResource method commit.
private void commit(final ParticipantInformation participantInformation) throws HeuristicException {
if (isHeuristic(participantInformation)) {
commitHeuristic(participantInformation);
} else {
participantInformation.setStatus(TxStatus.TransactionCommitting.name());
try {
participantInformation.getParticipant().commit();
} catch (HeuristicException e) {
if (!e.getHeuristicType().equals(HeuristicType.HEURISTIC_COMMIT)) {
participantInformation.setStatus(e.getHeuristicType().toTxStatus());
RecoveryManager.getInstance().persistParticipantInformation(participantInformation);
throw new HeuristicException(e.getHeuristicType());
}
} catch (ParticipantException e) {
participantInformation.setStatus(TxStatus.TransactionPrepared.name());
throw e;
}
participantInformation.setStatus(TxStatus.TransactionCommitted.name());
RecoveryManager.getInstance().removeParticipantInformation(participantInformation);
ParticipantsContainer.getInstance().removeParticipantInformation(participantInformation.getId());
}
}
Aggregations