不使用quickfix / j中的Message类或MessageCracker类接收原始二进制消息

时间:2015-10-09 19:15:48

标签: quickfixj

使用quickfix / J发送登录消息后,我希望接收原始传入消息,并根据解码进行自己的事情。使用单二进制编码(SBE) https://github.com/real-logic/simple-binary-encoding

例如: 我发送登录消息8 = FIX.4.4 ^ 9 = 95 ^ 35 = A ^ 34 = 1 ^ 49 = FROMComp ^ 52 = 20151009-18:22:35.968 ^ 56 = HistReplay ^ 98 = 0 ^ 108 = 30 ^ 141 =根据目标主机指令,F ^格式的Y ^ 553 = ABC ^ 554 = ABC ^ 10 = 238 ^ http://www.cmegroup.com/confluence/display/EPICSANDBOX/MDP+3.0+-+TCP+Replay+Messages

然后目标计算机以SBE格式发回心跳消息。来自目标计算机的消息以SBE格式发回消息,并使用Quickfix / J消息和消息碎片器无法识别原始数据,或者我只是不知道使用fromApp接收原始数据的方法

我想拦截进来的原始数据,以便我可以将它发送到我自己的SBE解码器,而不是使用quickfix / J消息和messagecracker。有谁知道怎么样?

申请类

package tcpconnectiontest;

import java.util.logging.Level;
import java.util.logging.Logger;
import quickfix.Application;
import quickfix.DoNotSend;
import quickfix.FieldNotFound;
import quickfix.IncorrectDataFormat;
import quickfix.IncorrectTagValue;
import quickfix.Message;
import quickfix.MessageCracker;
import quickfix.RejectLogon;
import quickfix.SessionID;
import quickfix.UnsupportedMessageType;
import quickfix.field.MsgType;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Administrator
 */
public class TestApplicationImpl extends MessageCracker implements Application {
    @Override
    public void fromAdmin(Message arg0, SessionID arg1) throws FieldNotFound,
            IncorrectDataFormat, IncorrectTagValue, RejectLogon {
        System.out.println("Successfully called fromAdmin for sessionId : "
                + arg0);
    }

    @Override
    public void fromApp(Message arg0, SessionID arg1) throws FieldNotFound,
            IncorrectDataFormat, IncorrectTagValue, UnsupportedMessageType {
        System.out.println("Successfully called fromApp for sessionId : "
                + arg0);
        crack(arg0, arg1);
        System.out.println(arg0);
    }

    @Override
    public void onCreate(SessionID arg0) {
        System.out.println("Successfully called onCreate for sessionId : "
                + arg0);
    }

    @Override
    public void onLogon(SessionID arg0) {
        System.out.println("Successfully logged on for sessionId : " + arg0);

    }

    @Override
    public void onLogout(SessionID arg0) {
        System.out.println("Successfully logged out for sessionId : " + arg0);
    }

    @Override
    public void toAdmin(Message message, SessionID sessionId) {
        try {
            System.out.println("Inside toAdmin");
            final String msgType = message.getHeader().getString(MsgType.FIELD);
            if(MsgType.LOGON.compareTo(msgType) == 0)
            {

                message.setString(quickfix.field.Username.FIELD, "MGE");
                message.setString(quickfix.field.Password.FIELD, "MGE");
            }
        } catch (FieldNotFound ex) {
            Logger.getLogger(TestApplicationImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void toApp(Message arg0, SessionID arg1) throws DoNotSend {
        System.out.println("Message : " + arg0 + " for sessionid : " + arg1);
    }

    @Override
    public void onMessage(Message message, SessionID sessionID)
            throws FieldNotFound, UnsupportedMessageType, IncorrectTagValue {
        System.out.println("Inside Logon Message");
        super.onMessage(message, sessionID);
        System.out.println(message.toString());
    }

}

主要班级

package tcpconnectiontest;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import quickfix.Application;
import quickfix.ConfigError;
import quickfix.DefaultMessageFactory;
import quickfix.FileLogFactory;
import quickfix.FileStoreFactory;
import quickfix.MessageFactory;
import quickfix.Session;
import quickfix.SessionID;
import quickfix.SessionNotFound;
import quickfix.SessionSettings;
import quickfix.SocketInitiator;

/**
 *
 * @author Administrator
 */
public class TCPConnectionTest {

    private static WriteFIXMLMessage fixml = new WriteFIXMLMessage();
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {

       SocketInitiator socketInitiator = null;
        try {
                SessionSettings sessionSettings = new SessionSettings("C:\\ProgramData\\MDR\\sessionSettings.txt");
                Application application = new TestApplicationImpl();
                FileStoreFactory fileStoreFactory = new FileStoreFactory(sessionSettings);
                FileLogFactory logFactory = new FileLogFactory(sessionSettings);
                MessageFactory messageFactory = new DefaultMessageFactory();
                socketInitiator = new SocketInitiator(application,
                        fileStoreFactory, sessionSettings, logFactory,
                        messageFactory);
                socketInitiator.start();
                //Thread.sleep(5000);
                SessionID sessionId = socketInitiator.getSessions().get(0);
                //sendLogonRequest(sessionId);
                Thread.sleep(5000);
                socketInitiator.getManagedSessions();
                int i = 0;
                do {
                    try {
                        if(socketInitiator.isLoggedOn())
                        {
                            sendMDRRequest(sessionId);
                        }
                        else
                        {
                            System.out.println(socketInitiator.isLoggedOn());
                            Thread.sleep(1000);
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    i++;
                } while ((!socketInitiator.isLoggedOn()) && (i < 30));
            } catch (ConfigError e) {
                e.printStackTrace();
            } catch (SessionNotFound e) {
                e.printStackTrace();
            } catch (Exception exp) {
                exp.printStackTrace();
            } finally {
                if (socketInitiator != null) {
                    socketInitiator.stop(true);
                }
            }
    }
    private static void sendLogonRequest(SessionID sessionId)
            throws SessionNotFound {
        boolean sent = Session.sendToTarget(fixml.loginXML(), sessionId);
        System.out.println("Logon Message Sent : " + sent);
    } 

    private static void sendMDRRequest(SessionID sessionId)
            throws SessionNotFound {
        boolean sentnext = Session.sendToTarget(fixml.requestXML(), sessionId);
        System.out.println("MDR Message Sent : " + sentnext);
    }  
}

0 个答案:

没有答案