removed rpc status sent, added idx_rpc_tenant_id_device_id
This commit is contained in:
parent
6b546a459e
commit
e58d5b2d8a
@ -209,3 +209,5 @@ CREATE TABLE IF NOT EXISTS rpc (
|
|||||||
status varchar(255) NOT NULL
|
status varchar(255) NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_rpc_tenant_id_device_id ON rpc(tenant_id, device_id);
|
||||||
|
|
||||||
|
|||||||
@ -174,20 +174,15 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
|
|
||||||
long timeout = request.getExpirationTime() - System.currentTimeMillis();
|
long timeout = request.getExpirationTime() - System.currentTimeMillis();
|
||||||
boolean persisted = request.isPersisted();
|
boolean persisted = request.isPersisted();
|
||||||
|
|
||||||
if (timeout <= 0) {
|
if (timeout <= 0) {
|
||||||
log.debug("[{}][{}] Ignoring message due to exp time reached, {}", deviceId, request.getId(), request.getExpirationTime());
|
log.debug("[{}][{}] Ignoring message due to exp time reached, {}", deviceId, request.getId(), request.getExpirationTime());
|
||||||
|
|
||||||
if (persisted) {
|
if (persisted) {
|
||||||
Rpc rpc = new Rpc(new RpcId(request.getId()));
|
createRpc(request, RpcStatus.TIMEOUT);
|
||||||
rpc.setCreatedTime(System.currentTimeMillis());
|
|
||||||
rpc.setTenantId(tenantId);
|
|
||||||
rpc.setDeviceId(deviceId);
|
|
||||||
rpc.setExpirationTime(request.getExpirationTime());
|
|
||||||
rpc.setRequest(JacksonUtil.valueToTree(request));
|
|
||||||
rpc.setStatus(RpcStatus.TIMEOUT);
|
|
||||||
systemContext.getTbRpcService().save(tenantId, rpc);
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
} else if (persisted) {
|
||||||
|
createRpc(request, RpcStatus.QUEUED);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean sent;
|
boolean sent;
|
||||||
@ -204,24 +199,14 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
syncSessionSet.add(key);
|
syncSessionSet.add(key);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
log.trace("46) Rpc syncSessionSet [{}] subscription after sent [{}]",syncSessionSet, rpcSubscriptions);
|
log.trace("46) Rpc syncSessionSet [{}] subscription after sent [{}]", syncSessionSet, rpcSubscriptions);
|
||||||
syncSessionSet.forEach(rpcSubscriptions::remove);
|
syncSessionSet.forEach(rpcSubscriptions::remove);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (persisted) {
|
if (persisted && !(sent || request.isOneway())) {
|
||||||
Rpc rpc = new Rpc(new RpcId(request.getId()));
|
ObjectNode response = JacksonUtil.newObjectNode();
|
||||||
rpc.setCreatedTime(System.currentTimeMillis());
|
response.put("rpcId", request.getId().toString());
|
||||||
rpc.setTenantId(tenantId);
|
systemContext.getTbCoreDeviceRpcService().processRpcResponseFromDeviceActor(new FromDeviceRpcResponse(msg.getMsg().getId(), JacksonUtil.toString(response), null));
|
||||||
rpc.setDeviceId(deviceId);
|
|
||||||
rpc.setExpirationTime(request.getExpirationTime());
|
|
||||||
rpc.setRequest(JacksonUtil.valueToTree(request));
|
|
||||||
rpc.setStatus(sent ? RpcStatus.SENT : RpcStatus.QUEUED);
|
|
||||||
systemContext.getTbRpcService().save(tenantId, rpc);
|
|
||||||
if (!(sent || request.isOneway())) {
|
|
||||||
ObjectNode response = JacksonUtil.newObjectNode();
|
|
||||||
response.put("rpcId", request.getId().toString());
|
|
||||||
systemContext.getTbCoreDeviceRpcService().processRpcResponseFromDeviceActor(new FromDeviceRpcResponse(msg.getMsg().getId(), JacksonUtil.toString(response), null));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.isOneway() && sent) {
|
if (request.isOneway() && sent) {
|
||||||
@ -237,6 +222,18 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Rpc createRpc(ToDeviceRpcRequest request, RpcStatus status) {
|
||||||
|
Rpc rpc = new Rpc(new RpcId(request.getId()));
|
||||||
|
rpc.setCreatedTime(System.currentTimeMillis());
|
||||||
|
rpc.setTenantId(tenantId);
|
||||||
|
rpc.setDeviceId(deviceId);
|
||||||
|
rpc.setExpirationTime(request.getExpirationTime());
|
||||||
|
rpc.setRequest(JacksonUtil.valueToTree(request));
|
||||||
|
rpc.setStatus(status);
|
||||||
|
systemContext.getTbRpcService().save(tenantId, rpc);
|
||||||
|
return systemContext.getTbRpcService().save(tenantId, rpc);
|
||||||
|
}
|
||||||
|
|
||||||
private ToDeviceRpcRequestMsg creteToDeviceRpcRequestMsg(ToDeviceRpcRequest request) {
|
private ToDeviceRpcRequestMsg creteToDeviceRpcRequestMsg(ToDeviceRpcRequest request) {
|
||||||
ToDeviceRpcRequestBody body = request.getBody();
|
ToDeviceRpcRequestBody body = request.getBody();
|
||||||
return ToDeviceRpcRequestMsg.newBuilder()
|
return ToDeviceRpcRequestMsg.newBuilder()
|
||||||
@ -318,9 +315,6 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
.setPersisted(request.isPersisted())
|
.setPersisted(request.isPersisted())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
if (request.isPersisted()) {
|
|
||||||
systemContext.getTbRpcService().save(tenantId, new RpcId(request.getId()), RpcStatus.SENT, null);
|
|
||||||
}
|
|
||||||
sendToTransport(rpcRequest, sessionId, nodeId);
|
sendToTransport(rpcRequest, sessionId, nodeId);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -821,10 +815,10 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
|
|
||||||
void init(TbActorCtx ctx) {
|
void init(TbActorCtx ctx) {
|
||||||
schedulePeriodicMsgWithDelay(ctx, SessionTimeoutCheckMsg.instance(), systemContext.getSessionReportTimeout(), systemContext.getSessionReportTimeout());
|
schedulePeriodicMsgWithDelay(ctx, SessionTimeoutCheckMsg.instance(), systemContext.getSessionReportTimeout(), systemContext.getSessionReportTimeout());
|
||||||
PageLink pageLink = new PageLink(10);
|
PageLink pageLink = new PageLink(1024);
|
||||||
PageData<Rpc> pageData;
|
PageData<Rpc> pageData;
|
||||||
do {
|
do {
|
||||||
pageData = systemContext.getTbRpcService().findAllByDeviceIdAndStatus(deviceId, RpcStatus.QUEUED, pageLink);
|
pageData = systemContext.getTbRpcService().findAllByDeviceIdAndStatus(tenantId, deviceId, RpcStatus.QUEUED, pageLink);
|
||||||
pageData.getData().forEach(rpc -> {
|
pageData.getData().forEach(rpc -> {
|
||||||
ToDeviceRpcRequest msg = JacksonUtil.convertValue(rpc.getRequest(), ToDeviceRpcRequest.class);
|
ToDeviceRpcRequest msg = JacksonUtil.convertValue(rpc.getRequest(), ToDeviceRpcRequest.class);
|
||||||
long timeout = rpc.getExpirationTime() - System.currentTimeMillis();
|
long timeout = rpc.getExpirationTime() - System.currentTimeMillis();
|
||||||
|
|||||||
@ -29,6 +29,7 @@ import org.springframework.web.bind.annotation.PathVariable;
|
|||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.context.request.async.DeferredResult;
|
import org.springframework.web.context.request.async.DeferredResult;
|
||||||
@ -41,7 +42,10 @@ import org.thingsboard.server.common.data.id.EntityId;
|
|||||||
import org.thingsboard.server.common.data.id.RpcId;
|
import org.thingsboard.server.common.data.id.RpcId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.id.UUIDBased;
|
import org.thingsboard.server.common.data.id.UUIDBased;
|
||||||
|
import org.thingsboard.server.common.data.page.PageData;
|
||||||
|
import org.thingsboard.server.common.data.page.PageLink;
|
||||||
import org.thingsboard.server.common.data.rpc.Rpc;
|
import org.thingsboard.server.common.data.rpc.Rpc;
|
||||||
|
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
||||||
import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody;
|
import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody;
|
||||||
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
|
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
@ -95,7 +99,7 @@ public class RpcController extends BaseController {
|
|||||||
return handleDeviceRPCRequest(false, new DeviceId(UUID.fromString(deviceIdStr)), requestBody);
|
return handleDeviceRPCRequest(false, new DeviceId(UUID.fromString(deviceIdStr)), requestBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
|
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
@RequestMapping(value = "/persisted/{rpcId}", method = RequestMethod.GET)
|
@RequestMapping(value = "/persisted/{rpcId}", method = RequestMethod.GET)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Rpc getPersistedRpc(@PathVariable("rpcId") String strRpc) throws ThingsboardException {
|
public Rpc getPersistedRpc(@PathVariable("rpcId") String strRpc) throws ThingsboardException {
|
||||||
@ -108,6 +112,39 @@ public class RpcController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
|
||||||
|
@RequestMapping(value = "/persisted/{deviceId}", method = RequestMethod.GET)
|
||||||
|
@ResponseBody
|
||||||
|
public PageData<Rpc> getPersistedRpcByDevice(@PathVariable("deviceId") String strDeviceId,
|
||||||
|
@RequestParam int pageSize,
|
||||||
|
@RequestParam int page,
|
||||||
|
@RequestParam RpcStatus rpcStatus,
|
||||||
|
@RequestParam(required = false) String textSearch,
|
||||||
|
@RequestParam(required = false) String sortProperty,
|
||||||
|
@RequestParam(required = false) String sortOrder) throws ThingsboardException {
|
||||||
|
checkParameter("DeviceId", strDeviceId);
|
||||||
|
try {
|
||||||
|
TenantId tenantId = getCurrentUser().getTenantId();
|
||||||
|
PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
|
||||||
|
DeviceId deviceId = new DeviceId(UUID.fromString(strDeviceId));
|
||||||
|
return checkNotNull(rpcService.findAllByDeviceIdAndStatus(tenantId, deviceId, rpcStatus, pageLink));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw handleException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
|
||||||
|
@RequestMapping(value = "/persisted/{rpcId}", method = RequestMethod.DELETE)
|
||||||
|
@ResponseBody
|
||||||
|
public void deleteResource(@PathVariable("rpcId") String strRpc) throws ThingsboardException {
|
||||||
|
checkParameter("RpcId", strRpc);
|
||||||
|
try {
|
||||||
|
rpcService.deleteRpc(getTenantId(), new RpcId(UUID.fromString(strRpc)));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw handleException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private DeferredResult<ResponseEntity> handleDeviceRPCRequest(boolean oneWay, DeviceId deviceId, String requestBody) throws ThingsboardException {
|
private DeferredResult<ResponseEntity> handleDeviceRPCRequest(boolean oneWay, DeviceId deviceId, String requestBody) throws ThingsboardException {
|
||||||
try {
|
try {
|
||||||
JsonNode rpcRequestBody = jsonMapper.readTree(requestBody);
|
JsonNode rpcRequestBody = jsonMapper.readTree(requestBody);
|
||||||
|
|||||||
@ -54,7 +54,7 @@ public class RuleEngineEntityActionService {
|
|||||||
|
|
||||||
private static final ObjectMapper json = new ObjectMapper();
|
private static final ObjectMapper json = new ObjectMapper();
|
||||||
|
|
||||||
public void pushEntityActionToRuleEngine(EntityId entityId, Object entity, TenantId tenantId, CustomerId customerId,
|
public void pushEntityActionToRuleEngine(EntityId entityId, HasName entity, TenantId tenantId, CustomerId customerId,
|
||||||
ActionType actionType, User user, Object... additionalInfo) {
|
ActionType actionType, User user, Object... additionalInfo) {
|
||||||
String msgType = null;
|
String msgType = null;
|
||||||
switch (actionType) {
|
switch (actionType) {
|
||||||
|
|||||||
@ -41,9 +41,10 @@ public class TbRpcService {
|
|||||||
private final RpcService rpcService;
|
private final RpcService rpcService;
|
||||||
private final TbClusterService tbClusterService;
|
private final TbClusterService tbClusterService;
|
||||||
|
|
||||||
public void save(TenantId tenantId, Rpc rpc) {
|
public Rpc save(TenantId tenantId, Rpc rpc) {
|
||||||
Rpc saved = rpcService.save(tenantId, rpc);
|
Rpc saved = rpcService.save(rpc);
|
||||||
pushRpcMsgToRuleEngine(tenantId, saved);
|
pushRpcMsgToRuleEngine(tenantId, saved);
|
||||||
|
return saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save(TenantId tenantId, RpcId rpcId, RpcStatus newStatus, JsonNode response) {
|
public void save(TenantId tenantId, RpcId rpcId, RpcStatus newStatus, JsonNode response) {
|
||||||
@ -53,7 +54,7 @@ public class TbRpcService {
|
|||||||
if (response != null) {
|
if (response != null) {
|
||||||
foundRpc.setResponse(response);
|
foundRpc.setResponse(response);
|
||||||
}
|
}
|
||||||
Rpc saved = rpcService.save(tenantId, foundRpc);
|
Rpc saved = rpcService.save(foundRpc);
|
||||||
pushRpcMsgToRuleEngine(tenantId, saved);
|
pushRpcMsgToRuleEngine(tenantId, saved);
|
||||||
} else {
|
} else {
|
||||||
log.warn("[{}] Failed to update RPC status because RPC was already deleted", rpcId);
|
log.warn("[{}] Failed to update RPC status because RPC was already deleted", rpcId);
|
||||||
@ -69,8 +70,8 @@ public class TbRpcService {
|
|||||||
return rpcService.findById(tenantId, rpcId);
|
return rpcService.findById(tenantId, rpcId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public PageData<Rpc> findAllByDeviceIdAndStatus(DeviceId deviceId, RpcStatus rpcStatus, PageLink pageLink) {
|
public PageData<Rpc> findAllByDeviceIdAndStatus(TenantId tenantId, DeviceId deviceId, RpcStatus rpcStatus, PageLink pageLink) {
|
||||||
return rpcService.findAllByDeviceIdAndStatus(deviceId, rpcStatus, pageLink);
|
return rpcService.findAllByDeviceIdAndStatus(tenantId, deviceId, rpcStatus, pageLink);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,13 +25,15 @@ import org.thingsboard.server.common.data.rpc.Rpc;
|
|||||||
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
||||||
|
|
||||||
public interface RpcService {
|
public interface RpcService {
|
||||||
Rpc save(TenantId tenantId, Rpc rpc);
|
Rpc save(Rpc rpc);
|
||||||
|
|
||||||
void remove(TenantId tenantId, RpcId id);
|
void deleteRpc(TenantId tenantId, RpcId id);
|
||||||
|
|
||||||
|
void deleteAllRpcByTenantId(TenantId tenantId);
|
||||||
|
|
||||||
Rpc findById(TenantId tenantId, RpcId id);
|
Rpc findById(TenantId tenantId, RpcId id);
|
||||||
|
|
||||||
ListenableFuture<Rpc> findRpcByIdAsync(TenantId tenantId, RpcId id);
|
ListenableFuture<Rpc> findRpcByIdAsync(TenantId tenantId, RpcId id);
|
||||||
|
|
||||||
PageData<Rpc> findAllByDeviceIdAndStatus(DeviceId deviceId, RpcStatus rpcStatus, PageLink pageLink);
|
PageData<Rpc> findAllByDeviceIdAndStatus(TenantId tenantId, DeviceId deviceId, RpcStatus rpcStatus, PageLink pageLink);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -77,7 +77,6 @@ public class DataConstants {
|
|||||||
public static final String RPC_CALL_FROM_SERVER_TO_DEVICE = "RPC_CALL_FROM_SERVER_TO_DEVICE";
|
public static final String RPC_CALL_FROM_SERVER_TO_DEVICE = "RPC_CALL_FROM_SERVER_TO_DEVICE";
|
||||||
|
|
||||||
public static final String RPC_QUEUED = "RPC_QUEUED";
|
public static final String RPC_QUEUED = "RPC_QUEUED";
|
||||||
public static final String RPC_SENT = "RPC_SENT";
|
|
||||||
public static final String RPC_DELIVERED = "RPC_DELIVERED";
|
public static final String RPC_DELIVERED = "RPC_DELIVERED";
|
||||||
public static final String RPC_SUCCESSFUL = "RPC_SUCCESSFUL";
|
public static final String RPC_SUCCESSFUL = "RPC_SUCCESSFUL";
|
||||||
public static final String RPC_TIMEOUT = "RPC_TIMEOUT";
|
public static final String RPC_TIMEOUT = "RPC_TIMEOUT";
|
||||||
|
|||||||
@ -16,5 +16,5 @@
|
|||||||
package org.thingsboard.server.common.data.rpc;
|
package org.thingsboard.server.common.data.rpc;
|
||||||
|
|
||||||
public enum RpcStatus {
|
public enum RpcStatus {
|
||||||
QUEUED, SENT, DELIVERED, SUCCESSFUL, TIMEOUT, FAILED
|
QUEUED, DELIVERED, SUCCESSFUL, TIMEOUT, FAILED
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,35 +26,75 @@ import org.thingsboard.server.common.data.page.PageData;
|
|||||||
import org.thingsboard.server.common.data.page.PageLink;
|
import org.thingsboard.server.common.data.page.PageLink;
|
||||||
import org.thingsboard.server.common.data.rpc.Rpc;
|
import org.thingsboard.server.common.data.rpc.Rpc;
|
||||||
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
||||||
|
import org.thingsboard.server.dao.service.PaginatedRemover;
|
||||||
|
|
||||||
|
import static org.thingsboard.server.dao.service.Validator.validateId;
|
||||||
|
import static org.thingsboard.server.dao.service.Validator.validatePageLink;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class BaseRpcService implements RpcService {
|
public class BaseRpcService implements RpcService {
|
||||||
|
public static final String INCORRECT_TENANT_ID = "Incorrect tenantId ";
|
||||||
|
public static final String INCORRECT_RPC_ID = "Incorrect rpcId ";
|
||||||
|
|
||||||
private final RpcDao rpcDao;
|
private final RpcDao rpcDao;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Rpc save(TenantId tenantId, Rpc rpc) {
|
public Rpc save(Rpc rpc) {
|
||||||
return rpcDao.save(tenantId, rpc);
|
log.trace("Executing save, [{}]", rpc);
|
||||||
|
return rpcDao.save(rpc.getTenantId(), rpc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void remove(TenantId tenantId, RpcId id) {
|
public void deleteRpc(TenantId tenantId, RpcId rpcId) {
|
||||||
rpcDao.removeById(tenantId, id.getId());
|
log.trace("Executing deleteRpc, tenantId [{}], rpcId [{}]", tenantId, rpcId);
|
||||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
|
||||||
|
validateId(rpcId, INCORRECT_RPC_ID + rpcId);
|
||||||
|
rpcDao.removeById(tenantId, rpcId.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Rpc findById(TenantId tenantId, RpcId id) {
|
public void deleteAllRpcByTenantId(TenantId tenantId) {
|
||||||
return rpcDao.findById(tenantId, id.getId());
|
log.trace("Executing deleteAllRpcByTenantId, tenantId [{}]", tenantId);
|
||||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
|
||||||
|
tenantRpcRemover.removeEntities(tenantId, tenantId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<Rpc> findRpcByIdAsync(TenantId tenantId, RpcId id) {
|
public Rpc findById(TenantId tenantId, RpcId rpcId) {
|
||||||
return rpcDao.findByIdAsync(tenantId, id.getId());
|
log.trace("Executing findById, tenantId [{}], rpcId [{}]", tenantId, rpcId);
|
||||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
|
||||||
|
validateId(rpcId, INCORRECT_RPC_ID + rpcId);
|
||||||
|
return rpcDao.findById(tenantId, rpcId.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageData<Rpc> findAllByDeviceIdAndStatus(DeviceId deviceId, RpcStatus rpcStatus, PageLink pageLink) {
|
public ListenableFuture<Rpc> findRpcByIdAsync(TenantId tenantId, RpcId rpcId) {
|
||||||
return rpcDao.findAllByDeviceId(deviceId, rpcStatus, pageLink);
|
log.trace("Executing findRpcByIdAsync, tenantId [{}], rpcId: [{}]", tenantId, rpcId);
|
||||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
|
||||||
|
validateId(rpcId, INCORRECT_RPC_ID + rpcId);
|
||||||
|
return rpcDao.findByIdAsync(tenantId, rpcId.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageData<Rpc> findAllByDeviceIdAndStatus(TenantId tenantId, DeviceId deviceId, RpcStatus rpcStatus, PageLink pageLink) {
|
||||||
|
log.trace("Executing findAllByDeviceIdAndStatus, tenantId [{}], deviceId [{}], rpcStatus [{}], pageLink [{}]", tenantId, deviceId, rpcStatus, pageLink);
|
||||||
|
validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
|
||||||
|
validatePageLink(pageLink);
|
||||||
|
return rpcDao.findAllByDeviceId(tenantId, deviceId, rpcStatus, pageLink);
|
||||||
|
}
|
||||||
|
|
||||||
|
private PaginatedRemover<TenantId, Rpc> tenantRpcRemover =
|
||||||
|
new PaginatedRemover<>() {
|
||||||
|
@Override
|
||||||
|
protected PageData<Rpc> findEntities(TenantId tenantId, TenantId id, PageLink pageLink) {
|
||||||
|
return rpcDao.findAllRpcByTenantId(id, pageLink);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void removeEntity(TenantId tenantId, Rpc entity) {
|
||||||
|
deleteRpc(tenantId, entity.getId());
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,9 @@ import org.thingsboard.server.common.data.rpc.RpcStatus;
|
|||||||
import org.thingsboard.server.dao.Dao;
|
import org.thingsboard.server.dao.Dao;
|
||||||
|
|
||||||
public interface RpcDao extends Dao<Rpc> {
|
public interface RpcDao extends Dao<Rpc> {
|
||||||
PageData<Rpc> findAllByDeviceId(DeviceId deviceId, RpcStatus rpcStatus, PageLink pageLink);
|
PageData<Rpc> findAllByDeviceId(TenantId tenantId, DeviceId deviceId, RpcStatus rpcStatus, PageLink pageLink);
|
||||||
|
|
||||||
|
PageData<Rpc> findAllRpcByTenantId(TenantId tenantId, PageLink pageLink);
|
||||||
|
|
||||||
Long deleteOutdatedRpcByTenantId(TenantId tenantId, Long expirationTime);
|
Long deleteOutdatedRpcByTenantId(TenantId tenantId, Long expirationTime);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -49,10 +49,14 @@ public class JpaRpcDao extends JpaAbstractDao<RpcEntity, Rpc> implements RpcDao
|
|||||||
return rpcRepository;
|
return rpcRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageData<Rpc> findAllByDeviceId(TenantId tenantId, DeviceId deviceId, RpcStatus rpcStatus, PageLink pageLink) {
|
||||||
|
return DaoUtil.toPageData(rpcRepository.findAllByTenantIdAndDeviceIdAndStatus(tenantId.getId(), deviceId.getId(), rpcStatus, DaoUtil.toPageable(pageLink)));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageData<Rpc> findAllByDeviceId(DeviceId deviceId, RpcStatus rpcStatus, PageLink pageLink) {
|
public PageData<Rpc> findAllRpcByTenantId(TenantId tenantId, PageLink pageLink) {
|
||||||
return DaoUtil.toPageData(rpcRepository.findAllByDeviceIdAndStatus(deviceId.getId(), rpcStatus, DaoUtil.toPageable(pageLink)));
|
return DaoUtil.toPageData(rpcRepository.findAllByTenantId(tenantId.getId(), DaoUtil.toPageable(pageLink)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -26,7 +26,9 @@ import org.thingsboard.server.dao.model.sql.RpcEntity;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public interface RpcRepository extends CrudRepository<RpcEntity, UUID> {
|
public interface RpcRepository extends CrudRepository<RpcEntity, UUID> {
|
||||||
Page<RpcEntity> findAllByDeviceIdAndStatus(UUID deviceId, RpcStatus status, Pageable pageable);
|
Page<RpcEntity> findAllByTenantIdAndDeviceIdAndStatus(UUID tenantId, UUID deviceId, RpcStatus status, Pageable pageable);
|
||||||
|
|
||||||
|
Page<RpcEntity> findAllByTenantId(UUID tenantId, Pageable pageable);
|
||||||
|
|
||||||
@Query(value = "WITH deleted AS (DELETE FROM rpc WHERE (tenant_id = :tenantId AND created_time < :expirationTime) IS TRUE RETURNING *) SELECT count(*) FROM deleted",
|
@Query(value = "WITH deleted AS (DELETE FROM rpc WHERE (tenant_id = :tenantId AND created_time < :expirationTime) IS TRUE RETURNING *) SELECT count(*) FROM deleted",
|
||||||
nativeQuery = true)
|
nativeQuery = true)
|
||||||
|
|||||||
@ -37,6 +37,7 @@ import org.thingsboard.server.dao.entityview.EntityViewService;
|
|||||||
import org.thingsboard.server.dao.exception.DataValidationException;
|
import org.thingsboard.server.dao.exception.DataValidationException;
|
||||||
import org.thingsboard.server.dao.ota.OtaPackageService;
|
import org.thingsboard.server.dao.ota.OtaPackageService;
|
||||||
import org.thingsboard.server.dao.resource.ResourceService;
|
import org.thingsboard.server.dao.resource.ResourceService;
|
||||||
|
import org.thingsboard.server.dao.rpc.RpcService;
|
||||||
import org.thingsboard.server.dao.rule.RuleChainService;
|
import org.thingsboard.server.dao.rule.RuleChainService;
|
||||||
import org.thingsboard.server.dao.service.DataValidator;
|
import org.thingsboard.server.dao.service.DataValidator;
|
||||||
import org.thingsboard.server.dao.service.PaginatedRemover;
|
import org.thingsboard.server.dao.service.PaginatedRemover;
|
||||||
@ -96,6 +97,9 @@ public class TenantServiceImpl extends AbstractEntityService implements TenantSe
|
|||||||
@Autowired
|
@Autowired
|
||||||
private OtaPackageService otaPackageService;
|
private OtaPackageService otaPackageService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RpcService rpcService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Tenant findTenantById(TenantId tenantId) {
|
public Tenant findTenantById(TenantId tenantId) {
|
||||||
log.trace("Executing findTenantById [{}]", tenantId);
|
log.trace("Executing findTenantById [{}]", tenantId);
|
||||||
@ -151,6 +155,7 @@ public class TenantServiceImpl extends AbstractEntityService implements TenantSe
|
|||||||
apiUsageStateService.deleteApiUsageStateByTenantId(tenantId);
|
apiUsageStateService.deleteApiUsageStateByTenantId(tenantId);
|
||||||
resourceService.deleteResourcesByTenantId(tenantId);
|
resourceService.deleteResourcesByTenantId(tenantId);
|
||||||
otaPackageService.deleteOtaPackagesByTenantId(tenantId);
|
otaPackageService.deleteOtaPackagesByTenantId(tenantId);
|
||||||
|
rpcService.deleteAllRpcByTenantId(tenantId);
|
||||||
tenantDao.removeById(tenantId, tenantId.getId());
|
tenantDao.removeById(tenantId, tenantId.getId());
|
||||||
deleteEntityRelations(tenantId, tenantId);
|
deleteEntityRelations(tenantId, tenantId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,3 +46,4 @@ CREATE INDEX IF NOT EXISTS idx_attribute_kv_by_key_and_last_update_ts ON attribu
|
|||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_audit_log_tenant_id_and_created_time ON audit_log(tenant_id, created_time);
|
CREATE INDEX IF NOT EXISTS idx_audit_log_tenant_id_and_created_time ON audit_log(tenant_id, created_time);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_rpc_tenant_id_device_id ON rpc(tenant_id, device_id);
|
||||||
|
|||||||
@ -33,7 +33,7 @@ import org.thingsboard.server.common.msg.session.SessionMsgType;
|
|||||||
type = ComponentType.FILTER,
|
type = ComponentType.FILTER,
|
||||||
name = "message type switch",
|
name = "message type switch",
|
||||||
configClazz = EmptyNodeConfiguration.class,
|
configClazz = EmptyNodeConfiguration.class,
|
||||||
relationTypes = {"Post attributes", "Post telemetry", "RPC Request from Device", "RPC Request to Device", "RPC Queued", "RPC Sent", "RPC Delivered", "RPC Successful", "RPC Timeout", "RPC Failed",
|
relationTypes = {"Post attributes", "Post telemetry", "RPC Request from Device", "RPC Request to Device", "RPC Queued", "RPC Delivered", "RPC Successful", "RPC Timeout", "RPC Failed",
|
||||||
"Activity Event", "Inactivity Event", "Connect Event", "Disconnect Event", "Entity Created", "Entity Updated", "Entity Deleted", "Entity Assigned",
|
"Activity Event", "Inactivity Event", "Connect Event", "Disconnect Event", "Entity Created", "Entity Updated", "Entity Deleted", "Entity Assigned",
|
||||||
"Entity Unassigned", "Attributes Updated", "Attributes Deleted", "Alarm Acknowledged", "Alarm Cleared", "Other", "Entity Assigned From Tenant", "Entity Assigned To Tenant",
|
"Entity Unassigned", "Attributes Updated", "Attributes Deleted", "Alarm Acknowledged", "Alarm Cleared", "Other", "Entity Assigned From Tenant", "Entity Assigned To Tenant",
|
||||||
"Timeseries Updated", "Timeseries Deleted"},
|
"Timeseries Updated", "Timeseries Deleted"},
|
||||||
@ -97,8 +97,6 @@ public class TbMsgTypeSwitchNode implements TbNode {
|
|||||||
relationType = "Timeseries Deleted";
|
relationType = "Timeseries Deleted";
|
||||||
} else if (msg.getType().equals(DataConstants.RPC_QUEUED)) {
|
} else if (msg.getType().equals(DataConstants.RPC_QUEUED)) {
|
||||||
relationType = "RPC Queued";
|
relationType = "RPC Queued";
|
||||||
} else if (msg.getType().equals(DataConstants.RPC_SENT)) {
|
|
||||||
relationType = "RPC Sent";
|
|
||||||
} else if (msg.getType().equals(DataConstants.RPC_DELIVERED)) {
|
} else if (msg.getType().equals(DataConstants.RPC_DELIVERED)) {
|
||||||
relationType = "RPC Delivered";
|
relationType = "RPC Delivered";
|
||||||
} else if (msg.getType().equals(DataConstants.RPC_SUCCESSFUL)) {
|
} else if (msg.getType().equals(DataConstants.RPC_SUCCESSFUL)) {
|
||||||
|
|||||||
@ -354,9 +354,8 @@ export enum MessageType {
|
|||||||
TIMESERIES_UPDATED = 'TIMESERIES_UPDATED',
|
TIMESERIES_UPDATED = 'TIMESERIES_UPDATED',
|
||||||
TIMESERIES_DELETED = 'TIMESERIES_DELETED',
|
TIMESERIES_DELETED = 'TIMESERIES_DELETED',
|
||||||
RPC_QUEUED = 'RPC_QUEUED',
|
RPC_QUEUED = 'RPC_QUEUED',
|
||||||
RPC_SENT = 'RPC_SENT',
|
RPC_DELIVERED = 'RPC_DELIVERED',
|
||||||
RPC_DELIVERED = 'RPC_SENT',
|
RPC_SUCCESSFUL = 'RPC_SUCCESSFUL',
|
||||||
RPC_SUCCESSFUL = 'RPC_DELIVERED',
|
|
||||||
RPC_TIMEOUT = 'RPC_TIMEOUT',
|
RPC_TIMEOUT = 'RPC_TIMEOUT',
|
||||||
RPC_FAILED = 'RPC_FAILED'
|
RPC_FAILED = 'RPC_FAILED'
|
||||||
}
|
}
|
||||||
@ -381,7 +380,6 @@ export const messageTypeNames = new Map<MessageType, string>(
|
|||||||
[MessageType.TIMESERIES_UPDATED, 'Timeseries Updated'],
|
[MessageType.TIMESERIES_UPDATED, 'Timeseries Updated'],
|
||||||
[MessageType.TIMESERIES_DELETED, 'Timeseries Deleted'],
|
[MessageType.TIMESERIES_DELETED, 'Timeseries Deleted'],
|
||||||
[MessageType.RPC_QUEUED, 'RPC Queued'],
|
[MessageType.RPC_QUEUED, 'RPC Queued'],
|
||||||
[MessageType.RPC_SENT, 'RPC Sent'],
|
|
||||||
[MessageType.RPC_DELIVERED, 'RPC Delivered'],
|
[MessageType.RPC_DELIVERED, 'RPC Delivered'],
|
||||||
[MessageType.RPC_SUCCESSFUL, 'RPC Successful'],
|
[MessageType.RPC_SUCCESSFUL, 'RPC Successful'],
|
||||||
[MessageType.RPC_TIMEOUT, 'RPC Timeout'],
|
[MessageType.RPC_TIMEOUT, 'RPC Timeout'],
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user