Пытаюсь разобраться с microstream, хочу использовать его для хранения пользовательский сессий. Проблема в том, что после перезапуска программы, все изменения в session объекте пропадают и грузится начальная версия.
Я тут набросал тестовый класс. Spring Boot 3, Microstream 08.00.00-MS-EA2. Просто создал в initializr-ом spring boot приложение и добавил lombok, и в pom прописал зависимости (в самом низу).
В программе если нет сессии для аккаунта acc, то она создается и сохраняется, а при повторном запуске, загружается существующая сессия и увеличивается счетчик numValue. Так вот при последующих запусках, numValue всегда 0, видно, что счетчик увеличивается.
Что я делаю не так? В интернете находится только короткая инструкция на официальном сайте и все. Может надо все таки вызывать shutdown()? Хотя в доках сказано, что storeRoot пишет сразу в storage. Транзакций согласно документации вроде нету. Что ему не хватает?
package test.microstream;
import jakarta.annotation.PostConstruct;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import one.microstream.integrations.spring.boot.types.Storage;
import one.microstream.storage.types.StorageManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import java.util.HashMap;
import java.util.Map;
@SpringBootApplication
@Slf4j
public class MicrostreamApplication {
public static void main(String[] args) {
SpringApplication.run(MicrostreamApplication.class, args);
}
@AllArgsConstructor
@Data
@ToString
public static class DemoSession {
String account;
int numValue;
}
@Data
@ToString
@Storage
public static class DemoStorage {
Map<String, DemoSession> sessions;
@PostConstruct
public void init() {
if(sessions == null) {
sessions = new HashMap<>();
}
}
public void setSession(DemoSession session) {
sessions.put(session.getAccount(), session);
}
public DemoSession getSession(String account) {
return sessions.get(account);
}
}
@Autowired
DemoStorage storage;
@Autowired
StorageManager storageManager;
@Bean
public ApplicationRunner runner() {
return new ApplicationRunner() {
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("root {}", storageManager.root());
log.info("storage {}", storage);
var session = storage.getSession("acc");
if(session == null) {
session = new DemoSession("acc", 0);
log.info("create session {}", session);
storage.setSession(session);
storageManager.storeRoot();
} else {
log.info("loaded session {}", session);
session.setNumValue(session.getNumValue()+1);
log.info("update session {}", session);
storageManager.storeRoot();
}
log.info("after all");
log.info("root {}", storageManager.root());
log.info("storage {}", storage);
}
};
}
}
Вот что она выдает после каждого запуска
2023-02-14T21:35:32.947+01:00 INFO 163817 --- [ main] one.microstream.util.logging.Logging : MicroStream Version 08.00.00-MS-EA2
2023-02-14T21:35:33.089+01:00 INFO 163817 --- [ main] .s.e.t.EmbeddedStorageFoundation$Default : Creating embedded storage manager
2023-02-14T21:35:33.206+01:00 INFO 163817 --- [ main] .t.PersistenceTypeHandlerManager$Default : Initializing type handler manager
2023-02-14T21:35:33.266+01:00 INFO 163817 --- [ main] o.m.s.e.t.EmbeddedStorageManager$Default : Starting embedded storage manager
2023-02-14T21:35:33.268+01:00 INFO 163817 --- [ main] o.m.storage.types.StorageSystem$Default : Starting storage system
2023-02-14T21:35:33.269+01:00 INFO 163817 --- [ main] .m.s.t.StorageStructureValidator$Default : Storage structure validated successfully.
2023-02-14T21:35:33.295+01:00 INFO 163817 --- [ main] .t.PersistenceTypeHandlerManager$Default : Initializing type handler manager
2023-02-14T21:35:33.308+01:00 INFO 163817 --- [ main] o.m.s.e.t.EmbeddedStorageManager$Default : Embedded storage manager initialized
2023-02-14T21:35:33.366+01:00 INFO 163817 --- [ main] t.microstream.MicrostreamApplication : Started MicrostreamApplication in 0.963 seconds (process running for 1.278)
2023-02-14T21:35:33.367+01:00 INFO 163817 --- [ main] t.microstream.MicrostreamApplication : root MicrostreamApplication.DemoStorage(sessions={acc=MicrostreamApplication.DemoSession(account=acc, numValue=0)})
2023-02-14T21:35:33.367+01:00 INFO 163817 --- [ main] t.microstream.MicrostreamApplication : storage MicrostreamApplication.DemoStorage(sessions={acc=MicrostreamApplication.DemoSession(account=acc, numValue=0)})
2023-02-14T21:35:33.367+01:00 INFO 163817 --- [ main] t.microstream.MicrostreamApplication : loaded session MicrostreamApplication.DemoSession(account=acc, numValue=0)
2023-02-14T21:35:33.367+01:00 INFO 163817 --- [ main] t.microstream.MicrostreamApplication : update session MicrostreamApplication.DemoSession(account=acc, numValue=1)
2023-02-14T21:35:33.367+01:00 INFO 163817 --- [ main] .t.PersistenceTypeHandlerManager$Default : Initializing type handler manager
2023-02-14T21:35:33.372+01:00 INFO 163817 --- [ main] t.microstream.MicrostreamApplication : after all
2023-02-14T21:35:33.372+01:00 INFO 163817 --- [ main] t.microstream.MicrostreamApplication : root MicrostreamApplication.DemoStorage(sessions={acc=MicrostreamApplication.DemoSession(account=acc, numValue=1)})
2023-02-14T21:35:33.372+01:00 INFO 163817 --- [ main] t.microstream.MicrostreamApplication : storage MicrostreamApplication.DemoStorage(sessions={acc=MicrostreamApplication.DemoSession(account=acc, numValue=1)})
2023-02-14T21:45:18.225+01:00 INFO 163817 --- [ionShutdownHook] o.m.storage.types.StorageSystem$Default : Stopping storage system
2023-02-14T21:45:18.227+01:00 INFO 163817 --- [ionShutdownHook] o.m.storage.types.StorageSystem$Default : Storage system stopped
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>microstream-storage-embedded</artifactId>
<version>08.00.00-MS-EA2</version>
</dependency>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>microstream-integrations-spring-boot3</artifactId>
<version>08.00.00-MS-EA2</version>
</dependency>
<dependency>
<groupId>one.microstream</groupId>
<artifactId>microstream-storage-embedded-configuration</artifactId>
<version>08.00.00-MS-EA2</version>
</dependency>
</dependencies>