简体   繁体   English

没有创建Lagom cassandra读数表

[英]Lagom cassandra readside table not created

I have created a user repository Lagom readside in my user-impl service, but for some reason the Cassandra users table doesn't get created when running sbt lagom:runAll . 我在我的user-impl服务中创建了一个用户存储库Lagom readside,但由于某种原因,在运行sbt lagom:runAll时没有创建Cassandra用户表。 I'm not sure what I'm missing here. 我不确定我在这里缺少什么。

My UserRepository class: 我的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()
            );
        }

    }
} 

Added to UserModule.java: 添加到UserModule.java:

public class UserModule extends AbstractModule implements ServiceGuiceSupport {

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

application.conf: 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}

在此输入图像描述

My setup is standard: 我的设置是标准的:

在此输入图像描述

The 'user' table is created, the message table even stores events. 创建“用户”表,消息表甚至存储事件。
Any help on why the 'users' table does not appear, or how to troubleshoot? 有关'用户'表未显示的原因或如何排除故障的任何帮助?

This sort of driving me nuts. 这种让我疯狂的。
No errors get thrown when starting the services, checked the lagom-auction example and the keyspaces are available there. 启动服务时不会抛出任何错误,检查了lagom-auction示例,并且键空间在那里可用。 I don't see any difference in the code... 我认为代码没有任何区别......

Edit: More attempts to get my table: - sbt clean / manually deleting the embedded cassandra - Upgrade lagom-sbt-plugin to 1.4.8 编辑:更多尝试获取我的表: - sbt clean /手动删除嵌入式cassandra - 将lagom-sbt-plugin升级到1.4.8

Help or even tips much appreciated. 帮助甚至提示非常感谢。 Cannot do much without a readside, lol. 没有读者就不能做太多,哈哈。

You need to bind the UserRepository as an eager singleton . 您需要将UserRepository绑定为一个渴望的单例 This forces the initialization to not be lazy. 这迫使初始化不是懒惰的。 You'll notice that it doesn't matter in prod, but it does for development (which is likely why you're seeing this problem in dev). 您会注意到它与prod无关,但它确实适用于开发(这可能是您在开发中看到此问题的原因)。

For an example, see the online auction . 例如,请参阅在线拍卖

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM