QuickFix/J:使用@Handler处理消息

news/2025/2/14 7:07:39/
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);}


http://www.ppmy.cn/news/1185939.html

相关文章

vue中把弹出层.vue文件注册成组件供其他.vue文件调用的写法

背景&#xff1a;因弹出层多个页面的详情都是一样的&#xff0c;因此把弹出层定义成组件&#xff0c;多次调用 定义组件的过程中出现很多问题&#xff0c;因此再次记录最终成功的写法 一、 简单实现页面调用弹出层组件的打开弹出层方法&#xff1a; 1. 弹出层组件 (in…

软考 系统架构设计师系列知识点之软件构件(3)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件构件&#xff08;2&#xff09; 所属章节&#xff1a; 第2章. 计算机系统基础知识 第3节. 计算机软件 2.3.7 软件构件 &#xff08;2&#xff09;J2EE&#xff08;补充知识&#xff09; J2EE核心组成&#xff1a…

全连接神经网络 - FCN

FCN(全卷积神经网络)图像语义分割的一种框架&#xff0c;是深度学习用于语义分割领域的开山之作。FCN将传统CNN后面的全连接层换成了卷积层&#xff0c;这样网络的输出将是热力图而非类别&#xff1b;同时&#xff0c;为解决卷积和池化导致图像尺寸的变小&#xff0c;使用上采样…

【python】挑选墙纸--CTGU计协编程部月考核

题目&#xff1a; """ 题目描述: 为庆祝三峡大学建校100周年&#xff0c;学校购入多张墙纸以作装饰&#xff0c;每张墙纸为一个 n x m 的小写字母矩阵。其中&#xff0c;学长想挑选出能够从中读出 "ctgu" 字样的墙纸。具体来说&#xff0c;从墙纸的左…

RocketMQ笔记

科普&#xff1a; 把数据放到消息队列叫做生产者从消息队列里边取数据叫做消费者 一、为什么要用消息队列&#xff1f; 消息队列主要有三大用途 &#xff1a;解耦、异步、削峰&#xff0c;是消息队列最主要的三大作用。 二、为什么选择RocketMQ 选择中间件的可以从这些维度来…

一共就五个名额,三个全给一个人?我表示不理解

我对csdn举办的#你写过的最蠢的代码是/这个话题的活动表示质疑&#xff01;&#xff01;&#xff01;&#xff01; 先来看看评选规则&#xff1a; 再来看看评分标准&#xff1a; 接下来看看获奖选手&#xff1a; 这三人有啥区别&#xff1f;

springboot项目通过自定义注解+aop实现对入参加解密

1.创建自定义注解&#xff1a; Target({ElementType.FIELD, ElementType.PARAMETER}) Retention(RetentionPolicy.RUNTIME) public interface EncryptDecrypt { }2.创建加解密工具类&#xff1a; public class EncryptionUtils {// 加密方法public static String encrypt(Str…

【文件存储服务器】Minio使用

文章目录 2.2 Minio使用2.2.1 Minio介绍2.2.2 Minio安装Windows安装Linux安装 2.2.3 Minio入门 2.3 上传文件接口2.3.1 FileUploadController2.3.2 FileUploadService2.3.3 MinioProperties2.3.4 配置文件内容2.3.5 主启动类加上EnableConfigurationProperties 2.4 前端对接 2.…