|
|
@ -77,6 +77,8 @@ import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
import java.util.concurrent.ConcurrentMap;
|
|
|
|
import java.util.concurrent.ConcurrentMap;
|
|
|
|
|
|
|
|
import java.util.concurrent.Executors;
|
|
|
|
|
|
|
|
import java.util.concurrent.ThreadPoolExecutor;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* This class implements all the functionality exposed as part of the OperationManager. Any transaction initiated
|
|
|
|
* This class implements all the functionality exposed as part of the OperationManager. Any transaction initiated
|
|
|
@ -105,6 +107,8 @@ public class OperationManagerImpl implements OperationManager {
|
|
|
|
private final Map<Integer, Long> lastUpdatedTimeStamps;
|
|
|
|
private final Map<Integer, Long> lastUpdatedTimeStamps;
|
|
|
|
private final ConcurrentMap<Integer, String> operationsInitBy;
|
|
|
|
private final ConcurrentMap<Integer, String> operationsInitBy;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final ThreadPoolExecutor notificationExecutor;
|
|
|
|
|
|
|
|
|
|
|
|
public OperationManagerImpl() {
|
|
|
|
public OperationManagerImpl() {
|
|
|
|
commandOperationDAO = OperationManagementDAOFactory.getCommandOperationDAO();
|
|
|
|
commandOperationDAO = OperationManagementDAOFactory.getCommandOperationDAO();
|
|
|
|
configOperationDAO = OperationManagementDAOFactory.getConfigOperationDAO();
|
|
|
|
configOperationDAO = OperationManagementDAOFactory.getConfigOperationDAO();
|
|
|
@ -117,6 +121,7 @@ public class OperationManagerImpl implements OperationManager {
|
|
|
|
notificationStrategies = new HashMap<>();
|
|
|
|
notificationStrategies = new HashMap<>();
|
|
|
|
lastUpdatedTimeStamps = new HashMap<>();
|
|
|
|
lastUpdatedTimeStamps = new HashMap<>();
|
|
|
|
operationsInitBy = new ConcurrentHashMap<>();
|
|
|
|
operationsInitBy = new ConcurrentHashMap<>();
|
|
|
|
|
|
|
|
notificationExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public OperationManagerImpl(String deviceType, DeviceManagementService deviceManagementService) {
|
|
|
|
public OperationManagerImpl(String deviceType, DeviceManagementService deviceManagementService) {
|
|
|
@ -422,6 +427,10 @@ public class OperationManagerImpl implements OperationManager {
|
|
|
|
* Otherwise device may call pending operation while DB is locked for write and deadlock can occur.
|
|
|
|
* Otherwise device may call pending operation while DB is locked for write and deadlock can occur.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
if (notificationStrategy != null) {
|
|
|
|
if (notificationStrategy != null) {
|
|
|
|
|
|
|
|
int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
|
|
|
|
|
|
|
|
notificationExecutor.execute(() -> {
|
|
|
|
|
|
|
|
PrivilegedCarbonContext.startTenantFlow();
|
|
|
|
|
|
|
|
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantId, true);
|
|
|
|
if (log.isDebugEnabled()) {
|
|
|
|
if (log.isDebugEnabled()) {
|
|
|
|
log.debug("Sending push notification to " + device.getDeviceIdentifier() + " from add operation method.");
|
|
|
|
log.debug("Sending push notification to " + device.getDeviceIdentifier() + " from add operation method.");
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -466,6 +475,8 @@ public class OperationManagerImpl implements OperationManager {
|
|
|
|
log.error("Error occurred while sending notifications to " + device.getType() +
|
|
|
|
log.error("Error occurred while sending notifications to " + device.getType() +
|
|
|
|
" device carrying id '" + device.getDeviceIdentifier() + "'", e);
|
|
|
|
" device carrying id '" + device.getDeviceIdentifier() + "'", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
PrivilegedCarbonContext.endTenantFlow();
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|