Java 仅针对较大的输入文件失败:FileServiceFactory getBlobKey引发IllegalArgumentException

Java 仅针对较大的输入文件失败:FileServiceFactory getBlobKey引发IllegalArgumentException,java,google-app-engine,blobstore,Java,Google App Engine,Blobstore,我有一个谷歌应用程序引擎应用程序,可以将CSV转换为XML文件。对于小的XML输入,它可以正常工作,但对于较大的XML输入,它拒绝完成文件。在完成一项长时间运行(持续多日)的任务之前,会多次读取XML并写入生成的csv文件。我的问题与此不同,因为我的代码在小输入文件的生产和开发中都可以正常工作。因此,这并不是说我在关闭/完成之前忽略了写入文件。但是,当我试图从一个更大的XML文件中读取时。输入XML文件约为150MB,生成的5个CSV文件集每个文件都要小得多(每个文件可能为10MB)。我为新的c

我有一个谷歌应用程序引擎应用程序,可以将CSV转换为XML文件。对于小的XML输入,它可以正常工作,但对于较大的XML输入,它拒绝完成文件。在完成一项长时间运行(持续多日)的任务之前,会多次读取XML并写入生成的csv文件。我的问题与此不同,因为我的代码在小输入文件的生产和开发中都可以正常工作。因此,这并不是说我在关闭/完成之前忽略了写入文件。但是,当我试图从一个更大的XML文件中读取时。输入XML文件约为150MB,生成的5个CSV文件集每个文件都要小得多(每个文件可能为10MB)。我为新的csv文件保留了文件URL,甚至尝试用一些静态代码关闭它们,但我只是重现了相同的错误,即

java.lang.IllegalArgumentException: creation_handle: String properties must be 500 characters or less.  Instead, use com.google.appengine.api.datastore.Text, which can store strings of any length.
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedSingleValue(DataTypeUtils.java:242)
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:207)
    at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:173)
    at com.google.appengine.api.datastore.Query$FilterPredicate.<init>(Query.java:900)
    at com.google.appengine.api.datastore.Query$FilterOperator.of(Query.java:75)
    at com.google.appengine.api.datastore.Query.addFilter(Query.java:351)
    at com.google.appengine.api.files.FileServiceImpl.getBlobKey(FileServiceImpl.java:329)

在这一点上,我只想完成我的新blob文件,我有URL,但不能。我怎样才能避开这个问题,还有,可能的原因是什么?同样,我的代码适用于小文件(~60KB),但是~150MB的输入文件失败)。感谢您对造成这种情况的原因或解决方法的建议!另外,我的未完成文件在被删除之前会保留多长时间

这个问题是Java MapReduce和文件API中的一个bug,Google最近修复了这个bug。阅读这里的公告:groups.google.com/forum/#!topic/google appengine/NmjYYLuSizo

见第8932期,我们正在研究。感谢塞巴斯蒂安,我感谢你的研究。然而,我认为我的问题不同,更像这个问题:因为我已经成功地在我的代码中使用了较长的blob文件url(我将它们持久化在数据库中,并且它们与我的代码配合得很好)。我认为异常的详细描述在某种程度上是误导性的,因为FileServiceImpl.getBlobKey中的任何故障似乎都会导致datastore.DataTypeUtils.checkSupportedSingleValue中的这条消息,我认为这是对检查代码的一个全面的误判。我的新blob文件名长度是恒定的,然而,对于较大尺寸的BLOB,BLOB未能最终确定。我认为这两个问题都是相关的。事实上,您可以完成您的文件。当你拿到blobKey的时候,问题就出现了。塞巴斯蒂安,说得好;我在定稿时也没有例外。但是,为什么我仍然觉得它没有完全定稿是因为定稿文件没有出现在AppEngine Dashboard Blob Viewer屏幕的定稿文件列表中。
log.info("closing out file 1");
try {
    //locked set to true
    FileWriteChannel fwc1 = fileService.openWriteChannel(csvFile1, true);
    fwc1.closeFinally();
} catch (IOException ioe) {ioe.printStackTrace();}

// You can't get the blob key until the file is finalized
BlobKey blobKeyCSV1 = fileService.getBlobKey(csvFile1);
log.info("csv blob storage key is:" + blobKeyCSV1.getKeyString());
csvUrls[i-1] = blobKeyCSV1.getKeyString();
break;