增加FstSerializationRedisSerializer, 更新后请重新发布协议,设备型号以及重新激活全部设备.

This commit is contained in:
zhou-hao 2020-04-14 15:10:50 +08:00
parent ae689c71c6
commit b7e4fda13a
3 changed files with 94 additions and 0 deletions

View File

@ -216,6 +216,13 @@
<version>${hsweb.framework.version}</version>
</dependency>
<dependency>
<groupId>de.ruedigermoeller</groupId>
<artifactId>fst</artifactId>
<version>2.57</version>
</dependency>
</dependencies>

View File

@ -0,0 +1,39 @@
package org.jetlinks.community.standalone.configuration;
import org.jetlinks.community.standalone.configuration.fst.FstSerializationRedisSerializer;
import org.nustaq.serialization.FSTConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ResourceLoader;
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
import org.springframework.data.redis.core.ReactiveRedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class JetLinksRedisConfiguration {
@Bean
public ReactiveRedisTemplate<Object, Object> reactiveRedisTemplate(
ReactiveRedisConnectionFactory reactiveRedisConnectionFactory, ResourceLoader resourceLoader) {
FstSerializationRedisSerializer serializer = new FstSerializationRedisSerializer(() -> {
FSTConfiguration configuration = FSTConfiguration.createDefaultConfiguration()
.setForceSerializable(true);
configuration.setClassLoader(resourceLoader.getClassLoader());
return configuration;
});
@SuppressWarnings("all")
RedisSerializationContext<Object, Object> serializationContext = RedisSerializationContext
.newSerializationContext()
.key((RedisSerializer)new StringRedisSerializer())
.value(serializer)
.hashKey(StringRedisSerializer.UTF_8)
.hashValue(serializer)
.build();
return new ReactiveRedisTemplate<>(reactiveRedisConnectionFactory, serializationContext);
}
}

View File

@ -0,0 +1,48 @@
package org.jetlinks.community.standalone.configuration.fst;
import io.netty.util.concurrent.FastThreadLocal;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import org.nustaq.serialization.FSTConfiguration;
import org.nustaq.serialization.FSTObjectInput;
import org.nustaq.serialization.FSTObjectOutput;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.io.ByteArrayOutputStream;
import java.util.function.Supplier;
@AllArgsConstructor
public class FstSerializationRedisSerializer implements RedisSerializer<Object> {
private final FastThreadLocal<FSTConfiguration> configuration;
public FstSerializationRedisSerializer(Supplier<FSTConfiguration> supplier) {
this(new FastThreadLocal<FSTConfiguration>() {
@Override
protected FSTConfiguration initialValue() {
return supplier.get();
}
});
}
@Override
@SneakyThrows
public byte[] serialize(Object o) throws SerializationException {
ByteArrayOutputStream arr = new ByteArrayOutputStream(1024);
try (FSTObjectOutput output = configuration.get().getObjectOutput(arr)) {
output.writeObject(o);
}
return arr.toByteArray();
}
@Override
@SneakyThrows
public Object deserialize(byte[] bytes) throws SerializationException {
try (FSTObjectInput input = configuration.get().getObjectInput(bytes)) {
return input.readObject();
}
}
}