分佈式事務-事務上下文代碼實現


package org.mengyun.tcctransaction.utils;

import org.mengyun.tcctransaction.common.MethodType;
import org.mengyun.tcctransaction.api.TransactionContext;

/**
 * 可補償方法工具類.
 * Created by changmingxie .
 */
public class CompensableMethodUtils {

	/**
	 * 計算方法類型.
	 * @param transactionContext
	 * @param isCompensable
	 * @return
	 */
    public static MethodType calculateMethodType( TransactionContext transactionContext, boolean isCompensable) {

        if (transactionContext == null && isCompensable) {
        	// 沒有事務上下文信息,並且方法有事務註解的,爲可補償事務根方法(也就是事務發起者)
            //isRootTransactionMethod
            return MethodType.ROOT;
        } else if (transactionContext == null && !isCompensable) {
        	// 沒有事務上下文信息,並且方法沒有事務註解的,爲可補償事務服務消費者(參考者)方法(一般爲被調用的服務接口)
            //isSoaConsumer
            return MethodType.CONSUMER;
        } else if (transactionContext != null && isCompensable) {
        	// 有事務上下文信息,並且方法有事務註解的,爲可補償事務服務提供者方法(一般爲被調用的服務接口的實現方法)
            //isSoaProvider
            return MethodType.PROVIDER;
        } else {
            return MethodType.NORMAL;
        }
    }

    /**
     * 獲取事務上下文參數的位置.
     * @param parameterTypes
     * @return
     */
    public static int getTransactionContextParamPosition(Class<?>[] parameterTypes) {

        int i = -1;

        for (i = 0; i < parameterTypes.length; i++) {
            if (parameterTypes[i].equals(org.mengyun.tcctransaction.api.TransactionContext.class)) {
                break;
            }
        }
        return i;
    }

    /**
     * 從參數獲取事務上下文.
     * @param args
     * @return
     */
    public static TransactionContext getTransactionContextFromArgs(Object[] args) {

        TransactionContext transactionContext = null;

        for (Object arg : args) {
            if (arg != null && org.mengyun.tcctransaction.api.TransactionContext.class.isAssignableFrom(arg.getClass())) {

                transactionContext = (org.mengyun.tcctransaction.api.TransactionContext) arg;
            }
        }

        return transactionContext;
    }
}

 

發佈了485 篇原創文章 · 獲贊 75 · 訪問量 83萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章