Сначала немного фона:
В настоящее время я использую j-interop для запроса вызовов WMI на ящик Windows из коробки Linux, я выполняю этот запрос для 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, и выполнить прямой запрос для всех событий, где их идентификатор записи превышает последний, я предполагаю, что это будет работать лучше, однако я не знаком с DCOM.
Итак, мой вопрос:
Если я запущу ExecQuery вместо запроса уведомления, придется ли мне перемещаться назад и вперед между клиентом / сервером, чтобы перебирать каждую запись, возвращаемую запросом из-за характера распределенного COM?