add changes according to google style
This commit is contained in:
parent
de56cbb971
commit
87af122509
@ -20,6 +20,7 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
|
||||
@ -31,7 +32,7 @@ package com.iluwatar.saga.choreography;
|
||||
public interface ChoreographyChapter {
|
||||
|
||||
/**
|
||||
* In that case, every method is responsible to make a decision on what to do then
|
||||
* In that case, every method is responsible to make a decision on what to do then.
|
||||
*
|
||||
* @param saga incoming saga
|
||||
* @return saga result
|
||||
@ -39,6 +40,7 @@ public interface ChoreographyChapter {
|
||||
Saga execute(Saga saga);
|
||||
|
||||
/**
|
||||
* get name method.
|
||||
* @return service name.
|
||||
*/
|
||||
String getName();
|
||||
|
@ -20,11 +20,12 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
|
||||
/**
|
||||
* Class representing a service to book a fly
|
||||
* Class representing a service to book a fly.
|
||||
*/
|
||||
public class FlyBookingService extends Service {
|
||||
public FlyBookingService(ServiceDiscoveryService service) {
|
||||
|
@ -20,11 +20,12 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
|
||||
/**
|
||||
* Class representing a service to book a hotel
|
||||
* Class representing a service to book a hotel.
|
||||
*/
|
||||
public class HotelBookingService extends Service {
|
||||
public HotelBookingService(ServiceDiscoveryService service) {
|
||||
|
@ -20,6 +20,7 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -44,7 +45,7 @@ public class Saga {
|
||||
}
|
||||
|
||||
/**
|
||||
* get resuzlt of saga
|
||||
* get resuzlt of saga.
|
||||
*
|
||||
* @return result of saga @see {@link SagaResult}
|
||||
*/
|
||||
@ -59,7 +60,7 @@ public class Saga {
|
||||
}
|
||||
|
||||
/**
|
||||
* add chapter to saga
|
||||
* add chapter to saga.
|
||||
* @param name chapter name
|
||||
* @return this
|
||||
*/
|
||||
@ -69,7 +70,7 @@ public class Saga {
|
||||
}
|
||||
|
||||
/**
|
||||
* set value to last chapter
|
||||
* set value to last chapter.
|
||||
* @param value invalue
|
||||
* @return this
|
||||
*/
|
||||
@ -82,7 +83,7 @@ public class Saga {
|
||||
}
|
||||
|
||||
/**
|
||||
* get value from current chapter
|
||||
* get value from current chapter.
|
||||
* @return value
|
||||
*/
|
||||
public Object getCurrentValue() {
|
||||
@ -90,7 +91,7 @@ public class Saga {
|
||||
}
|
||||
|
||||
/**
|
||||
* set value to current chapter
|
||||
* set value to current chapter.
|
||||
* @param value to set
|
||||
*/
|
||||
public void setCurrentValue(Object value) {
|
||||
@ -98,7 +99,7 @@ public class Saga {
|
||||
}
|
||||
|
||||
/**
|
||||
* set status for current chapter
|
||||
* set status for current chapter.
|
||||
* @param result to set
|
||||
*/
|
||||
public void setCurrentStatus(ChapterResult result) {
|
||||
@ -143,8 +144,9 @@ public class Saga {
|
||||
return chapters.get(pos).isSuccess();
|
||||
}
|
||||
|
||||
/***
|
||||
* Class presents a chapter status and incoming parameters(incoming parameter transforms to outcoming parameter)
|
||||
/**
|
||||
* Class presents a chapter status and incoming
|
||||
* parameters(incoming parameter transforms to outcoming parameter).
|
||||
*/
|
||||
public static class Chapter {
|
||||
private String name;
|
||||
@ -170,7 +172,7 @@ public class Saga {
|
||||
}
|
||||
|
||||
/**
|
||||
* set result
|
||||
* set result.
|
||||
* @param result {@link ChapterResult}
|
||||
*/
|
||||
public void setResult(ChapterResult result) {
|
||||
@ -178,7 +180,7 @@ public class Saga {
|
||||
}
|
||||
|
||||
/**
|
||||
* the result for chapter is good
|
||||
* the result for chapter is good.
|
||||
* @return true if is good otherwise bad
|
||||
*/
|
||||
public boolean isSuccess() {
|
||||
@ -188,14 +190,14 @@ public class Saga {
|
||||
|
||||
|
||||
/**
|
||||
* result for chapter
|
||||
* result for chapter.
|
||||
*/
|
||||
public enum ChapterResult {
|
||||
INIT, SUCCESS, ROLLBACK
|
||||
}
|
||||
|
||||
/**
|
||||
* result for saga
|
||||
* result for saga.
|
||||
*/
|
||||
public enum SagaResult {
|
||||
PROGRESS, FINISHED, ROLLBACKED
|
||||
|
@ -20,25 +20,29 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* This pattern is used in distributed services to perform a group of operations atomically.
|
||||
* This is an analog of transaction in a database but in terms of microservices architecture this is executed
|
||||
* This is an analog of transaction in a database but in terms
|
||||
* of microservices architecture this is executed
|
||||
* in a distributed environment
|
||||
* <p>
|
||||
* A saga is a sequence of local transactions in a certain context. If one transaction fails for some reason,
|
||||
* the saga executes compensating transactions(rollbacks) to undo the impact of the preceding transactions.
|
||||
* <p>
|
||||
* In this approach, there are no mediators or orchestrators services.
|
||||
*
|
||||
* <p>A saga is a sequence of local transactions in a certain context.
|
||||
* If one transaction fails for some reason,
|
||||
* the saga executes compensating transactions(rollbacks)
|
||||
* to undo the impact of the preceding transactions.
|
||||
*
|
||||
* <p>In this approach, there are no mediators or orchestrators services.
|
||||
* All chapters are handled and moved by services manually.
|
||||
* <p>
|
||||
* The major difference with choreography saga is an ability to handle crashed services
|
||||
* (otherwise in choreography services very hard to prevent a saga if one of them has been crashed)
|
||||
*
|
||||
* <p>The major difference with choreography saga is an ability to handle crashed services
|
||||
* (otherwise in choreography services very hard to prevent a saga
|
||||
* if one of them has been crashed)
|
||||
*
|
||||
* @see com.iluwatar.saga.choreography.Saga
|
||||
* @see Service
|
||||
@ -47,7 +51,7 @@ public class SagaApplication {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(SagaApplication.class);
|
||||
|
||||
/**
|
||||
* main method
|
||||
* main method.
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
ServiceDiscoveryService sd = serviceDiscovery();
|
||||
|
@ -20,15 +20,16 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* Common abstraction class representing services
|
||||
* Common abstraction class representing services.
|
||||
* implementing a general contract @see {@link ChoreographyChapter}
|
||||
*/
|
||||
public abstract class Service implements ChoreographyChapter {
|
||||
@ -73,13 +74,15 @@ public abstract class Service implements ChoreographyChapter {
|
||||
}
|
||||
|
||||
private Supplier<RuntimeException> serviceNotFoundException(String chServiceName) {
|
||||
return () -> new RuntimeException(String.format("the service %s has not been found", chServiceName));
|
||||
return () -> new RuntimeException(
|
||||
String.format("the service %s has not been found", chServiceName));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Saga process(Saga saga) {
|
||||
Object inValue = saga.getCurrentValue();
|
||||
LOGGER.info("The chapter '{}' has been started. The data {} has been stored or calculated successfully",
|
||||
LOGGER.info("The chapter '{}' has been started. "
|
||||
+ "The data {} has been stored or calculated successfully",
|
||||
getName(), inValue);
|
||||
saga.setCurrentStatus(Saga.ChapterResult.SUCCESS);
|
||||
saga.setCurrentValue(inValue);
|
||||
@ -89,7 +92,8 @@ public abstract class Service implements ChoreographyChapter {
|
||||
@Override
|
||||
public Saga rollback(Saga saga) {
|
||||
Object inValue = saga.getCurrentValue();
|
||||
LOGGER.info("The Rollback for a chapter '{}' has been started. The data {} has been rollbacked successfully",
|
||||
LOGGER.info("The Rollback for a chapter '{}' has been started. "
|
||||
+ "The data {} has been rollbacked successfully",
|
||||
getName(), inValue);
|
||||
|
||||
saga.setCurrentStatus(Saga.ChapterResult.ROLLBACK);
|
||||
|
@ -20,8 +20,8 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@ -35,7 +35,7 @@ public class ServiceDiscoveryService {
|
||||
private Map<String, ChoreographyChapter> services;
|
||||
|
||||
/**
|
||||
* find any service
|
||||
* find any service.
|
||||
*
|
||||
* @return any service
|
||||
* @throws NoSuchElementException if no elements further
|
||||
|
@ -20,11 +20,11 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.choreography;
|
||||
|
||||
|
||||
/**
|
||||
* Class representing a service to withdraw a money
|
||||
* Class representing a service to withdraw a money.
|
||||
*/
|
||||
public class WithdrawMoneyService extends Service {
|
||||
|
||||
|
@ -20,10 +20,11 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
/**
|
||||
* Executing result for chapter
|
||||
* Executing result for chapter.
|
||||
*
|
||||
* @param <K> incoming value
|
||||
*/
|
||||
@ -53,7 +54,7 @@ public class ChapterResult<K> {
|
||||
}
|
||||
|
||||
/**
|
||||
* state for chapter
|
||||
* state for chapter.
|
||||
*/
|
||||
public enum State {
|
||||
SUCCESS, FAILURE
|
||||
|
@ -20,10 +20,11 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
/**
|
||||
* Class representing a service to book a fly
|
||||
* Class representing a service to book a fly.
|
||||
*/
|
||||
public class FlyBookingService extends Service<String> {
|
||||
@Override
|
||||
|
@ -20,10 +20,11 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
/**
|
||||
* Class representing a service to book a hotel
|
||||
* Class representing a service to book a hotel.
|
||||
*/
|
||||
public class HotelBookingService extends Service<String> {
|
||||
@Override
|
||||
@ -42,7 +43,8 @@ public class HotelBookingService extends Service<String> {
|
||||
return ChapterResult.failure(value);
|
||||
}
|
||||
|
||||
LOGGER.info("The Rollback for a chapter '{}' has been started. The data {} has been rollbacked successfully",
|
||||
LOGGER.info("The Rollback for a chapter '{}' has been started. "
|
||||
+ "The data {} has been rollbacked successfully",
|
||||
getName(), value);
|
||||
|
||||
return super.rollback(value);
|
||||
|
@ -20,6 +20,7 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
/**
|
||||
@ -30,6 +31,7 @@ package com.iluwatar.saga.orchestration;
|
||||
public interface OrchestrationChapter<K> {
|
||||
|
||||
/**
|
||||
* method get name.
|
||||
* @return service name.
|
||||
*/
|
||||
String getName();
|
||||
|
@ -20,6 +20,7 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
/**
|
||||
|
@ -20,6 +20,7 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -60,14 +61,14 @@ public class Saga {
|
||||
}
|
||||
|
||||
/**
|
||||
* result for saga
|
||||
* result for saga.
|
||||
*/
|
||||
public enum Result {
|
||||
FINISHED, ROLLBACK, CRASHED
|
||||
}
|
||||
|
||||
/**
|
||||
* class represents chapter name
|
||||
* class represents chapter name.
|
||||
*/
|
||||
public static class Chapter {
|
||||
String name;
|
||||
|
@ -23,23 +23,27 @@
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* This pattern is used in distributed services to perform a group of operations atomically.
|
||||
* This is an analog of transaction in a database but in terms of microservices architecture this is executed
|
||||
* This pattern is used in distributed services to perform
|
||||
* a group of operations atomically.
|
||||
* This is an analog of transaction in a database but in terms
|
||||
* of microservices architecture this is executed
|
||||
* in a distributed environment
|
||||
* <p>
|
||||
* A saga is a sequence of local transactions in a certain context. If one transaction fails for some reason,
|
||||
* the saga executes compensating transactions(rollbacks) to undo the impact of the preceding transactions.
|
||||
* <p>
|
||||
* In this approach, there is an orchestrator @see {@link SagaOrchestrator}
|
||||
*
|
||||
* <p>A saga is a sequence of local transactions in a certain context.
|
||||
* If one transaction fails for some reason,
|
||||
* the saga executes compensating transactions(rollbacks)
|
||||
* to undo the impact of the preceding transactions.
|
||||
*
|
||||
* <p>In this approach, there is an orchestrator @see {@link SagaOrchestrator}
|
||||
* that manages all the transactions and directs
|
||||
* the participant services to execute local transactions based on events.
|
||||
* The major difference with choreography saga is an ability to handle crashed services
|
||||
* (otherwise in choreography services very hard to prevent a saga if one of them has been crashed)
|
||||
* (otherwise in choreography services very hard to prevent a saga
|
||||
* if one of them has been crashed)
|
||||
*
|
||||
* @see Saga
|
||||
* @see SagaOrchestrator
|
||||
@ -49,7 +53,7 @@ public class SagaApplication {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(SagaApplication.class);
|
||||
|
||||
/**
|
||||
* method to show common saga logic
|
||||
* method to show common saga logic.
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
SagaOrchestrator sagaOrchestrator = new SagaOrchestrator(newSaga(), serviceDiscovery());
|
||||
@ -58,7 +62,8 @@ public class SagaApplication {
|
||||
Saga.Result badOrder = sagaOrchestrator.execute("bad_order");
|
||||
Saga.Result crashedOrder = sagaOrchestrator.execute("crashed_order");
|
||||
|
||||
LOGGER.info("orders: goodOrder is {}, badOrder is {},crashedOrder is {}", goodOrder, badOrder, crashedOrder);
|
||||
LOGGER.info("orders: goodOrder is {}, badOrder is {},crashedOrder is {}",
|
||||
goodOrder, badOrder, crashedOrder);
|
||||
}
|
||||
|
||||
|
||||
|
@ -20,14 +20,17 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
import static com.iluwatar.saga.orchestration.Saga.Result.CRASHED;
|
||||
import static com.iluwatar.saga.orchestration.Saga.Result.FINISHED;
|
||||
import static com.iluwatar.saga.orchestration.Saga.Result.ROLLBACK;
|
||||
|
||||
import java.util.Optional;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import static com.iluwatar.saga.orchestration.Saga.Result.*;
|
||||
|
||||
/**
|
||||
* The orchestrator that manages all the transactions and directs
|
||||
@ -41,7 +44,7 @@ public class SagaOrchestrator {
|
||||
|
||||
|
||||
/**
|
||||
* Create a new service to orchetrate sagas
|
||||
* Create a new service to orchetrate sagas.
|
||||
* @param saga saga to process
|
||||
* @param sd service discovery @see {@link ServiceDiscoveryService}
|
||||
*/
|
||||
@ -52,7 +55,7 @@ public class SagaOrchestrator {
|
||||
}
|
||||
|
||||
/**
|
||||
* pipeline to execute saga process/story
|
||||
* pipeline to execute saga process/story.
|
||||
*
|
||||
* @param value incoming value
|
||||
* @param <K> type for incoming value
|
||||
|
@ -20,13 +20,14 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Common abstraction class representing services
|
||||
* Common abstraction class representing services.
|
||||
* implementing a general contract @see {@link OrchestrationChapter}
|
||||
*
|
||||
* @param <K> type of incoming param
|
||||
@ -40,14 +41,16 @@ public abstract class Service<K> implements OrchestrationChapter<K> {
|
||||
|
||||
@Override
|
||||
public ChapterResult<K> process(K value) {
|
||||
LOGGER.info("The chapter '{}' has been started. The data {} has been stored or calculated successfully",
|
||||
LOGGER.info("The chapter '{}' has been started. "
|
||||
+ "The data {} has been stored or calculated successfully",
|
||||
getName(), value);
|
||||
return ChapterResult.success(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChapterResult<K> rollback(K value) {
|
||||
LOGGER.info("The Rollback for a chapter '{}' has been started. The data {} has been rollbacked successfully",
|
||||
LOGGER.info("The Rollback for a chapter '{}' has been started. "
|
||||
+ "The data {} has been rollbacked successfully",
|
||||
getName(), value);
|
||||
return ChapterResult.success(value);
|
||||
}
|
||||
|
@ -20,6 +20,7 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
@ -20,10 +20,11 @@
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.saga.orchestration;
|
||||
|
||||
/**
|
||||
* Class representing a service to withdraw a money
|
||||
* Class representing a service to withdraw a money.
|
||||
*/
|
||||
public class WithdrawMoneyService extends Service<String> {
|
||||
@Override
|
||||
|
Loading…
x
Reference in New Issue
Block a user