我正在构建一个 quarkus 应用程序,该应用程序将 mongodb 更改流功能与反应式客户端一起使用。
如果我从 Intellij 在本地启动应用程序,一切正常,但是当我构建本机应用程序并尝试保存恢复令牌时,它始终为空。
我使用这个命令来构建本机应用程序,因为我需要在 windows 上本地构建它并在 heroku 上 delpoy:
mvn package -Pnative -Dquarkus.native.container-build=true -Dquarkus.native.builder-image=quay.io/quarkus/ubi-quarkus-native-image:21.0.0-java11
这是我初始化更改流并在集合上启动监视的类和方法
@Inject
ReactiveMongoClient mongoClient;
private void initOrderStream() {
ReactiveMongoDatabase database = mongoClient.getDatabase("database");
ReactiveMongoCollection<Order> dataCollection = database.getCollection("order", Order.class);
ChangeStreamOptions options = new ChangeStreamOptions().fullDocument(FullDocument.UPDATE_LOOKUP);
List<Bson> pipeline = Collections.singletonList(
Aggregates.match(
Filters.and(
Filters.eq("operationType", "insert")
)
)
);
Multi<ChangeStreamDocument<Order>> publisher = dataCollection.watch(pipeline, Order.class, options);
publisher.subscribe().with(eventListener.getOrderListener());
}
这是监听器方法
public Consumer<ChangeStreamDocument<Order>> getOrderListener() {
return message -> {
logger.info("Saving resume token for message " + message);
EventConfig eventConfig = new EventConfig();
eventConfig.setType(eventType);
eventConfig.setResumeToken(message.getResumeToken().getString("_data"));
EventConfig.persistOrUpdate(eventConfig);
Order order = message.getFullDocument();
saveEvent(order);
};
}
问题出在 message.getResumeToken() 方法中,如果我启动应用程序非本机而不是恢复令牌存在并且我可以毫无问题地保存它,但是当我构建它本机并将其放入容器中时,恢复令牌总是无效的。
这对我来说是一个大问题,因为没有恢复令牌,更改流几乎没有用,因为当我重新启动应用程序或出现问题时,我无法恢复丢失的事件。
只有当我在 docker 中运行应用程序时才会导致此错误的任何想法?
谢谢