diff --git a/agent/src/main/java/com/microsoft/hydralab/agent/service/DeviceControlService.java b/agent/src/main/java/com/microsoft/hydralab/agent/service/DeviceControlService.java index 40893b66c..df281655b 100644 --- a/agent/src/main/java/com/microsoft/hydralab/agent/service/DeviceControlService.java +++ b/agent/src/main/java/com/microsoft/hydralab/agent/service/DeviceControlService.java @@ -16,6 +16,7 @@ import com.microsoft.hydralab.common.management.listener.impl.DeviceStabilityMonitor; import com.microsoft.hydralab.common.management.listener.impl.PreInstallListener; import com.microsoft.hydralab.common.util.Const; +import com.microsoft.hydralab.common.util.ThreadPoolUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -51,7 +52,7 @@ public Set getAllConnectedDevice() { } public void provideDeviceList(AgentUser.BatteryStrategy batteryStrategy) { - captureAllScreensSync(batteryStrategy); + captureAllScreen(batteryStrategy); Set allConnectedDevices = getAllConnectedDevice(); ArrayList deviceInfos = new ArrayList<>(allConnectedDevices); deviceInfos.sort(Comparator.comparing(d -> d.getName() + d.getSerialNum())); @@ -63,10 +64,17 @@ public void provideDeviceList(AgentUser.BatteryStrategy batteryStrategy) { deviceInfos.stream().map(MobileDevice::getSerialNum).collect(Collectors.joining(","))); } - public void captureAllScreensSync(AgentUser.BatteryStrategy batteryStrategy) { + public void captureAllScreen(AgentUser.BatteryStrategy batteryStrategy) { Set allConnectedDevices = agentManagementService.getActiveDeviceList(log); + // we need to do this in an async way, otherwise the process will be blocked if one device is not responding allConnectedDevices.forEach(deviceInfo -> { - deviceDriverManager.getScreenShotWithStrategy(deviceInfo, log, batteryStrategy); + ThreadPoolUtil.SCREENSHOT_EXECUTOR.execute(() -> { + try { + deviceDriverManager.getScreenShotWithStrategy(deviceInfo, log, batteryStrategy); + } catch (Exception e) { + log.error("Failed to capture screenshot for device: {}", deviceInfo.getSerialNum(), e); + } + }); }); }