[英]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
帮助甚至提示非常感谢。 没有读者就不能做太多,哈哈。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.