Sequential RPC processing support
This commit is contained in:
parent
e5b988a297
commit
c29a00656a
@ -400,9 +400,9 @@ public class ActorSystemContext {
|
|||||||
@Getter
|
@Getter
|
||||||
private String debugPerTenantLimitsConfiguration;
|
private String debugPerTenantLimitsConfiguration;
|
||||||
|
|
||||||
@Value("${actors.rpc.sequence.enabled:false}")
|
@Value("${actors.rpc.sequential:false}")
|
||||||
@Getter
|
@Getter
|
||||||
private boolean rpcSequenceEnabled;
|
private boolean rpcSequential;
|
||||||
|
|
||||||
@Value("${actors.rpc.max_retries:5}")
|
@Value("${actors.rpc.max_retries:5}")
|
||||||
@Getter
|
@Getter
|
||||||
|
|||||||
@ -122,7 +122,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
private final Map<UUID, SessionInfo> attributeSubscriptions;
|
private final Map<UUID, SessionInfo> attributeSubscriptions;
|
||||||
private final Map<UUID, SessionInfo> rpcSubscriptions;
|
private final Map<UUID, SessionInfo> rpcSubscriptions;
|
||||||
private final Map<Integer, ToDeviceRpcRequestMetadata> toDeviceRpcPendingMap;
|
private final Map<Integer, ToDeviceRpcRequestMetadata> toDeviceRpcPendingMap;
|
||||||
private final boolean rpcSequenceEnabled;
|
private final boolean rpcSequential;
|
||||||
|
|
||||||
private int rpcSeq = 0;
|
private int rpcSeq = 0;
|
||||||
private String deviceName;
|
private String deviceName;
|
||||||
@ -134,7 +134,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
super(systemContext);
|
super(systemContext);
|
||||||
this.tenantId = tenantId;
|
this.tenantId = tenantId;
|
||||||
this.deviceId = deviceId;
|
this.deviceId = deviceId;
|
||||||
this.rpcSequenceEnabled = systemContext.isRpcSequenceEnabled();
|
this.rpcSequential = systemContext.isRpcSequential();
|
||||||
this.attributeSubscriptions = new HashMap<>();
|
this.attributeSubscriptions = new HashMap<>();
|
||||||
this.rpcSubscriptions = new HashMap<>();
|
this.rpcSubscriptions = new HashMap<>();
|
||||||
this.toDeviceRpcPendingMap = new LinkedHashMap<>();
|
this.toDeviceRpcPendingMap = new LinkedHashMap<>();
|
||||||
@ -233,7 +233,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSendNewRpcAvailable() {
|
private boolean isSendNewRpcAvailable() {
|
||||||
return !rpcSequenceEnabled || toDeviceRpcPendingMap.values().stream().filter(md -> !md.isDelivered()).findAny().isEmpty();
|
return !rpcSequential || toDeviceRpcPendingMap.values().stream().filter(md -> !md.isDelivered()).findAny().isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Rpc createRpc(ToDeviceRpcRequest request, RpcStatus status) {
|
private Rpc createRpc(ToDeviceRpcRequest request, RpcStatus status) {
|
||||||
@ -332,7 +332,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
}
|
}
|
||||||
Set<Integer> sentOneWayIds = new HashSet<>();
|
Set<Integer> sentOneWayIds = new HashSet<>();
|
||||||
|
|
||||||
if (rpcSequenceEnabled) {
|
if (rpcSequential) {
|
||||||
getFirstRpc().ifPresent(processPendingRpc(context, sessionId, nodeId, sentOneWayIds));
|
getFirstRpc().ifPresent(processPendingRpc(context, sessionId, nodeId, sentOneWayIds));
|
||||||
} else if (sessionType == SessionType.ASYNC) {
|
} else if (sessionType == SessionType.ASYNC) {
|
||||||
toDeviceRpcPendingMap.entrySet().forEach(processPendingRpc(context, sessionId, nodeId, sentOneWayIds));
|
toDeviceRpcPendingMap.entrySet().forEach(processPendingRpc(context, sessionId, nodeId, sentOneWayIds));
|
||||||
@ -348,7 +348,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void sendNextPendingRequest(TbActorCtx context) {
|
private void sendNextPendingRequest(TbActorCtx context) {
|
||||||
if (rpcSequenceEnabled) {
|
if (rpcSequential) {
|
||||||
rpcSubscriptions.forEach((id, s) -> sendPendingRequests(context, id, s.getNodeId()));
|
rpcSubscriptions.forEach((id, s) -> sendPendingRequests(context, id, s.getNodeId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -357,7 +357,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
return entry -> {
|
return entry -> {
|
||||||
ToDeviceRpcRequest request = entry.getValue().getMsg().getMsg();
|
ToDeviceRpcRequest request = entry.getValue().getMsg().getMsg();
|
||||||
ToDeviceRpcRequestBody body = request.getBody();
|
ToDeviceRpcRequestBody body = request.getBody();
|
||||||
if (request.isOneway() && !rpcSequenceEnabled) {
|
if (request.isOneway() && !rpcSequential) {
|
||||||
sentOneWayIds.add(entry.getKey());
|
sentOneWayIds.add(entry.getKey());
|
||||||
systemContext.getTbCoreDeviceRpcService().processRpcResponseFromDeviceActor(new FromDeviceRpcResponse(request.getId(), null, null));
|
systemContext.getTbCoreDeviceRpcService().processRpcResponseFromDeviceActor(new FromDeviceRpcResponse(request.getId(), null, null));
|
||||||
}
|
}
|
||||||
@ -599,7 +599,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
|
|||||||
if (status.equals(RpcStatus.DELIVERED)) {
|
if (status.equals(RpcStatus.DELIVERED)) {
|
||||||
if (md.getMsg().getMsg().isOneway()) {
|
if (md.getMsg().getMsg().isOneway()) {
|
||||||
toDeviceRpcPendingMap.remove(responseMsg.getRequestId());
|
toDeviceRpcPendingMap.remove(responseMsg.getRequestId());
|
||||||
if (rpcSequenceEnabled) {
|
if (rpcSequential) {
|
||||||
systemContext.getTbCoreDeviceRpcService().processRpcResponseFromDeviceActor(new FromDeviceRpcResponse(rpcId, null, null));
|
systemContext.getTbCoreDeviceRpcService().processRpcResponseFromDeviceActor(new FromDeviceRpcResponse(rpcId, null, null));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -328,8 +328,7 @@ actors:
|
|||||||
duration: "${ACTORS_RULE_TRANSACTION_DURATION:60000}"
|
duration: "${ACTORS_RULE_TRANSACTION_DURATION:60000}"
|
||||||
rpc:
|
rpc:
|
||||||
max_retries: "${ACTORS_RPC_MAX_RETRIES:5}"
|
max_retries: "${ACTORS_RPC_MAX_RETRIES:5}"
|
||||||
sequence:
|
sequential: "${ACTORS_RPC_SEQUENTIAL:false}"
|
||||||
enabled: "${ACTORS_RPC_SEQUENCE_ENABLED:false}"
|
|
||||||
statistics:
|
statistics:
|
||||||
# Enable/disable actor statistics
|
# Enable/disable actor statistics
|
||||||
enabled: "${ACTORS_STATISTICS_ENABLED:true}"
|
enabled: "${ACTORS_STATISTICS_ENABLED:true}"
|
||||||
|
|||||||
@ -6,4 +6,5 @@ edges.storage.sleep_between_batches=500
|
|||||||
transport.lwm2m.server.security.key_alias=server
|
transport.lwm2m.server.security.key_alias=server
|
||||||
transport.lwm2m.server.security.key_password=server
|
transport.lwm2m.server.security.key_password=server
|
||||||
transport.lwm2m.bootstrap.security.key_alias=server
|
transport.lwm2m.bootstrap.security.key_alias=server
|
||||||
transport.lwm2m.bootstrap.security.key_password=server
|
transport.lwm2m.bootstrap.security.key_password=server
|
||||||
|
actors.rpc.sequential=true
|
||||||
Loading…
x
Reference in New Issue
Block a user