1 Exception scaffold to run business and convert all exception to BusinessException.
package basic.util.scaffold;
import basic.util.exception.BaseException;
import basic.util.exception.BusinessException;
import basic.util.function.IAction;
public class ExceptionContext {
public static void runOrThrowBusinessException(IAction action, String function) {
try {
action.run();
} catch (Exception exception) {
BusinessException.throwException(BaseException.Failed, BusinessException.ExceptionFailed, exception, function);
}
}
}
2 Transaction scaffold to run business in transaction or XA transaction.
package basic.util.scaffold;
import basic.util.function.IAction;
import basic.util.orm.EntityContext;
import basic.util.orm.EntityOperation;
import basic.util.orm.XAContext;
public class TransactionContext {
public static void runInTransaction(EntityContext entityContext, IAction action) {
try {
entityContext.beginTransaction();
action.run();
entityContext.commitTransaction();
} catch (Exception exception) {
entityContext.rollbackTransaction();
throw exception;
}
}
public static void runInXATransaction(IAction action) {
try {
XAContext.beginXA();
action.run();
XAContext.commitXA();
} catch (Exception exception) {
XAContext.rollbackXA();
throw exception;
}
}
public static void main(String[] args) {
TransactionContext transactionContext = new TransactionContext();
testCommit(transactionContext);
testRollback(transactionContext);
testXACommit(transactionContext);
testXARollback(transactionContext);
}
private static void testXACommit(TransactionContext transactionContext) {
EntityContext entityContext = new EntityContext("mssql");
EntityOperation operation = entityContext.getEntityOperation();
//entityContext.monitor(true);
EntityContext entityContext2 = new EntityContext("mssql2");
EntityOperation operation2 = entityContext2.getEntityOperation();
//entityContext2.monitor(true);
IAction action = () -> {
DataModel data = new DataModel();
data.setCode(1);
data.setValue("test code 1");
operation.add(data);
operation2.add(data);
data.setValue("test code 11");
operation.update(data);
operation2.update(data);
};
runInXATransaction(action);
operation.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
operation2.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
}
private static void testXARollback(TransactionContext transactionContext) {
EntityContext entityContext = new EntityContext("mssql");
EntityOperation operation = entityContext.getEntityOperation();
//entityContext.monitor(true);
EntityContext entityContext2 = new EntityContext("mssql2");
EntityOperation operation2 = entityContext2.getEntityOperation();
//entityContext2.monitor(true);
DataModel data = new DataModel();
data.setCode(1);
data.setValue("test code 1");
IAction action = () -> {
operation.delete(DataModel.class, data.getCode());
throw new RuntimeException("test exception");
};
try {
ExceptionContext.runOrThrowBusinessException(()->runInTransaction(entityContext, action), "testRollback");;
} catch (Exception exception) {
System.out.println(exception.getLocalizedMessage());
}
IAction action2 = () -> {
operation2.delete(DataModel.class, data.getCode());
throw new RuntimeException("test exception");
};
try {
ExceptionContext.runOrThrowBusinessException(()->runInTransaction(entityContext2, action2), "testRollback");;
} catch (Exception exception) {
System.out.println(exception.getLocalizedMessage());
}
operation.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
operation2.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
operation.delete(DataModel.class, data.getCode());
operation2.delete(DataModel.class, data.getCode());
}
private static void testCommit(TransactionContext transactionContext) {
EntityContext entityContext = new EntityContext("mssql");
EntityOperation operation = entityContext.getEntityOperation();
//entityContext.monitor(true);
IAction action = () -> {
DataModel data = new DataModel();
data.setCode(1);
data.setValue("test code 1");
operation.add(data);
data.setValue("test code 11");
operation.update(data);
};
runInTransaction(entityContext, action);
operation.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
}
private static void testRollback(TransactionContext transactionContext) {
EntityContext entityContext = new EntityContext("mssql");
EntityOperation operation = entityContext.getEntityOperation();
//entityContext.monitor(true);
DataModel data = new DataModel();
data.setCode(1);
data.setValue("test code 1");
IAction action = () -> {
operation.delete(DataModel.class, data.getCode());
throw new RuntimeException("test exception");
};
try {
ExceptionContext.runOrThrowBusinessException(()->runInTransaction(entityContext, action), "testRollback");;
} catch (Exception exception) {
System.out.println(exception.getLocalizedMessage());
}
operation.selectOne(DataModel.class, 1).ifPresent(object -> {
DataModel model = (DataModel) object;
System.out.println(model.getValue());
});
operation.delete(DataModel.class, data.getCode());
}
}
3 This is the value object used in test case.
package basic.util.scaffold;
import basic.util.orm.annotation.Column;
import basic.util.orm.annotation.Key;
import basic.util.orm.annotation.Table;
@Table(tableName="Test")
public class DataModel {
@Key(autoIncrement = Key.AutoIncrement.FALSE,column = @Column(columnName = "code"))
private int code;
@Column(columnName = "value")
private String value;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
No comments:
Post a Comment