@bitwheeze

Как правильно сохранять данные в microstream (spring)?

Пытаюсь разобраться с 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>
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы