committed by
Dmytro Skarzhynets
10 changed files with 331 additions and 22 deletions
@ -0,0 +1,54 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2024 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.rule.engine.telemetry.strategy; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonCreator; |
||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
|
import com.github.benmanes.caffeine.cache.Caffeine; |
||||
|
import com.github.benmanes.caffeine.cache.LoadingCache; |
||||
|
import com.google.common.collect.Sets; |
||||
|
|
||||
|
import java.time.Duration; |
||||
|
import java.util.Set; |
||||
|
import java.util.UUID; |
||||
|
|
||||
|
final class DeduplicatePersistenceStrategy implements PersistenceStrategy { |
||||
|
|
||||
|
private static final int MIN_DEDUPLICATION_INTERVAL_SECS = 1; |
||||
|
|
||||
|
private final long deduplicationIntervalMillis; |
||||
|
private final LoadingCache<Long, Set<UUID>> deduplicationCache; |
||||
|
|
||||
|
@JsonCreator |
||||
|
public DeduplicatePersistenceStrategy(@JsonProperty("deduplicationIntervalSecs") int deduplicationIntervalSecs) { |
||||
|
if (deduplicationIntervalSecs < MIN_DEDUPLICATION_INTERVAL_SECS) { |
||||
|
throw new IllegalArgumentException("Deduplication interval must be at least " + MIN_DEDUPLICATION_INTERVAL_SECS + " second(s), was " + deduplicationIntervalSecs + " second(s)"); |
||||
|
} |
||||
|
deduplicationIntervalMillis = Duration.ofSeconds(deduplicationIntervalSecs).toMillis(); |
||||
|
deduplicationCache = Caffeine.newBuilder() |
||||
|
.softValues() |
||||
|
.expireAfterAccess(Duration.ofSeconds(deduplicationIntervalSecs * 10L)) |
||||
|
.maximumSize(20L) |
||||
|
.build(__ -> Sets.newConcurrentHashSet()); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean shouldPersist(long ts, UUID originatorUuid) { |
||||
|
long intervalNumber = ts / deduplicationIntervalMillis; |
||||
|
return deduplicationCache.get(intervalNumber).add(originatorUuid); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,38 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2024 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.rule.engine.telemetry.strategy; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonCreator; |
||||
|
|
||||
|
import java.util.UUID; |
||||
|
|
||||
|
final class OnEveryMessagePersistenceStrategy implements PersistenceStrategy { |
||||
|
|
||||
|
private static final OnEveryMessagePersistenceStrategy INSTANCE = new OnEveryMessagePersistenceStrategy(); |
||||
|
|
||||
|
private OnEveryMessagePersistenceStrategy() {} |
||||
|
|
||||
|
@JsonCreator |
||||
|
public static OnEveryMessagePersistenceStrategy getInstance() { |
||||
|
return INSTANCE; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean shouldPersist(long ts, UUID originatorUuid) { |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,49 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2024 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.rule.engine.telemetry.strategy; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonSubTypes; |
||||
|
import com.fasterxml.jackson.annotation.JsonTypeInfo; |
||||
|
|
||||
|
import java.util.UUID; |
||||
|
|
||||
|
@JsonTypeInfo( |
||||
|
use = JsonTypeInfo.Id.NAME, |
||||
|
include = JsonTypeInfo.As.PROPERTY, |
||||
|
property = "type" |
||||
|
) |
||||
|
@JsonSubTypes({ |
||||
|
@JsonSubTypes.Type(value = OnEveryMessagePersistenceStrategy.class, name = "ON_EVERY_MESSAGE"), |
||||
|
@JsonSubTypes.Type(value = DeduplicatePersistenceStrategy.class, name = "DEDUPLICATE"), |
||||
|
@JsonSubTypes.Type(value = SkipPersistenceStrategy.class, name = "SKIP") |
||||
|
}) |
||||
|
public sealed interface PersistenceStrategy permits OnEveryMessagePersistenceStrategy, DeduplicatePersistenceStrategy, SkipPersistenceStrategy { |
||||
|
|
||||
|
static PersistenceStrategy onEveryMessage() { |
||||
|
return OnEveryMessagePersistenceStrategy.getInstance(); |
||||
|
} |
||||
|
|
||||
|
static PersistenceStrategy deduplicate(int deduplicationIntervalSecs) { |
||||
|
return new DeduplicatePersistenceStrategy(deduplicationIntervalSecs); |
||||
|
} |
||||
|
|
||||
|
static PersistenceStrategy skip() { |
||||
|
return SkipPersistenceStrategy.getInstance(); |
||||
|
} |
||||
|
|
||||
|
boolean shouldPersist(long ts, UUID originatorUuid); |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,38 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2024 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.rule.engine.telemetry.strategy; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonCreator; |
||||
|
|
||||
|
import java.util.UUID; |
||||
|
|
||||
|
final class SkipPersistenceStrategy implements PersistenceStrategy { |
||||
|
|
||||
|
private static final SkipPersistenceStrategy INSTANCE = new SkipPersistenceStrategy(); |
||||
|
|
||||
|
private SkipPersistenceStrategy() {} |
||||
|
|
||||
|
@JsonCreator |
||||
|
public static SkipPersistenceStrategy getInstance() { |
||||
|
return INSTANCE; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean shouldPersist(long ts, UUID originatorUuid) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
} |
||||
Loading…
Reference in new issue