2

使用 quickfix/JI 发送登录消息后,希望接收原始传入消息,并尽可能对消息进行解码。使用单一二进制编码 (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=Y^553=ABC^554=ABC^10=238^ 按照目标主机说明采用 FIX 格式 http://www.cmegroup.com/confluence/display/EPICSANDBOX/MDP+3.0+-+TCP +重播+消息

然后目标计算机以 SBE 格式发回心跳消息。来自目标计算机的消息以 SBE 格式发回消息,并使用 Quickfix/J 消息和 messagecracker 无法识别原始数据,或者我只是不知道使用 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);
    }  
}
4

0 回答 0