@Override public AlphaResponse preIntercept(String parentTxId, String compensationMethod, int timeout, String retriesMethod, int retries, Object... message) { return new AlphaResponse(false); }
public TxAbortedEvent(String globalTxId, String localTxId, String parentTxId, String compensationMethod, Throwable throwable) { super(EventType.TxAbortedEvent, globalTxId, localTxId, parentTxId, compensationMethod, 0, "", 0, stackTrace(throwable)); }
public SagaStartAspect(MessageSender sender, OmegaContext context) { this.context = context; this.sagaStartAnnotationProcessor = new SagaStartAnnotationProcessor(context, sender); }
private GrpcTxEvent convertEvent(TxEvent event) { ByteString payloads = ByteString.copyFrom(serializer.serialize(event.payloads())); Builder builder = GrpcTxEvent.newBuilder() .setServiceName(serviceConfig.getServiceName()) .setInstanceId(serviceConfig.getInstanceId()) .setTimestamp(event.timestamp()) .setGlobalTxId(event.globalTxId()) .setLocalTxId(event.localTxId()) .setParentTxId(event.parentTxId() == null ? "" : event.parentTxId()) .setType(event.type().name()) .setTimeout(event.timeout()) .setCompensationMethod(event.compensationMethod()) .setRetryMethod(event.retryMethod() == null ? "" : event.retryMethod()) .setRetries(event.retries()) .setPayloads(payloads); return builder.build(); }
@Override public void postIntercept(String parentTxId, String compensationMethod) { AlphaResponse response = sender.send(new SagaEndedEvent(omegaContext.globalTxId(), omegaContext.localTxId())); if (response.aborted()) { throw new OmegaException("transaction " + parentTxId + " is aborted"); } }
@Override public AlphaResponse send(TxEvent event) { if (event.type() == SagaStartedEvent) { throw new OmegaException("Failed to process subsequent requests because no alpha server is available"); } try { return availableMessageSenders.take().send(event); } catch (InterruptedException e) { throw new OmegaException("Failed to send event " + event + " due to interruption", e); } } }
@Override public AlphaResponse preIntercept(String parentTxId, String compensationMethod, int timeout, String retriesMethod, int retries, Object... message) { try { return sender.send(new SagaStartedEvent(omegaContext.globalTxId(), omegaContext.localTxId(), timeout)); } catch (OmegaException e) { throw new TransactionalException(e.getMessage(), e.getCause()); } }
@Override public void onError(String parentTxId, String compensationMethod, Throwable throwable) { String globalTxId = omegaContext.globalTxId(); sender.send(new TxAbortedEvent(globalTxId, globalTxId, null, compensationMethod, throwable)); } }
@Override public void onReceive(String globalTxId, String localTxId, String parentTxId, String compensationMethod, Object... payloads) { context.apply(globalTxId, localTxId, compensationMethod, payloads); sender.send(new TxCompensatedEvent(globalTxId, localTxId, parentTxId, compensationMethod)); } }
@Override public AlphaResponse preIntercept(String parentTxId, String compensationMethod, int timeout, String retriesMethod, int retries, Object... message) { return sender.send(new TxStartedEvent(context.globalTxId(), context.localTxId(), parentTxId, compensationMethod, timeout, retriesMethod, retries, message)); }
@Override public void postIntercept(String parentTxId, String compensationMethod) { sender.send(new TxEndedEvent(context.globalTxId(), context.localTxId(), parentTxId, compensationMethod)); }
@Override public void onConnected() { senders.keySet().forEach(sender -> { try { sender.onConnected(); } catch (Exception e) { LOG.error("Failed connecting to alpha at {}", sender.target(), e); } }); }
@Override public void onDisconnected() { senders.keySet().forEach(sender -> { try { sender.onDisconnected(); } catch (Exception e) { LOG.error("Failed disconnecting from alpha at {}", sender.target(), e); } }); }
@Override public void onNext(GrpcCompensateCommand command) { LOG.info("Received compensate command, global tx id: {}, local tx id: {}, compensation method: {}", command.getGlobalTxId(), command.getLocalTxId(), command.getCompensationMethod()); messageHandler.onReceive( command.getGlobalTxId(), command.getLocalTxId(), command.getParentTxId().isEmpty() ? null : command.getParentTxId(), command.getCompensationMethod(), deserializer.deserialize(command.getPayloads().toByteArray())); }
public TransactionAspect(MessageSender sender, OmegaContext context) { this.context = context; this.interceptor = new CompensableInterceptor(context, sender); }
@Bean MessageHandler messageHandler(MessageSender sender, CompensationContext context, OmegaContext omegaContext) { return new CompensationMessageHandler(sender, context); }
@Order(0) @Bean SagaStartAspect sagaStartAspect(MessageSender sender, OmegaContext context) { return new SagaStartAspect(sender, context); }
@Order(1) @Bean TransactionAspect transactionAspect(MessageSender sender, OmegaContext context) { return new TransactionAspect(sender, context); }
@Override public void onError(String parentTxId, String compensationMethod, Throwable throwable) { sender.send( new TxAbortedEvent(context.globalTxId(), context.localTxId(), parentTxId, compensationMethod, throwable)); } }
@Override public AlphaResponse send(TxEvent event) { GrpcAck grpcAck = blockingEventService.onTxEvent(convertEvent(event)); return new AlphaResponse(grpcAck.getAborted()); }