added removing rpc request from pending map after rpc deleting
This commit is contained in:
parent
9093206bc5
commit
d44adcfe75
@ -95,6 +95,7 @@ public class AppActor extends ContextAwareActor {
|
|||||||
case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG:
|
case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG:
|
||||||
case DEVICE_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG:
|
case DEVICE_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG:
|
||||||
case SERVER_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG:
|
case SERVER_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG:
|
||||||
|
case REMOVE_RPC_TO_DEVICE_ACTOR_MSG:
|
||||||
onToDeviceActorMsg((TenantAwareMsg) msg, true);
|
onToDeviceActorMsg((TenantAwareMsg) msg, true);
|
||||||
break;
|
break;
|
||||||
case EDGE_EVENT_UPDATE_TO_EDGE_SESSION_MSG:
|
case EDGE_EVENT_UPDATE_TO_EDGE_SESSION_MSG:
|
||||||
|
|||||||
@ -28,6 +28,7 @@ import org.thingsboard.server.common.data.id.TenantId;
|
|||||||
import org.thingsboard.server.common.msg.TbActorMsg;
|
import org.thingsboard.server.common.msg.TbActorMsg;
|
||||||
import org.thingsboard.server.common.msg.timeout.DeviceActorServerSideRpcTimeoutMsg;
|
import org.thingsboard.server.common.msg.timeout.DeviceActorServerSideRpcTimeoutMsg;
|
||||||
import org.thingsboard.server.service.rpc.FromDeviceRpcResponseActorMsg;
|
import org.thingsboard.server.service.rpc.FromDeviceRpcResponseActorMsg;
|
||||||
|
import org.thingsboard.server.service.rpc.RemoveRpcActorMsg;
|
||||||
import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg;
|
import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg;
|
||||||
import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper;
|
import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper;
|
||||||
|
|
||||||
@ -84,6 +85,9 @@ public class DeviceActor extends ContextAwareActor {
|
|||||||
case DEVICE_EDGE_UPDATE_TO_DEVICE_ACTOR_MSG:
|
case DEVICE_EDGE_UPDATE_TO_DEVICE_ACTOR_MSG:
|
||||||
processor.processEdgeUpdate((DeviceEdgeUpdateMsg) msg);
|
processor.processEdgeUpdate((DeviceEdgeUpdateMsg) msg);
|
||||||
break;
|
break;
|
||||||
|
case REMOVE_RPC_TO_DEVICE_ACTOR_MSG:
|
||||||
|
processor.processRemoveRpc(ctx, (RemoveRpcActorMsg) msg);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -88,6 +88,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceAct
|
|||||||
import org.thingsboard.server.gen.transport.TransportProtos.TsKvProto;
|
import org.thingsboard.server.gen.transport.TransportProtos.TsKvProto;
|
||||||
import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse;
|
import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse;
|
||||||
import org.thingsboard.server.service.rpc.FromDeviceRpcResponseActorMsg;
|
import org.thingsboard.server.service.rpc.FromDeviceRpcResponseActorMsg;
|
||||||
|
import org.thingsboard.server.service.rpc.RemoveRpcActorMsg;
|
||||||
import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg;
|
import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg;
|
||||||
import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper;
|
import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper;
|
||||||
|
|
||||||
@ -263,6 +264,21 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void processRemoveRpc(TbActorCtx context, RemoveRpcActorMsg msg) {
|
||||||
|
log.debug("[{}] Processing remove rpc command", msg.getRequestId());
|
||||||
|
Integer requestId = null;
|
||||||
|
for (Map.Entry<Integer, ToDeviceRpcRequestMetadata> entry : toDeviceRpcPendingMap.entrySet()) {
|
||||||
|
if (entry.getValue().getMsg().getMsg().getId().equals(msg.getRequestId())) {
|
||||||
|
requestId = entry.getKey();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requestId != null) {
|
||||||
|
toDeviceRpcPendingMap.remove(requestId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void registerPendingRpcRequest(TbActorCtx context, ToDeviceRpcRequestActorMsg msg, boolean sent, ToDeviceRpcRequestMsg rpcRequest, long timeout) {
|
private void registerPendingRpcRequest(TbActorCtx context, ToDeviceRpcRequestActorMsg msg, boolean sent, ToDeviceRpcRequestMsg rpcRequest, long timeout) {
|
||||||
toDeviceRpcPendingMap.put(rpcRequest.getRequestId(), new ToDeviceRpcRequestMetadata(msg, sent));
|
toDeviceRpcPendingMap.put(rpcRequest.getRequestId(), new ToDeviceRpcRequestMetadata(msg, sent));
|
||||||
DeviceActorServerSideRpcTimeoutMsg timeoutMsg = new DeviceActorServerSideRpcTimeoutMsg(rpcRequest.getRequestId(), timeout);
|
DeviceActorServerSideRpcTimeoutMsg timeoutMsg = new DeviceActorServerSideRpcTimeoutMsg(rpcRequest.getRequestId(), timeout);
|
||||||
|
|||||||
@ -165,6 +165,7 @@ public class TenantActor extends RuleChainManagerActor {
|
|||||||
case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG:
|
case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG:
|
||||||
case DEVICE_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG:
|
case DEVICE_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG:
|
||||||
case SERVER_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG:
|
case SERVER_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG:
|
||||||
|
case REMOVE_RPC_TO_DEVICE_ACTOR_MSG:
|
||||||
onToDeviceActorMsg((DeviceAwareMsg) msg, true);
|
onToDeviceActorMsg((DeviceAwareMsg) msg, true);
|
||||||
break;
|
break;
|
||||||
case RULE_CHAIN_TO_RULE_CHAIN_MSG:
|
case RULE_CHAIN_TO_RULE_CHAIN_MSG:
|
||||||
|
|||||||
@ -57,7 +57,7 @@ import java.util.UUID;
|
|||||||
public abstract class AbstractRpcController extends BaseController {
|
public abstract class AbstractRpcController extends BaseController {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private TbCoreDeviceRpcService deviceRpcService;
|
protected TbCoreDeviceRpcService deviceRpcService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private AccessValidator accessValidator;
|
private AccessValidator accessValidator;
|
||||||
|
|||||||
@ -27,6 +27,7 @@ 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;
|
||||||
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
import org.thingsboard.server.common.data.exception.ThingsboardException;
|
||||||
import org.thingsboard.server.common.data.id.DeviceId;
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
import org.thingsboard.server.common.data.id.RpcId;
|
import org.thingsboard.server.common.data.id.RpcId;
|
||||||
@ -35,11 +36,16 @@ 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.common.msg.TbMsg;
|
||||||
|
import org.thingsboard.server.common.msg.TbMsgMetaData;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
|
import org.thingsboard.server.service.rpc.RemoveRpcActorMsg;
|
||||||
import org.thingsboard.server.service.security.permission.Operation;
|
import org.thingsboard.server.service.security.permission.Operation;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static org.thingsboard.server.common.data.DataConstants.RPC_DELETED;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@TbCoreComponent
|
@TbCoreComponent
|
||||||
@RequestMapping(TbUrlConstants.RPC_V2_URL_PREFIX)
|
@RequestMapping(TbUrlConstants.RPC_V2_URL_PREFIX)
|
||||||
@ -100,7 +106,21 @@ public class RpcV2Controller extends AbstractRpcController {
|
|||||||
public void deleteResource(@PathVariable("rpcId") String strRpc) throws ThingsboardException {
|
public void deleteResource(@PathVariable("rpcId") String strRpc) throws ThingsboardException {
|
||||||
checkParameter("RpcId", strRpc);
|
checkParameter("RpcId", strRpc);
|
||||||
try {
|
try {
|
||||||
rpcService.deleteRpc(getTenantId(), new RpcId(UUID.fromString(strRpc)));
|
RpcId rpcId = new RpcId(UUID.fromString(strRpc));
|
||||||
|
Rpc rpc = checkRpcId(rpcId, Operation.DELETE);
|
||||||
|
|
||||||
|
if (rpc != null) {
|
||||||
|
if (rpc.getStatus().equals(RpcStatus.QUEUED)) {
|
||||||
|
RemoveRpcActorMsg removeMsg = new RemoveRpcActorMsg(getTenantId(), rpc.getDeviceId(), rpc.getUuidId());
|
||||||
|
log.trace("[{}] Forwarding msg {} to queue actor!", rpc.getDeviceId(), rpc);
|
||||||
|
tbClusterService.pushMsgToCore(removeMsg, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
rpcService.deleteRpc(getTenantId(), rpcId);
|
||||||
|
|
||||||
|
TbMsg msg = TbMsg.newMsg(RPC_DELETED, rpc.getDeviceId(), TbMsgMetaData.EMPTY, JacksonUtil.toString(rpc));
|
||||||
|
tbClusterService.pushMsgToRuleEngine(getTenantId(), rpc.getDeviceId(), msg, null);
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw handleException(e);
|
throw handleException(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -139,6 +139,12 @@ public class DefaultTbCoreDeviceRpcService implements TbCoreDeviceRpcService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void processRemoveRpc(RemoveRpcActorMsg removeRpcMsg) {
|
||||||
|
log.trace("[{}][{}] Processing remove RPC [{}]", removeRpcMsg.getTenantId(), removeRpcMsg.getRequestId(), removeRpcMsg.getDeviceId());
|
||||||
|
actorContext.tellWithHighPriority(removeRpcMsg);
|
||||||
|
}
|
||||||
|
|
||||||
private void sendRpcResponseToTbRuleEngine(String originServiceId, FromDeviceRpcResponse response) {
|
private void sendRpcResponseToTbRuleEngine(String originServiceId, FromDeviceRpcResponse response) {
|
||||||
if (serviceId.equals(originServiceId)) {
|
if (serviceId.equals(originServiceId)) {
|
||||||
if (tbRuleEngineRpcService.isPresent()) {
|
if (tbRuleEngineRpcService.isPresent()) {
|
||||||
|
|||||||
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* Copyright © 2016-2021 The Thingsboard Authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.thingsboard.server.service.rpc;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.ToString;
|
||||||
|
import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg;
|
||||||
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
|
import org.thingsboard.server.common.msg.MsgType;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@ToString
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class RemoveRpcActorMsg implements ToDeviceActorNotificationMsg {
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final TenantId tenantId;
|
||||||
|
@Getter
|
||||||
|
private final DeviceId deviceId;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final UUID requestId;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MsgType getMsgType() {
|
||||||
|
return MsgType.REMOVE_RPC_TO_DEVICE_ACTOR_MSG;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -56,4 +56,6 @@ public interface TbCoreDeviceRpcService {
|
|||||||
*/
|
*/
|
||||||
void processRpcResponseFromDeviceActor(FromDeviceRpcResponse response);
|
void processRpcResponseFromDeviceActor(FromDeviceRpcResponse response);
|
||||||
|
|
||||||
|
void processRemoveRpc(RemoveRpcActorMsg removeRpcMsg);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -89,6 +89,7 @@ public class DataConstants {
|
|||||||
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";
|
||||||
public static final String RPC_FAILED = "RPC_FAILED";
|
public static final String RPC_FAILED = "RPC_FAILED";
|
||||||
|
public static final String RPC_DELETED = "RPC_DELETED";
|
||||||
|
|
||||||
public static final String DEFAULT_SECRET_KEY = "";
|
public static final String DEFAULT_SECRET_KEY = "";
|
||||||
public static final String SECRET_KEY_FIELD_NAME = "secretKey";
|
public static final String SECRET_KEY_FIELD_NAME = "secretKey";
|
||||||
|
|||||||
@ -92,6 +92,8 @@ public enum MsgType {
|
|||||||
|
|
||||||
DEVICE_ACTOR_SERVER_SIDE_RPC_TIMEOUT_MSG,
|
DEVICE_ACTOR_SERVER_SIDE_RPC_TIMEOUT_MSG,
|
||||||
|
|
||||||
|
REMOVE_RPC_TO_DEVICE_ACTOR_MSG,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Message that is sent from the Device Actor to Rule Engine. Requires acknowledgement
|
* Message that is sent from the Device Actor to Rule Engine. Requires acknowledgement
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -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 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", "RPC Deleted",
|
||||||
"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"},
|
||||||
@ -105,6 +105,8 @@ public class TbMsgTypeSwitchNode implements TbNode {
|
|||||||
relationType = "RPC Timeout";
|
relationType = "RPC Timeout";
|
||||||
} else if (msg.getType().equals(DataConstants.RPC_FAILED)) {
|
} else if (msg.getType().equals(DataConstants.RPC_FAILED)) {
|
||||||
relationType = "RPC Failed";
|
relationType = "RPC Failed";
|
||||||
|
} else if (msg.getType().equals(DataConstants.RPC_DELETED)) {
|
||||||
|
relationType = "RPC Deleted";
|
||||||
} else {
|
} else {
|
||||||
relationType = "Other";
|
relationType = "Other";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -118,7 +118,7 @@ public class TbSendRPCRequestNode implements TbNode {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
ctx.getRpcService().sendRpcRequestToDevice(request, ruleEngineDeviceRpcResponse -> {
|
ctx.getRpcService().sendRpcRequestToDevice(request, ruleEngineDeviceRpcResponse -> {
|
||||||
if (!ruleEngineDeviceRpcResponse.getError().isPresent()) {
|
if (ruleEngineDeviceRpcResponse.getError().isEmpty()) {
|
||||||
TbMsg next = ctx.newMsg(msg.getQueueName(), msg.getType(), msg.getOriginator(), msg.getCustomerId(), msg.getMetaData(), ruleEngineDeviceRpcResponse.getResponse().orElse("{}"));
|
TbMsg next = ctx.newMsg(msg.getQueueName(), msg.getType(), msg.getOriginator(), msg.getCustomerId(), msg.getMetaData(), ruleEngineDeviceRpcResponse.getResponse().orElse("{}"));
|
||||||
ctx.enqueueForTellNext(next, TbRelationTypes.SUCCESS);
|
ctx.enqueueForTellNext(next, TbRelationTypes.SUCCESS);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user