Mule ESB中entry-point-resolver的使用(8) Custom Entry Point Resolver

     前面介紹了6種Mule ESB提供的Entry Point Resolver,若是在實際應用中以爲這些Entry Point Resolver不能知足實際須要,能夠自定義Entry Point Resolver。自定義的Entry Point Resolver類必須繼承抽象類java

org.mule.model.resolvers.AbstractEntryPointResolverspring

     咱們這裏實現一個自定義Entry Point Resolver,根據用戶傳入的兩個操做數和操做符參數,分別執行不一樣的計算方法,返回操做結果。json

    咱們計算傳入的參數是json格式   數組

{
   "operand1":13,
   "operand2":40,
   "operator":"add"   
}

    咱們首先定義一個新的Flow,命名爲Caculate_Flowide

    

   入口的Http Listener節點仍使用8081端口,爲了和前面的Flow區別,Path改成Calcthis

   

   流程中的Byte Array to String Transformer是把Http請求的InputStream類型的Payload轉換爲String類型的Payload。Json Translate Transformer使用了咱們自定義的Transformer類CalcTransformer,把json報文轉換爲Object數組   code

public class CalcTransformer extends AbstractMessageTransformer {

	private Logger logger = LogManager.getLogger(CalcTransformer.class);
	
	@Override
	public Object transformMessage(MuleMessage message, String outputEncoding) 
throws TransformerException {		
		try 
		{
			String messageStr = message.getPayloadAsString();
			JSONObject jsonObj = JSON.parseObject(messageStr);
			
			Object[] paramArray = new Object[3];
			String param1 = jsonObj.getString("operand1");
			String param2 = jsonObj.getString("operand2");
			String param3 = jsonObj.getString("operator");
			paramArray[0] = Integer.parseInt(param1);
			paramArray[1] = Integer.parseInt(param2);
			paramArray[2] = param3;		
			
			return paramArray;
			
		} catch (Exception e) {
			logger.error(ExceptionUtils.getFullStackTrace(e));
		}
		return null;
	}
}

Caculate Component使用咱們自定義的CalcComponent類,用於計算,咱們定義了加,減,乘,除(整數除)四個方法component

public class CalcComponent 
{	
	public Long add(Integer number1, Integer number2)
	{
		return (long)(number1 + number2);
	}
	
	public Integer sub(Integer number1, Integer number2)
	{
		return (number1 - number2);
	}
	
	public Long mul(Integer number1, Integer number2)
	{
		return (long)(number1 * number2);
	}
	
	public Integer div(Integer number1, Integer number2)
	{
		return number1 / number2;
	}
}

最後定義的Logger輸出計算結果orm

咱們在Component節點中配置使用Custom Entry Point Resolverxml

<component doc:name="Caculate Component">        	
    <custom-entry-point-resolver class="entrypointresolvertest.CustomEntryPointResolver"/>
    <spring-object bean="customEntryTest"/>   
</component>

CustomEntryPointResolver的實現代碼以下:

public class CustomEntryPointResolver extends AbstractEntryPointResolver {

	private Logger logger = LogManager.getLogger(CustomEntryPointResolver.class);
	
	@Override
	public InvocationResult invoke(Object component, MuleEventContext context) throws Exception {
		
		try
		{
			Object[] payload = getPayloadFromMessage(context);
			
			if(payload != null && payload.length == 3)
			{
					int number1 = Integer.parseInt(payload[0].toString());
					int number2 = Integer.parseInt(payload[1].toString());				
					String operandName = payload[2].toString();
					Class<?>[] classTypes = ClassUtils.getClassTypes(payload);
					Class<?>[] paramTypes = new Class<?>[2];
					for(int i=0; i<2;i++)
					{
						paramTypes[0] = classTypes[0];
						paramTypes[1] = classTypes[1];
					}
					Method method = getMethodByName(component, operandName, context);
					if (method == null)
			        {
			            method = ClassUtils.getMethod(component.getClass(), operandName, paramTypes, true);
			        }
			        if (method != null)
		            {
		                addMethodByName(component, method, context);	
		                
	                	Object[] arguments = new Object[2];
	                	arguments[0] = number1;
	                	arguments[1] = number2;
	                	InvocationResult result = invokeMethod(component, method, arguments);
	                	return result;
		            }
			        else
			        {
			        	InvocationResult result = new InvocationResult(this, InvocationResult.State.FAILED);
				        result.setErrorNoMatchingMethods(component, classTypes);
				        return result;
			        }
			}
			else
			{
				Class<?>[] classTypes = ClassUtils.getClassTypes(payload);
				InvocationResult result = new InvocationResult(this, InvocationResult.State.FAILED);
		        result.setErrorNoMatchingMethods(component, classTypes);
		        return result;
			}
		}
		catch(Exception ex)
		{
			logger.error(ExceptionUtils.getFullStackTrace(ex));
		}		
		return null;
	}

}

   具體的實現代碼參考了Method Entry Point Resolver和Reflection Entry Point Resolver的源碼,主要思想是根據傳送的第三個操做符參數,找到CalcComponent對應的運算方法執行,得到結果。

啓動項目,分別傳送加,減,乘,除的報文,結果以下

加法

{
  "operand1":153,
  "operand2":251,
  "operator":"add"
}

執行結果

減法

{
  "operand1":540,
  "operand2":1500,
  "operator":"sub"
}

執行結果

乘法

{
  "operand1":44100,
  "operand2":14343,
  "operator":"mul"
}

執行結果

除法

{
  "operand1":1534337,
  "operand2":24503,
  "operator":"div"
}

執行結果

相關文章
相關標籤/搜索