Pastebinに同じ質問を追加しました。https://pastebin.com/QtZKcBic (貼り付けたときにいくつかのxmlタグが見つからないことがわかりました)
毎分数千人のユーザーがアクセスしているため、ミリ秒単位で更新された継続的に実行されるログからデータを読み取る必要があります。私の要件は次のとおりです
次のxmlリクエストがあるとします。
<dataReq>
<id>1</id>
<name>test</name>
<reqId>ddaabyy234</reqid>
....
...
....
</dataReq>
上記の要求に対する応答は次のとおりです。
<dataRes>
<id>1</id>
<dept>railway</dept>
<reqId>ddaabyy234</reqid>
.......
.......
<errcode>
<errNum>404</errNum>
</errcode>
</dataRes>
そう<errNum>
でない場合は200
キャプチャする必要があり<dataReq>..</dataReq>
ます。<dataRes>..</dataRes>
ここで問題は、複数のタグがある可能性<dataReq>...</dataReq>
があることです。これは、多くのユーザーがwebUI(または)モバイル(または)アプリケーションから同じアプリケーションに要求を送信している間にバックエンドシステムで応答を生成するのに時間がかかるためです。
また、5分ごとにログファイルのサイズが大きくなるため、ログは5分ごとにアーカイブファイルとしてアーカイブされます。
答え1
これTXR言語ライブラリには「wake」機能があります。これはtail -f
、ユーティリティと同様に、動的ログファイルに従うストリームオブジェクトです。
この関数呼び出しは、(open-tail "/path/to/it")
ウェイクアップを生成して返します。ファイルが存在する必要はありません。ファイルが存在する場合、ストリームはファイルを最後まで読み取った後、ファイルが大きくなったり、急に減ったり、消えたり、再び表示されたりすることを監視し、アプリケーションに無限のデータストリームのファンタジーを提供します。もちろん、アプリケーションはストリームからデータを十分に高速に読み取る必要があります。これはファイルの回転頻度に関連しています。
次のプログラムは、各トランザクション(要求 - 応答ペア)に関する情報を追跡するデータ構造を定義し、wakeを使用してdata
TXRパターン言語呼び出しを使用してログファイルをスキャンします。
要求が一致すると、新しいトランザクションオブジェクトを作成し、それをIDでキー付きハッシュテーブルに入れます。
失敗した応答(200以外のコード)が表示された場合は、そのIDのトランザクションを検索してください。存在する場合は、応答情報で更新して印刷します(オブジェクトのカスタム印刷機能を使用してXML要求と応答のペアを再生成します)。
応答が一致すると、成功または失敗に関係なく、ハッシュテーブルから一致するトランザクションを削除します。
@(do
(defstruct xact nil
id
req-inner-xml
res-inner-xml
(:method print (me *stdout* pretty-p)
(cond
(pretty-p
(put-line "<dataReq>")
[mapdo put-line me.req-inner-xml]
(put-line "</dataReq>")
(put-line "<dataRes>")
[mapdo put-line me.res-inner-xml]
(put-line "</dataRes>"))
(t :))))
(defvarl xact (hash)))
@(next (open-tail "data"))
@(repeat)
@ (cases)
<dataReq>
@ (all)
<id>@id</id>
@ (and)
@ (collect)
@lines
@ (until)
</dataReq>
@ (end)
@ (end)
@ (do (set [xact id] (new xact
id id
req-inner-xml lines)))
@ (or)
<dataRes>
@ (all)
<id>@id</id>
@ (and)
@ (skip)
<errcode>
<errNum>@err</errNum>
</errcode>
@ (and)
@ (collect)
@lines
@ (until)
</dataRes>
@ (end)
@ (end)
@ (do
(whenlet ((x (del [xact id])))
(when (nequal err "200")
(set x.res-inner-xml lines)
(pprint x))))
@ (end)
@(end)