fix接收消息是通过实现quickfix.Application.fromApp(Message message, SessionID sessionID)指定message类型,调用quickfix.MessageCracker.crack(Message message, SessionID sessionID)方法在invokers这个map中找到对应的消息类并处理,invokers在initialize()中初始化,利用的是反射机制。 源码如下: initialize生成invokers的map对象
public void initialize(Object messageHandler) {Class<?> handlerClass = messageHandler.getClass();for (Method method : handlerClass.getMethods()) {if (isHandlerMethod(method)) {Class<?> messageClass = method.getParameterTypes()[0];method.setAccessible(true);Invoker invoker = new Invoker(messageHandler, method);Invoker existingInvoker = invokers.get(messageClass);if (existingInvoker != null) {throw new RedundantHandlerException(messageClass, existingInvoker.getMethod(),method);}invokers.put(messageClass, invoker);}}}
调用crack()方法处理对应的消息
/*** Process ("crack") a FIX message and call the registered handlers for that type, if any*/public void crack(quickfix.Message message, SessionID sessionID) throws UnsupportedMessageType,FieldNotFound, IncorrectTagValue {Invoker invoker = invokers.get(message.getClass());if (invoker != null) {try {invoker.Invoke(message, sessionID);} catch (InvocationTargetException ite) {try {throw ite.getTargetException();} catch (UnsupportedMessageType | IncorrectTagValue | FieldNotFound e) {throw e;} catch (Throwable t) {propagate(t);}} catch (Exception e) {propagate(e);}} else {onMessage(message, sessionID);}}
如果不想用这种反射的机制,可以改为继承quickfix.fix42.MessageCracker,这里都是override了,通过crack调用的crack42(),通过MsgType类型调不同的onMessage方法。
public void crack(quickfix.Message message, SessionID sessionID)throws UnsupportedMessageType, FieldNotFound, IncorrectTagValue {crack42((Message) message, sessionID);}/*** Cracker method for 42 messages.** @throws FieldNotFound* @throws UnsupportedMessageType* @throws IncorrectTagValue*/public void crack42(Message message, SessionID sessionID)throws UnsupportedMessageType, FieldNotFound, IncorrectTagValue {String type = message.getHeader().getString(MsgType.FIELD);if (type.equals(Heartbeat.MSGTYPE))onMessage((Heartbeat)message, sessionID);else if (type.equals(Logon.MSGTYPE))onMessage((Logon)message, sessionID);else if (type.equals(TestRequest.MSGTYPE))onMessage((TestRequest)message, sessionID);else if (type.equals(ResendRequest.MSGTYPE))onMessage((ResendRequest)message, sessionID);else if (type.equals(Reject.MSGTYPE))onMessage((Reject)message, sessionID);else if (type.equals(SequenceReset.MSGTYPE))onMessage((SequenceReset)message, sessionID);else if (type.equals(Logout.MSGTYPE))onMessage((Logout)message, sessionID);else if (type.equals(Advertisement.MSGTYPE))onMessage((Advertisement)message, sessionID);else if (type.equals(IndicationofInterest.MSGTYPE))onMessage((IndicationofInterest)message, sessionID);else if (type.equals(News.MSGTYPE))onMessage((News)message, sessionID);else if (type.equals(Email.MSGTYPE))onMessage((Email)message, sessionID);else if (type.equals(QuoteRequest.MSGTYPE))onMessage((QuoteRequest)message, sessionID);else if (type.equals(Quote.MSGTYPE))onMessage((Quote)message, sessionID);else if (type.equals(MassQuote.MSGTYPE))onMessage((MassQuote)message, sessionID);else if (type.equals(QuoteCancel.MSGTYPE))onMessage((QuoteCancel)message, sessionID);else if (type.equals(QuoteStatusRequest.MSGTYPE))onMessage((QuoteStatusRequest)message, sessionID);else if (type.equals(QuoteAcknowledgement.MSGTYPE))onMessage((QuoteAcknowledgement)message, sessionID);else if (type.equals(MarketDataRequest.MSGTYPE))onMessage((MarketDataRequest)message, sessionID);else if (type.equals(MarketDataSnapshotFullRefresh.MSGTYPE))onMessage((MarketDataSnapshotFullRefresh)message, sessionID);else if (type.equals(MarketDataIncrementalRefresh.MSGTYPE))onMessage((MarketDataIncrementalRefresh)message, sessionID);else if (type.equals(MarketDataRequestReject.MSGTYPE))onMessage((MarketDataRequestReject)message, sessionID);else if (type.equals(SecurityDefinitionRequest.MSGTYPE))onMessage((SecurityDefinitionRequest)message, sessionID);else if (type.equals(SecurityDefinition.MSGTYPE))onMessage((SecurityDefinition)message, sessionID);else if (type.equals(SecurityStatusRequest.MSGTYPE))onMessage((SecurityStatusRequest)message, sessionID);else if (type.equals(SecurityStatus.MSGTYPE))onMessage((SecurityStatus)message, sessionID);else if (type.equals(TradingSessionStatusRequest.MSGTYPE))onMessage((TradingSessionStatusRequest)message, sessionID);else if (type.equals(TradingSessionStatus.MSGTYPE))onMessage((TradingSessionStatus)message, sessionID);else if (type.equals(NewOrderSingle.MSGTYPE))onMessage((NewOrderSingle)message, sessionID);else if (type.equals(ExecutionReport.MSGTYPE))onMessage((ExecutionReport)message, sessionID);else if (type.equals(DontKnowTrade.MSGTYPE))onMessage((DontKnowTrade)message, sessionID);else if (type.equals(OrderCancelReplaceRequest.MSGTYPE))onMessage((OrderCancelReplaceRequest)message, sessionID);else if (type.equals(OrderCancelRequest.MSGTYPE))onMessage((OrderCancelRequest)message, sessionID);else if (type.equals(OrderCancelReject.MSGTYPE))onMessage((OrderCancelReject)message, sessionID);else if (type.equals(OrderStatusRequest.MSGTYPE))onMessage((OrderStatusRequest)message, sessionID);else if (type.equals(Allocation.MSGTYPE))onMessage((Allocation)message, sessionID);else if (type.equals(AllocationACK.MSGTYPE))onMessage((AllocationACK)message, sessionID);else if (type.equals(SettlementInstructions.MSGTYPE))onMessage((SettlementInstructions)message, sessionID);else if (type.equals(BidRequest.MSGTYPE))onMessage((BidRequest)message, sessionID);else if (type.equals(BidResponse.MSGTYPE))onMessage((BidResponse)message, sessionID);else if (type.equals(NewOrderList.MSGTYPE))onMessage((NewOrderList)message, sessionID);else if (type.equals(ListStrikePrice.MSGTYPE))onMessage((ListStrikePrice)message, sessionID);else if (type.equals(ListStatus.MSGTYPE))onMessage((ListStatus)message, sessionID);else if (type.equals(ListExecute.MSGTYPE))onMessage((ListExecute)message, sessionID);else if (type.equals(ListCancelRequest.MSGTYPE))onMessage((ListCancelRequest)message, sessionID);else if (type.equals(ListStatusRequest.MSGTYPE))onMessage((ListStatusRequest)message, sessionID);else if (type.equals(BusinessMessageReject.MSGTYPE))onMessage((BusinessMessageReject)message, sessionID);elseonMessage(message, sessionID);}