簡體   English   中英

沒有創建Lagom cassandra讀數表

[英]Lagom cassandra readside table not created

我在我的user-impl服務中創建了一個用戶存儲庫Lagom readside,但由於某種原因,在運行sbt lagom:runAll時沒有創建Cassandra用戶表。 我不確定我在這里缺少什么。

我的UserRepository類:

@Singleton
public class UserRepository {

    private final CassandraSession session;

    @Inject
    public UserRepository(CassandraSession session, ReadSide readSide) {
        this.session = session;
        readSide.register(PUserEventProcessor.class);
    }

    private static class PUserEventProcessor extends ReadSideProcessor<PUserEvent> {

        private final CassandraSession session;
        private final CassandraReadSide readSide;

        private PreparedStatement insertUserStatement;
        private PreparedStatement updateUserStatement;

        @Inject
        public PUserEventProcessor(CassandraSession session, CassandraReadSide readSide) {
            this.session = session;
            this.readSide = readSide;
        }

        @Override
        public ReadSideHandler<PUserEvent> buildHandler() {
            return readSide.<PUserEvent>builder("pUserEventOffset")
                    .setGlobalPrepare(this::createTables)
                    .setPrepare(tag -> prepareStatements())
                    .setEventHandler(PUserEvent.PUserCreated.class,
                            e -> insertUser(e.getUser()))
                    .setEventHandler(PUserEvent.PUserUpdated.class,
                            e -> updateUser(e.getUser()))
                    .build();
        }

        private void registerCodec(Session session, InstantCodec codec) {
            session.getCluster().getConfiguration().getCodecRegistry().register(codec);
        }

        @Override
        public PSequence<AggregateEventTag<PUserEvent>> aggregateTags() {
            return PUserEvent.TAG.allTags();
        }

        private CompletionStage<Done> createTables() {
            return doAll(
                    session.executeCreateTable(
                            "CREATE TABLE IF NOT EXISTS users (" +
                                    "userId UUID, " +
                                    "email text, " +
                                    "firstName text, " +
                                    "lastName text, " +
                                    "gender text, " +
                                    "PRIMARY KEY (userId) " +
                                    ")"
                    )
            );
        }

        private CompletionStage<Done> prepareStatements() {
            return doAll(
                    session.underlying()
                            .thenAccept(s -> registerCodec(s, InstantCodec.instance))
                            .thenApply(x -> Done.getInstance()),
                    prepareInsertUserStatement(),
                    prepareUpdateUserStatement());
        }


        // Insert users

        private CompletionStage<Done> prepareInsertUserStatement() {
            return session.
                    prepare("INSERT INTO users(" +
                            "userId, " +
                            "email" +
                            "firstName, " +
                            "lastName, " +
                            "gender, " +
                            "refreshToken" +
                            ") " +
                            "VALUES (?, ?, ?, ?, ?, ?)"
                    )
                    .thenApply(accept(s -> insertUserStatement = s));
        }


        private CompletionStage<List<BoundStatement>> insertUser(DbUser user) {
            return completedStatements(
                    insertUserCreator(user)
            );
        }

        private BoundStatement insertUserCreator(DbUser user) {
            return insertUserStatement.bind(
                    user.getUserId(),
                    user.getEmail(),
                    user.getFirstName(),
                    user.getLastName(),
                    user.getGender(),
                    user.getRefreshToken()
            );
        }

        // Update user by userId

        private CompletionStage<Done> prepareUpdateUserStatement() {
            return session.
                    prepare("UPDATE users " +
                            "SET email = ?, " +
                            "   firstName = ?, " +
                            "   lastName = ?, " +
                            "   gender = ?, " +
                            "   refreshToken = ?" +
                            "WHERE userId = ?;"
                    )
                    .thenApply(accept(s -> updateUserStatement = s));
        }


        private CompletionStage<List<BoundStatement>> updateUser(DbUser user) {
            return completedStatements(
                    updateUserCreator(user)
            );
        }

        private BoundStatement updateUserCreator(DbUser user) {
            return updateUserStatement.bind(
                    user.getEmail(),
                    user.getFirstName(),
                    user.getLastName(),
                    user.getGender(),
                    user.getUserId(),
                    user.getRefreshToken()
            );
        }

    }
} 

添加到UserModule.java:

public class UserModule extends AbstractModule implements ServiceGuiceSupport {

    @Override
    protected void configure() {
        bindService(UserService.class, UserServiceImpl.class);
        bind(UserRepository.class);
    }
}

application.conf:

play.modules.enabled += UserModule
lagom.persistence.ask-timeout = 1000s

user.cassandra.keyspace = user

cassandra-journal.keyspace = ${user.cassandra.keyspace}
cassandra-snapshot-store.keyspace = ${user.cassandra.keyspace}
lagom.persistence.read-side.cassandra.keyspace = ${user.cassandra.keyspace}

在此輸入圖像描述

我的設置是標准的:

在此輸入圖像描述

創建“用戶”表,消息表甚至存儲事件。
有關'用戶'表未顯示的原因或如何排除故障的任何幫助?

這種讓我瘋狂的。
啟動服務時不會拋出任何錯誤,檢查了lagom-auction示例,並且鍵空間在那里可用。 我認為代碼沒有任何區別......

編輯:更多嘗試獲取我的表: - sbt clean /手動刪除嵌入式cassandra - 將lagom-sbt-plugin升級到1.4.8

幫助甚至提示非常感謝。 沒有讀者就不能做太多,哈哈。

您需要將UserRepository綁定為一個渴望的單例 這迫使初始化不是懶惰的。 您會注意到它與prod無關,但它確實適用於開發(這可能是您在開發中看到此問題的原因)。

例如,請參閱在線拍賣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM