FASTプロトコル解析(2) テンプレート解析データのインポート

 ナンセンス

同じ文ですが、インターネット上にあるドキュメントは僧侶の髪の毛よりも少ないので、ソース コードをかじってみましょう。長い時間を経て、最終的にクラスをかじりました: XMLMessageTemplateLoader

そうです、文字通り、template.xml ファイルをテンプレート オブジェクトに直接変換することを意味します。私の主な仕事は分析です、つまり、データとテンプレートは既製です。テンプレートを介してデータの流れを解析するだけです。K はこれを見て、前の記事の方法と組み合わせました。どうやら勝利の夜明けが見えてきたようだ。

激しい手術の末、現実は大きな口を開きました: ID 0 のテンプレートは登録されていません

テンプレートが登録されていません 0. このテンプレート、私は唖然としました、私にはそんなものはありません、インターネットでたくさん探しました、そしてついにこのことを長い間研究してきた偉い人を見つけました(https : //github.com /kuangtu/fixfast ), 私はその偉人によって書かれたサンプル コードを見てみました. ほんの数行で、行間に人生についてのヒントがあります... 話は逸れますが、によって書かれたサンプル コード大きな男は基本的に私と同じです。なぜですか? 彼は私ができることはできますが、データプロバイダーは私に嘘をついたり、故意に虚偽のデータを提供したりすることはできませんよね?

データは上海証券取引所から取得されています。上海証券取引所から与えられた文書には、STEP プロトコルから Tag96 が存在すると書かれています。この Tag96 の値は、FAST プロトコルのストリームです。そして、次のデータを転送します。」上海証券取引所が提供する STEP プロトコル ストリームからの Tag96 を取り出し、分析、失敗、分析、失敗、分析失敗、体位を何回変えたかは誰にもわかりませんが、まだ妊娠していません…分析は成功しませんでした。

その後、Tag96 のストリームをファイルに保存し、そのファイルを解析しようとしたときに、Tag96 から変換された文字列に見覚えがあることに突然気づきました。それはまだ STEP である「8=」で始まっています。協定はどうなったかというと、これは詐欺であり、彼が渡した文書には自分がマトリョーシカであるとは書かれておらず、マトリョーシカを禁止することが合意されていた。

結局、Tag96 を取り出して STEP プロトコルを解析するコードを再度実行し、次に Tag96 を取り出して解析すると、解析は成功しました。実際、元の方法は実際には正しかったのです。問題は何もありませんでした。それ以上に、データソースが私に穴を掘りました。

サンプルコード

まず偉人のコードに行き、個人的な参照には必要のない数行のコメントを追加しましょう

        //从文件中导入模板,自己注意一下路径即可
     	InputStream templateSource = new FileInputStream("data/RDDFastTemplates-1.1.xml");
		XMLMessageTemplateLoader templateLoader = new XMLMessageTemplateLoader();
		templateLoader.setLoadTemplateIdFromAuxId(true);
		//载入模板
		templateLoader.load(templateSource);
		
		System.out.println("the tamplate count is" + templateLoader.getTemplateRegistry().getTemplates().length);
		
		//载入数据源
		InputStream is = new FileInputStream("data/fastdata.bin");
		MessageInputStream mis = new MessageInputStream(is);
		//注册模板
		mis.setTemplateRegistry(templateLoader.getTemplateRegistry());
		
		Message md = null;
		int iCount = 0;
		//打开debug追踪开关,显示字段信息
		mis.getContext().setTraceEnabled(true);
		
		//循环解析,直到解析完
		while((md = mis.readMessage()) != null)
		{
			System.out.println("the mesage template id is: " + md.getTemplate().getId());
		}

私のコードでは大きな違いはありません

        //用糊涂工具类取文件,模板路径为源代码的:resources/template/template.xml
        ClassPathResource classPathResource = new ClassPathResource("template/template.xml");
        InputStream inputStream = classPathResource.getStream();
        //一个模板文件可能包含多个模板,我这里只有1个,省事就直接搞了
        MessageTemplate template = new XMLMessageTemplateLoader().load(inputStream)[0];

        Context context = new Context();
        context.registerTemplate(4001, template);

        try {
            //数据源byte[]
            InputStream sbs = new ByteArrayInputStream(buff);
            //解码器
            FastDecoder fastDecoder = new FastDecoder(context, sbs);
            //重置一下状态,理论上是没解析一条需要重置一次
            //fastDecoder.reset();
            //解码
            Message msg111 = fastDecoder.readMessage();
            log.info("解码的消息1:{}", msg111.getString(1));
        } catch (Exception e) {
            e.printStackTrace();
        }

おすすめ

転載: blog.csdn.net/qq_33601179/article/details/122360190