2

我有一个 REST 服务来上传图片,这是负责在 mongodb 中注册的主要代码:

public String writeFiles(InputStream inputStream, String fileName, String contentType) throws IOException {
    // save the file
    GridFS gridFS = new GridFS(getDB(), Collections.PICTURES_FILES.name());

    GridFSInputFile gridFSInputFile = gridFS.createFile(inputStream, fileName);
    gridFSInputFile.setContentType(contentType);
    gridFSInputFile.setMetaData(new BasicDBObject(ORIGINAL_PICT_COL, true));

    gridFSInputFile.save();
    return gridFSInputFile.getId();
}

然后服务将文件 ID 返回给客户端,以便客户端可以请求并显示上传的图像。

问题在于非常大的图像:有时在上传后立即通过其 ID 请求图像时会出现 HTTP 404 错误(由于服务器端的图像 ID 未知,这是正确的行为)。我想这是因为服务器端的注册时间大于用于取回 ID 并在客户端请求新图像的时间——即“.save()”操作是异步的,对吗?

我的问题:在返回给定代码中的 ID 之前,如何确保保存操作已完成?或者如何获取 .insert 操作的结果对象?

做一个

    gridFSInputFile.validate();

就够了吗?

或者

  getDB().getLastError()

?

我不能轻易地重现这个“错误”,所以我问这个问题,以防有经验的人已经知道如何解决这个问题。在此先感谢您的帮助。

4

1 回答 1

4

如果您使用的是最新版本的 Java 驱动程序(2.10 或更高版本),请尝试创建 MongoClient 实例而不是 Mongo 实例。MongoClient 实例的默认写入关注点是 WriteConcern.ACKNOWLEDGED,因此在写入操作完成之前保存方法不会完成。

否则,在您的 getDB 方法(未显示)中,调用方法 DB.setWriteConcern(WriteConcern.SAFE) 来更改默认写入关注点。

另一种可能性是您正在从副本集的次要成员中读取。默认是从主数据库读取,但是如果您覆盖它,那么您的读取最终将是一致的,在这种情况下您也会看到这个问题。

于 2013-04-18T17:02:37.413 回答