Commit 43fe84a2840cfb25d6b36ffe9ef73ce9473ef71f
Committed by
GitHub
1 parent
e2dd5b96
created TransportResourceCache (#4232)
* created TransportResourceCache * return resource by sysadmin if not found by tenant in DefaultTransportApiService
Showing
19 changed files
with
227 additions
and
84 deletions
... | ... | @@ -27,8 +27,8 @@ import org.thingsboard.server.common.data.exception.ThingsboardException; |
27 | 27 | import org.thingsboard.server.common.data.id.TenantId; |
28 | 28 | import org.thingsboard.server.common.data.page.PageData; |
29 | 29 | import org.thingsboard.server.common.data.page.PageLink; |
30 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
31 | -import org.thingsboard.server.common.data.transport.resource.ResourceType; | |
30 | +import org.thingsboard.server.common.data.Resource; | |
31 | +import org.thingsboard.server.common.data.ResourceType; | |
32 | 32 | import org.thingsboard.server.dao.resource.ResourceService; |
33 | 33 | import org.thingsboard.server.queue.util.TbCoreComponent; |
34 | 34 | ... | ... |
... | ... | @@ -28,8 +28,8 @@ import org.thingsboard.server.common.data.id.TenantId; |
28 | 28 | import org.thingsboard.server.common.data.oauth2.OAuth2ClientRegistrationTemplate; |
29 | 29 | import org.thingsboard.server.common.data.rule.RuleChain; |
30 | 30 | import org.thingsboard.server.common.data.rule.RuleChainMetaData; |
31 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
32 | -import org.thingsboard.server.common.data.transport.resource.ResourceType; | |
31 | +import org.thingsboard.server.common.data.Resource; | |
32 | +import org.thingsboard.server.common.data.ResourceType; | |
33 | 33 | import org.thingsboard.server.common.data.widget.WidgetType; |
34 | 34 | import org.thingsboard.server.common.data.widget.WidgetsBundle; |
35 | 35 | import org.thingsboard.server.dao.dashboard.DashboardService; | ... | ... |
... | ... | @@ -34,7 +34,7 @@ import org.thingsboard.server.common.data.id.EntityId; |
34 | 34 | import org.thingsboard.server.common.data.id.RuleChainId; |
35 | 35 | import org.thingsboard.server.common.data.id.TenantId; |
36 | 36 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; |
37 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
37 | +import org.thingsboard.server.common.data.Resource; | |
38 | 38 | import org.thingsboard.server.common.msg.TbMsg; |
39 | 39 | import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg; |
40 | 40 | import org.thingsboard.server.common.msg.queue.ServiceType; | ... | ... |
... | ... | @@ -24,7 +24,7 @@ import org.thingsboard.server.common.data.TenantProfile; |
24 | 24 | import org.thingsboard.server.common.data.id.EntityId; |
25 | 25 | import org.thingsboard.server.common.data.id.TenantId; |
26 | 26 | import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; |
27 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
27 | +import org.thingsboard.server.common.data.Resource; | |
28 | 28 | import org.thingsboard.server.common.msg.TbMsg; |
29 | 29 | import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; |
30 | 30 | import org.thingsboard.server.gen.transport.TransportProtos; | ... | ... |
... | ... | @@ -39,12 +39,11 @@ import org.thingsboard.server.common.data.id.CustomerId; |
39 | 39 | import org.thingsboard.server.common.data.id.DeviceId; |
40 | 40 | import org.thingsboard.server.common.data.id.DeviceProfileId; |
41 | 41 | import org.thingsboard.server.common.data.id.TenantId; |
42 | -import org.thingsboard.server.common.data.page.PageLink; | |
43 | 42 | import org.thingsboard.server.common.data.relation.EntityRelation; |
44 | 43 | import org.thingsboard.server.common.data.security.DeviceCredentials; |
45 | 44 | import org.thingsboard.server.common.data.security.DeviceCredentialsType; |
46 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
47 | -import org.thingsboard.server.common.data.transport.resource.ResourceType; | |
45 | +import org.thingsboard.server.common.data.Resource; | |
46 | +import org.thingsboard.server.common.data.ResourceType; | |
48 | 47 | import org.thingsboard.server.common.msg.EncryptionUtil; |
49 | 48 | import org.thingsboard.server.common.msg.TbMsg; |
50 | 49 | import org.thingsboard.server.common.msg.TbMsgDataType; |
... | ... | @@ -65,7 +64,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequ |
65 | 64 | import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg; |
66 | 65 | import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg; |
67 | 66 | import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayResponseMsg; |
68 | -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesRequestMsg; | |
67 | +import org.thingsboard.server.gen.transport.TransportProtos.GetResourceRequestMsg; | |
69 | 68 | import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceRequestMsg; |
70 | 69 | import org.thingsboard.server.gen.transport.TransportProtos.ProvisionResponseStatus; |
71 | 70 | import org.thingsboard.server.gen.transport.TransportProtos.TransportApiRequestMsg; |
... | ... | @@ -82,14 +81,11 @@ import org.thingsboard.server.service.profile.TbDeviceProfileCache; |
82 | 81 | import org.thingsboard.server.service.queue.TbClusterService; |
83 | 82 | import org.thingsboard.server.service.state.DeviceStateService; |
84 | 83 | |
85 | -import java.util.Collections; | |
86 | -import java.util.List; | |
87 | 84 | import java.util.UUID; |
88 | 85 | import java.util.concurrent.ConcurrentHashMap; |
89 | 86 | import java.util.concurrent.ConcurrentMap; |
90 | 87 | import java.util.concurrent.locks.Lock; |
91 | 88 | import java.util.concurrent.locks.ReentrantLock; |
92 | -import java.util.stream.Collectors; | |
93 | 89 | |
94 | 90 | /** |
95 | 91 | * Created by ashvayka on 05.10.18. |
... | ... | @@ -167,8 +163,8 @@ public class DefaultTransportApiService implements TransportApiService { |
167 | 163 | } else if (transportApiRequestMsg.hasProvisionDeviceRequestMsg()) { |
168 | 164 | return Futures.transform(handle(transportApiRequestMsg.getProvisionDeviceRequestMsg()), |
169 | 165 | value -> new TbProtoQueueMsg<>(tbProtoQueueMsg.getKey(), value, tbProtoQueueMsg.getHeaders()), MoreExecutors.directExecutor()); |
170 | - } else if (transportApiRequestMsg.hasResourcesRequestMsg()) { | |
171 | - return Futures.transform(handle(transportApiRequestMsg.getResourcesRequestMsg()), | |
166 | + } else if (transportApiRequestMsg.hasResourceRequestMsg()) { | |
167 | + return Futures.transform(handle(transportApiRequestMsg.getResourceRequestMsg()), | |
172 | 168 | value -> new TbProtoQueueMsg<>(tbProtoQueueMsg.getKey(), value, tbProtoQueueMsg.getHeaders()), MoreExecutors.directExecutor()); |
173 | 169 | } |
174 | 170 | return Futures.transform(getEmptyTransportApiResponseFuture(), |
... | ... | @@ -366,38 +362,22 @@ public class DefaultTransportApiService implements TransportApiService { |
366 | 362 | return Futures.immediateFuture(TransportApiResponseMsg.newBuilder().setEntityProfileResponseMsg(builder).build()); |
367 | 363 | } |
368 | 364 | |
369 | - private ListenableFuture<TransportApiResponseMsg> handle(GetResourcesRequestMsg requestMsg) { | |
365 | + private ListenableFuture<TransportApiResponseMsg> handle(GetResourceRequestMsg requestMsg) { | |
370 | 366 | TenantId tenantId = new TenantId(new UUID(requestMsg.getTenantIdMSB(), requestMsg.getTenantIdLSB())); |
371 | - TransportProtos.GetResourcesResponseMsg.Builder builder = TransportProtos.GetResourcesResponseMsg.newBuilder(); | |
372 | - String resourceType = requestMsg.getResourceType(); | |
367 | + ResourceType resourceType = ResourceType.valueOf(requestMsg.getResourceType()); | |
373 | 368 | String resourceId = requestMsg.getResourceId(); |
369 | + TransportProtos.GetResourceResponseMsg.Builder builder = TransportProtos.GetResourceResponseMsg.newBuilder(); | |
370 | + Resource resource = resourceService.getResource(tenantId, resourceType, resourceId); | |
374 | 371 | |
375 | - List<TransportProtos.ResourceMsg> resources; | |
376 | - | |
377 | - if (resourceType != null && resourceId != null) { | |
378 | - resources = Collections.singletonList(toProto( | |
379 | - resourceService.getResource(tenantId, ResourceType.valueOf(resourceType), resourceId))); | |
380 | - } else { | |
381 | - //TODO: add page link params to request proto if need or remove this | |
382 | - resources = resourceService.findResourcesByTenantId(tenantId, new PageLink(100)) | |
383 | - .getData() | |
384 | - .stream() | |
385 | - .map(this::toProto) | |
386 | - .collect(Collectors.toList()); | |
372 | + if (resource == null && !tenantId.equals(TenantId.SYS_TENANT_ID)) { | |
373 | + resource = resourceService.getResource(TenantId.SYS_TENANT_ID, resourceType, resourceId); | |
387 | 374 | } |
388 | 375 | |
389 | - builder.addAllResources(resources); | |
390 | - return Futures.immediateFuture(TransportApiResponseMsg.newBuilder().setResourcesResponseMsg(builder).build()); | |
391 | - } | |
376 | + if (resource != null) { | |
377 | + builder.setResource(ByteString.copyFrom(dataDecodingEncodingService.encode(resource))); | |
378 | + } | |
392 | 379 | |
393 | - private TransportProtos.ResourceMsg toProto(Resource resource) { | |
394 | - return TransportProtos.ResourceMsg.newBuilder() | |
395 | - .setTenantIdMSB(resource.getTenantId().getId().getMostSignificantBits()) | |
396 | - .setTenantIdLSB(resource.getTenantId().getId().getLeastSignificantBits()) | |
397 | - .setResourceType(resource.getResourceType().name()) | |
398 | - .setResourceId(resource.getResourceId()) | |
399 | - .setValue(resource.getValue()) | |
400 | - .build(); | |
380 | + return Futures.immediateFuture(TransportApiResponseMsg.newBuilder().setResourceResponseMsg(builder).build()); | |
401 | 381 | } |
402 | 382 | |
403 | 383 | private ListenableFuture<TransportApiResponseMsg> getDeviceInfo(DeviceId deviceId, DeviceCredentials credentials) { | ... | ... |
... | ... | @@ -18,8 +18,8 @@ package org.thingsboard.server.dao.resource; |
18 | 18 | import org.thingsboard.server.common.data.id.TenantId; |
19 | 19 | import org.thingsboard.server.common.data.page.PageData; |
20 | 20 | import org.thingsboard.server.common.data.page.PageLink; |
21 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
22 | -import org.thingsboard.server.common.data.transport.resource.ResourceType; | |
21 | +import org.thingsboard.server.common.data.Resource; | |
22 | +import org.thingsboard.server.common.data.ResourceType; | |
23 | 23 | |
24 | 24 | |
25 | 25 | public interface ResourceService { | ... | ... |
common/data/src/main/java/org/thingsboard/server/common/data/Resource.java
renamed from
common/data/src/main/java/org/thingsboard/server/common/data/transport/resource/Resource.java
... | ... | @@ -13,14 +13,18 @@ |
13 | 13 | * See the License for the specific language governing permissions and |
14 | 14 | * limitations under the License. |
15 | 15 | */ |
16 | -package org.thingsboard.server.common.data.transport.resource; | |
16 | +package org.thingsboard.server.common.data; | |
17 | 17 | |
18 | 18 | import lombok.Data; |
19 | -import org.thingsboard.server.common.data.HasTenantId; | |
20 | 19 | import org.thingsboard.server.common.data.id.TenantId; |
21 | 20 | |
21 | +import java.io.Serializable; | |
22 | + | |
22 | 23 | @Data |
23 | -public class Resource implements HasTenantId { | |
24 | +public class Resource implements HasTenantId, Serializable { | |
25 | + | |
26 | + private static final long serialVersionUID = 7379609705527272306L; | |
27 | + | |
24 | 28 | private TenantId tenantId; |
25 | 29 | private ResourceType resourceType; |
26 | 30 | private String resourceId; | ... | ... |
common/data/src/main/java/org/thingsboard/server/common/data/ResourceType.java
renamed from
common/data/src/main/java/org/thingsboard/server/common/data/transport/resource/ResourceType.java
... | ... | @@ -13,7 +13,7 @@ |
13 | 13 | * See the License for the specific language governing permissions and |
14 | 14 | * limitations under the License. |
15 | 15 | */ |
16 | -package org.thingsboard.server.common.data.transport.resource; | |
16 | +package org.thingsboard.server.common.data; | |
17 | 17 | |
18 | 18 | public enum ResourceType { |
19 | 19 | LWM2M_MODEL, JKS, PKCS_12 | ... | ... |
... | ... | @@ -201,23 +201,15 @@ message LwM2MResponseMsg { |
201 | 201 | LwM2MRegistrationResponseMsg registrationMsg = 1; |
202 | 202 | } |
203 | 203 | |
204 | -message ResourceMsg { | |
204 | +message GetResourceRequestMsg { | |
205 | 205 | int64 tenantIdMSB = 1; |
206 | 206 | int64 tenantIdLSB = 2; |
207 | 207 | string resourceType = 3; |
208 | 208 | string resourceId = 4; |
209 | - string value = 5; | |
210 | 209 | } |
211 | 210 | |
212 | -message GetResourcesRequestMsg { | |
213 | - int64 tenantIdMSB = 1; | |
214 | - int64 tenantIdLSB = 2; | |
215 | - string resourceType = 3; | |
216 | - string resourceId = 4; | |
217 | -} | |
218 | - | |
219 | -message GetResourcesResponseMsg { | |
220 | - repeated ResourceMsg resources = 1; | |
211 | +message GetResourceResponseMsg { | |
212 | + bytes resource = 1; | |
221 | 213 | } |
222 | 214 | |
223 | 215 | message ValidateDeviceLwM2MCredentialsRequestMsg { |
... | ... | @@ -558,7 +550,7 @@ message TransportApiRequestMsg { |
558 | 550 | ValidateBasicMqttCredRequestMsg validateBasicMqttCredRequestMsg = 6; |
559 | 551 | ProvisionDeviceRequestMsg provisionDeviceRequestMsg = 7; |
560 | 552 | ValidateDeviceLwM2MCredentialsRequestMsg validateDeviceLwM2MCredentialsRequestMsg = 8; |
561 | - GetResourcesRequestMsg resourcesRequestMsg = 9; | |
553 | + GetResourceRequestMsg resourceRequestMsg = 9; | |
562 | 554 | } |
563 | 555 | |
564 | 556 | /* Response from ThingsBoard Core Service to Transport Service */ |
... | ... | @@ -568,7 +560,7 @@ message TransportApiResponseMsg { |
568 | 560 | GetEntityProfileResponseMsg entityProfileResponseMsg = 3; |
569 | 561 | ProvisionDeviceResponseMsg provisionDeviceResponseMsg = 4; |
570 | 562 | LwM2MResponseMsg lwM2MResponseMsg = 6; |
571 | - GetResourcesResponseMsg resourcesResponseMsg = 7; | |
563 | + GetResourceResponseMsg resourceResponseMsg = 7; | |
572 | 564 | } |
573 | 565 | |
574 | 566 | /* Messages that are handled by ThingsBoard Core Service */ | ... | ... |
1 | +/** | |
2 | + * Copyright © 2016-2021 The Thingsboard Authors | |
3 | + * | |
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | + * you may not use this file except in compliance with the License. | |
6 | + * You may obtain a copy of the License at | |
7 | + * | |
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | + * | |
10 | + * Unless required by applicable law or agreed to in writing, software | |
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | + * See the License for the specific language governing permissions and | |
14 | + * limitations under the License. | |
15 | + */ | |
16 | +package org.thingsboard.server.common.transport; | |
17 | + | |
18 | +import org.thingsboard.server.common.data.id.TenantId; | |
19 | +import org.thingsboard.server.common.data.Resource; | |
20 | +import org.thingsboard.server.common.data.ResourceType; | |
21 | + | |
22 | +public interface TransportResourceCache { | |
23 | + | |
24 | + Resource get(TenantId tenantId, ResourceType resourceType, String resourceId); | |
25 | + | |
26 | + void update(TenantId tenantId, ResourceType resourceType, String resourceI); | |
27 | + | |
28 | + void evict(TenantId tenantId, ResourceType resourceType, String resourceId); | |
29 | +} | ... | ... |
... | ... | @@ -25,8 +25,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestM |
25 | 25 | import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequestMsg; |
26 | 26 | import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg; |
27 | 27 | import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg; |
28 | -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesRequestMsg; | |
29 | -import org.thingsboard.server.gen.transport.TransportProtos.GetResourcesResponseMsg; | |
28 | +import org.thingsboard.server.gen.transport.TransportProtos.GetResourceRequestMsg; | |
29 | +import org.thingsboard.server.gen.transport.TransportProtos.GetResourceResponseMsg; | |
30 | 30 | import org.thingsboard.server.gen.transport.TransportProtos.LwM2MRequestMsg; |
31 | 31 | import org.thingsboard.server.gen.transport.TransportProtos.LwM2MResponseMsg; |
32 | 32 | import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg; |
... | ... | @@ -53,7 +53,7 @@ public interface TransportService { |
53 | 53 | |
54 | 54 | GetEntityProfileResponseMsg getEntityProfile(GetEntityProfileRequestMsg msg); |
55 | 55 | |
56 | - GetResourcesResponseMsg getResources(GetResourcesRequestMsg msg); | |
56 | + GetResourceResponseMsg getResource(GetResourceRequestMsg msg); | |
57 | 57 | |
58 | 58 | void process(DeviceTransportType transportType, ValidateDeviceTokenRequestMsg msg, |
59 | 59 | TransportServiceCallback<ValidateDeviceCredentialsResponse> callback); | ... | ... |
1 | +/** | |
2 | + * Copyright © 2016-2021 The Thingsboard Authors | |
3 | + * | |
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | |
5 | + * you may not use this file except in compliance with the License. | |
6 | + * You may obtain a copy of the License at | |
7 | + * | |
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | |
9 | + * | |
10 | + * Unless required by applicable law or agreed to in writing, software | |
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | + * See the License for the specific language governing permissions and | |
14 | + * limitations under the License. | |
15 | + */ | |
16 | +package org.thingsboard.server.common.transport.service; | |
17 | + | |
18 | +import lombok.Data; | |
19 | +import lombok.extern.slf4j.Slf4j; | |
20 | +import org.springframework.context.annotation.Lazy; | |
21 | +import org.springframework.stereotype.Component; | |
22 | +import org.thingsboard.server.common.data.id.TenantId; | |
23 | +import org.thingsboard.server.common.data.Resource; | |
24 | +import org.thingsboard.server.common.data.ResourceType; | |
25 | +import org.thingsboard.server.common.transport.TransportResourceCache; | |
26 | +import org.thingsboard.server.common.transport.TransportService; | |
27 | +import org.thingsboard.server.common.transport.util.DataDecodingEncodingService; | |
28 | +import org.thingsboard.server.gen.transport.TransportProtos; | |
29 | +import org.thingsboard.server.queue.util.TbTransportComponent; | |
30 | + | |
31 | +import java.util.Optional; | |
32 | +import java.util.Set; | |
33 | +import java.util.UUID; | |
34 | +import java.util.concurrent.ConcurrentHashMap; | |
35 | +import java.util.concurrent.ConcurrentMap; | |
36 | +import java.util.concurrent.locks.Lock; | |
37 | +import java.util.concurrent.locks.ReentrantLock; | |
38 | + | |
39 | +@Slf4j | |
40 | +@Component | |
41 | +@TbTransportComponent | |
42 | +public class DefaultTransportResourceCache implements TransportResourceCache { | |
43 | + | |
44 | + private final Lock resourceFetchLock = new ReentrantLock(); | |
45 | + private final ConcurrentMap<ResourceKey, Resource> resources = new ConcurrentHashMap<>(); | |
46 | + private final Set<ResourceKey> keys = ConcurrentHashMap.newKeySet(); | |
47 | + private final DataDecodingEncodingService dataDecodingEncodingService; | |
48 | + private final TransportService transportService; | |
49 | + | |
50 | + public DefaultTransportResourceCache(DataDecodingEncodingService dataDecodingEncodingService, @Lazy TransportService transportService) { | |
51 | + this.dataDecodingEncodingService = dataDecodingEncodingService; | |
52 | + this.transportService = transportService; | |
53 | + } | |
54 | + | |
55 | + @Override | |
56 | + public Resource get(TenantId tenantId, ResourceType resourceType, String resourceId) { | |
57 | + ResourceKey resourceKey = new ResourceKey(tenantId, resourceType, resourceId); | |
58 | + Resource resource; | |
59 | + | |
60 | + if (keys.contains(resourceKey)) { | |
61 | + resource = resources.get(resourceKey); | |
62 | + if (resource == null) { | |
63 | + resource = resources.get(resourceKey.getSystemKey()); | |
64 | + } | |
65 | + } else { | |
66 | + resourceFetchLock.lock(); | |
67 | + try { | |
68 | + if (keys.contains(resourceKey)) { | |
69 | + resource = resources.get(resourceKey); | |
70 | + if (resource == null) { | |
71 | + resource = resources.get(resourceKey.getSystemKey()); | |
72 | + } | |
73 | + } else { | |
74 | + resource = fetchResource(resourceKey); | |
75 | + keys.add(resourceKey); | |
76 | + } | |
77 | + } finally { | |
78 | + resourceFetchLock.unlock(); | |
79 | + } | |
80 | + } | |
81 | + | |
82 | + return resource; | |
83 | + } | |
84 | + | |
85 | + private Resource fetchResource(ResourceKey resourceKey) { | |
86 | + UUID tenantId = resourceKey.getTenantId().getId(); | |
87 | + TransportProtos.GetResourceRequestMsg.Builder builder = TransportProtos.GetResourceRequestMsg.newBuilder(); | |
88 | + builder | |
89 | + .setTenantIdLSB(tenantId.getLeastSignificantBits()) | |
90 | + .setTenantIdMSB(tenantId.getMostSignificantBits()) | |
91 | + .setResourceType(resourceKey.resourceType.name()) | |
92 | + .setResourceId(resourceKey.resourceId); | |
93 | + TransportProtos.GetResourceResponseMsg responseMsg = transportService.getResource(builder.build()); | |
94 | + | |
95 | + Optional<Resource> optionalResource = dataDecodingEncodingService.decode(responseMsg.getResource().toByteArray()); | |
96 | + if (optionalResource.isPresent()) { | |
97 | + Resource resource = optionalResource.get(); | |
98 | + resources.put(new ResourceKey(resource.getTenantId(), resource.getResourceType(), resource.getResourceId()), resource); | |
99 | + return resource; | |
100 | + } | |
101 | + | |
102 | + return null; | |
103 | + } | |
104 | + | |
105 | + @Override | |
106 | + public void update(TenantId tenantId, ResourceType resourceType, String resourceId) { | |
107 | + ResourceKey resourceKey = new ResourceKey(tenantId, resourceType, resourceId); | |
108 | + if (keys.contains(resourceKey) || resources.containsKey(resourceKey)) { | |
109 | + fetchResource(resourceKey); | |
110 | + } | |
111 | + } | |
112 | + | |
113 | + @Override | |
114 | + public void evict(TenantId tenantId, ResourceType resourceType, String resourceId) { | |
115 | + ResourceKey resourceKey = new ResourceKey(tenantId, resourceType, resourceId); | |
116 | + keys.remove(resourceKey); | |
117 | + resources.remove(resourceKey); | |
118 | + } | |
119 | + | |
120 | + @Data | |
121 | + private static class ResourceKey { | |
122 | + private final TenantId tenantId; | |
123 | + private final ResourceType resourceType; | |
124 | + private final String resourceId; | |
125 | + | |
126 | + public ResourceKey getSystemKey() { | |
127 | + return new ResourceKey(TenantId.SYS_TENANT_ID, resourceType, resourceId); | |
128 | + } | |
129 | + } | |
130 | +} | ... | ... |
... | ... | @@ -37,6 +37,7 @@ import org.thingsboard.server.common.data.id.DeviceProfileId; |
37 | 37 | import org.thingsboard.server.common.data.id.RuleChainId; |
38 | 38 | import org.thingsboard.server.common.data.id.TenantId; |
39 | 39 | import org.thingsboard.server.common.data.id.TenantProfileId; |
40 | +import org.thingsboard.server.common.data.ResourceType; | |
40 | 41 | import org.thingsboard.server.common.msg.TbMsg; |
41 | 42 | import org.thingsboard.server.common.msg.TbMsgMetaData; |
42 | 43 | import org.thingsboard.server.common.msg.queue.ServiceQueue; |
... | ... | @@ -49,6 +50,7 @@ import org.thingsboard.server.common.stats.StatsFactory; |
49 | 50 | import org.thingsboard.server.common.stats.StatsType; |
50 | 51 | import org.thingsboard.server.common.transport.SessionMsgListener; |
51 | 52 | import org.thingsboard.server.common.transport.TransportDeviceProfileCache; |
53 | +import org.thingsboard.server.common.transport.TransportResourceCache; | |
52 | 54 | import org.thingsboard.server.common.transport.TransportService; |
53 | 55 | import org.thingsboard.server.common.transport.TransportServiceCallback; |
54 | 56 | import org.thingsboard.server.common.transport.TransportTenantProfileCache; |
... | ... | @@ -61,7 +63,6 @@ import org.thingsboard.server.common.transport.util.JsonUtils; |
61 | 63 | import org.thingsboard.server.gen.transport.TransportProtos; |
62 | 64 | import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceRequestMsg; |
63 | 65 | import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceResponseMsg; |
64 | -import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto; | |
65 | 66 | import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; |
66 | 67 | import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; |
67 | 68 | import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; |
... | ... | @@ -131,6 +132,7 @@ public class DefaultTransportService implements TransportService { |
131 | 132 | private final TransportRateLimitService rateLimitService; |
132 | 133 | private final DataDecodingEncodingService dataDecodingEncodingService; |
133 | 134 | private final SchedulerComponent scheduler; |
135 | + private final TransportResourceCache transportResourceCache; | |
134 | 136 | |
135 | 137 | protected TbQueueRequestTemplate<TbProtoQueueMsg<TransportApiRequestMsg>, TbProtoQueueMsg<TransportApiResponseMsg>> transportApiRequestTemplate; |
136 | 138 | protected TbQueueProducer<TbProtoQueueMsg<ToRuleEngineMsg>> ruleEngineMsgProducer; |
... | ... | @@ -157,7 +159,7 @@ public class DefaultTransportService implements TransportService { |
157 | 159 | TransportDeviceProfileCache deviceProfileCache, |
158 | 160 | TransportTenantProfileCache tenantProfileCache, |
159 | 161 | TbApiUsageClient apiUsageClient, TransportRateLimitService rateLimitService, |
160 | - DataDecodingEncodingService dataDecodingEncodingService, SchedulerComponent scheduler) { | |
162 | + DataDecodingEncodingService dataDecodingEncodingService, SchedulerComponent scheduler, TransportResourceCache transportResourceCache) { | |
161 | 163 | this.serviceInfoProvider = serviceInfoProvider; |
162 | 164 | this.queueProvider = queueProvider; |
163 | 165 | this.producerProvider = producerProvider; |
... | ... | @@ -169,6 +171,7 @@ public class DefaultTransportService implements TransportService { |
169 | 171 | this.rateLimitService = rateLimitService; |
170 | 172 | this.dataDecodingEncodingService = dataDecodingEncodingService; |
171 | 173 | this.scheduler = scheduler; |
174 | + this.transportResourceCache = transportResourceCache; | |
172 | 175 | } |
173 | 176 | |
174 | 177 | @PostConstruct |
... | ... | @@ -255,12 +258,12 @@ public class DefaultTransportService implements TransportService { |
255 | 258 | } |
256 | 259 | |
257 | 260 | @Override |
258 | - public TransportProtos.GetResourcesResponseMsg getResources(TransportProtos.GetResourcesRequestMsg msg) { | |
261 | + public TransportProtos.GetResourceResponseMsg getResource(TransportProtos.GetResourceRequestMsg msg) { | |
259 | 262 | TbProtoQueueMsg<TransportProtos.TransportApiRequestMsg> protoMsg = |
260 | - new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.TransportApiRequestMsg.newBuilder().setResourcesRequestMsg(msg).build()); | |
263 | + new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.TransportApiRequestMsg.newBuilder().setResourceRequestMsg(msg).build()); | |
261 | 264 | try { |
262 | 265 | TbProtoQueueMsg<TransportApiResponseMsg> response = transportApiRequestTemplate.send(protoMsg).get(); |
263 | - return response.getValue().getResourcesResponseMsg(); | |
266 | + return response.getValue().getResourceResponseMsg(); | |
264 | 267 | } catch (InterruptedException | ExecutionException e) { |
265 | 268 | throw new RuntimeException(e); |
266 | 269 | } |
... | ... | @@ -701,9 +704,17 @@ public class DefaultTransportService implements TransportService { |
701 | 704 | rateLimitService.remove(new DeviceId(entityUuid)); |
702 | 705 | } |
703 | 706 | } else if (toSessionMsg.hasResourceUpdateMsg()) { |
704 | - //TODO: update resource cache | |
707 | + TransportProtos.ResourceUpdateMsg msg = toSessionMsg.getResourceUpdateMsg(); | |
708 | + TenantId tenantId = new TenantId(new UUID(msg.getTenantIdMSB(), msg.getTenantIdLSB())); | |
709 | + ResourceType resourceType = ResourceType.valueOf(msg.getResourceType()); | |
710 | + String resourceId = msg.getResourceId(); | |
711 | + transportResourceCache.update(tenantId, resourceType, resourceId); | |
705 | 712 | } else if (toSessionMsg.hasResourceDeleteMsg()) { |
706 | - //TODO: remove resource from cache | |
713 | + TransportProtos.ResourceDeleteMsg msg = toSessionMsg.getResourceDeleteMsg(); | |
714 | + TenantId tenantId = new TenantId(new UUID(msg.getTenantIdMSB(), msg.getTenantIdLSB())); | |
715 | + ResourceType resourceType = ResourceType.valueOf(msg.getResourceType()); | |
716 | + String resourceId = msg.getResourceId(); | |
717 | + transportResourceCache.evict(tenantId, resourceType, resourceId); | |
707 | 718 | } else { |
708 | 719 | //TODO: should we notify the device actor about missed session? |
709 | 720 | log.debug("[{}] Missing session.", sessionId); | ... | ... |
... | ... | @@ -18,8 +18,6 @@ package org.thingsboard.server.common.transport.util; |
18 | 18 | import lombok.extern.slf4j.Slf4j; |
19 | 19 | import org.nustaq.serialization.FSTConfiguration; |
20 | 20 | import org.springframework.stereotype.Service; |
21 | -import org.thingsboard.server.common.msg.TbActorMsg; | |
22 | -import org.thingsboard.server.common.transport.util.DataDecodingEncodingService; | |
23 | 21 | |
24 | 22 | import java.util.Optional; |
25 | 23 | |
... | ... | @@ -33,8 +31,8 @@ public class ProtoWithFSTService implements DataDecodingEncodingService { |
33 | 31 | public <T> Optional<T> decode(byte[] byteArray) { |
34 | 32 | try { |
35 | 33 | @SuppressWarnings("unchecked") |
36 | - T msg = (T) config.asObject(byteArray); | |
37 | - return Optional.of(msg); | |
34 | + T msg = byteArray != null && byteArray.length > 0 ? (T) config.asObject(byteArray) : null; | |
35 | + return Optional.ofNullable(msg); | |
38 | 36 | } catch (IllegalArgumentException e) { |
39 | 37 | log.error("Error during deserialization message, [{}]", e.getMessage()); |
40 | 38 | return Optional.empty(); | ... | ... |
... | ... | @@ -18,8 +18,7 @@ package org.thingsboard.server.dao.model.sql; |
18 | 18 | import lombok.AllArgsConstructor; |
19 | 19 | import lombok.Data; |
20 | 20 | import lombok.NoArgsConstructor; |
21 | -import org.thingsboard.server.common.data.relation.EntityRelation; | |
22 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
21 | +import org.thingsboard.server.common.data.Resource; | |
23 | 22 | |
24 | 23 | import javax.persistence.Transient; |
25 | 24 | import java.io.Serializable; | ... | ... |
... | ... | @@ -17,8 +17,8 @@ package org.thingsboard.server.dao.model.sql; |
17 | 17 | |
18 | 18 | import lombok.Data; |
19 | 19 | import org.thingsboard.server.common.data.id.TenantId; |
20 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
21 | -import org.thingsboard.server.common.data.transport.resource.ResourceType; | |
20 | +import org.thingsboard.server.common.data.Resource; | |
21 | +import org.thingsboard.server.common.data.ResourceType; | |
22 | 22 | import org.thingsboard.server.dao.model.ToData; |
23 | 23 | |
24 | 24 | import javax.persistence.Column; | ... | ... |
... | ... | @@ -20,8 +20,8 @@ import org.springframework.stereotype.Service; |
20 | 20 | import org.thingsboard.server.common.data.id.TenantId; |
21 | 21 | import org.thingsboard.server.common.data.page.PageData; |
22 | 22 | import org.thingsboard.server.common.data.page.PageLink; |
23 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
24 | -import org.thingsboard.server.common.data.transport.resource.ResourceType; | |
23 | +import org.thingsboard.server.common.data.Resource; | |
24 | +import org.thingsboard.server.common.data.ResourceType; | |
25 | 25 | import org.thingsboard.server.dao.exception.DataValidationException; |
26 | 26 | |
27 | 27 | import static org.thingsboard.server.dao.device.DeviceServiceImpl.INCORRECT_TENANT_ID; | ... | ... |
... | ... | @@ -18,8 +18,8 @@ package org.thingsboard.server.dao.resource; |
18 | 18 | import org.thingsboard.server.common.data.id.TenantId; |
19 | 19 | import org.thingsboard.server.common.data.page.PageData; |
20 | 20 | import org.thingsboard.server.common.data.page.PageLink; |
21 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
22 | -import org.thingsboard.server.common.data.transport.resource.ResourceType; | |
21 | +import org.thingsboard.server.common.data.Resource; | |
22 | +import org.thingsboard.server.common.data.ResourceType; | |
23 | 23 | |
24 | 24 | public interface ResourceDao { |
25 | 25 | ... | ... |
... | ... | @@ -21,8 +21,8 @@ import org.springframework.transaction.annotation.Transactional; |
21 | 21 | import org.thingsboard.server.common.data.id.TenantId; |
22 | 22 | import org.thingsboard.server.common.data.page.PageData; |
23 | 23 | import org.thingsboard.server.common.data.page.PageLink; |
24 | -import org.thingsboard.server.common.data.transport.resource.Resource; | |
25 | -import org.thingsboard.server.common.data.transport.resource.ResourceType; | |
24 | +import org.thingsboard.server.common.data.Resource; | |
25 | +import org.thingsboard.server.common.data.ResourceType; | |
26 | 26 | import org.thingsboard.server.dao.DaoUtil; |
27 | 27 | import org.thingsboard.server.dao.model.sql.ResourceCompositeKey; |
28 | 28 | import org.thingsboard.server.dao.model.sql.ResourceEntity; | ... | ... |