前面介紹了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" }
執行結果