最初の背景:
現在、j-interop を使用して、Linux ボックスから Windows ボックスへの WMI 呼び出しをクエリしています。WMI に対して次のクエリを実行しています。
SELECT * FROM __InstanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent'
そして、それを通知クエリとして実行して、作成されたらすぐにデータを取得できるようにします。ただし、これは (まれな) 場合に問題を引き起こします。
たとえば、ユーザーがルート フォルダーのアクセス許可を変更すると、何千ものログが殺到する可能性があります。システムはこれを問題なく処理でき、Java と相互運用コードは問題なく動作しますが、WMI サイクルは次のようになります。
Hook into event
while(forever)
{
Query server for next event.
Do work with event.
}
明らかに、これは私にとってはうまくいきません.サーバーから何千回も行き来するため、プログラムはチョークしませんが、確かに永遠に時間がかかります.イベントを取得してすべてを返す方法を見つけることができません.保留中のイベント(と思います)。
次の選択肢は、WMI によって返された最後のレコード ID を追跡し、レコード ID が最後のものよりも大きいすべてのイベントに対して直接クエリを実行することです。これはうまくいくと思いますが、よくわかりませんDCOMで。
だから私の質問:
通知クエリの代わりに ExecQuery を実行すると、分散 COM の性質上、クライアント/サーバー間を行ったり来たりして、クエリによって返された各レコードを反復処理する必要がありますか?