0

最初の背景:

現在、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 の性質上、クライアント/サーバー間を行ったり来たりして、クエリによって返された各レコードを反復処理する必要がありますか?

4

1 に答える 1

0

ここでの主な解決策は、これに DCOM を使用しないことです。DCOM は非常に非効率的であり、大量の DCOM 命令を実行することで、サーバーにかなりの量の CPU 負荷をかけてしまいました。

これをリモートで実行したい場合、またはWinAPIをローカルで実行したい場合は、Windows RPC Java実装を検討しています。

于 2011-10-27T13:52:45.767 に答える