2017-08-08 79 views
0

我的IBM Bluemix帳戶中有發現實例,並且我想將本地文件夾中的文檔添加到此發現實例中的私有集合中。我通過基本調用主本地文件夾中的遞歸函數來完成。程序本身工作正常;然而,添加文檔的幾次迭代後我encounteer以下錯誤:IBM Watson:將文檔遞歸添加到集合中時關閉異常流

Aug 08, 2017 1:55:07 PM okhttp3.internal.platform.Platform log 
INFO: --> POST https://gateway.watsonplatform.net/discovery/api/v1/environments/{environmentId}/collections/{collectionId}/documents?version=2017-08-01 http/1.1 (-1-byte body) 
Aug 08, 2017 1:59:09 PM okhttp3.internal.platform.Platform log 
INFO: <-- HTTP FAILED: java.net.SocketException: Connection reset by peer: socket write error 
Aug 08, 2017 1:59:10 PM okhttp3.internal.platform.Platform log 
INFO: --> POST https://gateway.watsonplatform.net/discovery/api/v1/environments/{environmentId}/collections/{collectionId}/documents?version=2017-08-01 http/1.1 (-1-byte body) 
Aug 08, 2017 1:59:10 PM okhttp3.internal.platform.Platform log 
INFO: <-- HTTP FAILED: java.io.IOException: Stream Closed 
Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Stream Closed 

我怎麼做是我第一次初始化一個發現實例:

Discovery discovery = new Discovery("2017-08-01"); 
discovery.setEndPoint("https://gateway.watsonplatform.net/discovery/api"); 
discovery.setUsernameAndPassword({username}, {password}); 

然後爲每個MIME支持的文件˚F該文件夾中的文件類型MIME類型,我做的:

CreateDocumentRequest.Builder builder = new CreateDocumentRequest.Builder({environmentId}, {collectionId}).file(f, mimetype); 
CreateDocumentResponse createResponse = discovery.createDocument(builder.build()).execute(); 

是否有可能發現實例在循環中會超時?我應該爲每個請求初始化一個新的發現實例嗎?

UPDATE

我敢肯定,發生異常時,由於連接問題。現在我正在嘗試添加文檔,以便在連接丟失時重新初始化Discovery實例。但是,它給出了INFO: <-- HTTP FAILED: java.io.IOException: Stream Closed

boolean successful; 
do { 
    try { 
     CreateDocumentResponse createResponse = this.discovery.createDocument(builder.build()).execute(); 
     System.out.println(createResponse.toString()); 
     successful = true; 
    } catch (Exception e) { 
     System.err.println("Exception: " + e.getMessage()); 
     try { 
      TimeUnit.MILLISECONDS.sleep(500); 
     } catch (InterruptedException e1) { 
      System.err.println("InterruptedException: " + e1.getMessage()); 
     } 
     this.discovery = new Discovery("2017-08-01"); 
     this.discovery.setEndPoint("https://gateway.watsonplatform.net/discovery/api"); 
     this.discovery.setUsernameAndPassword(DataUploader.USERNAME, DataUploader.PASSWORD); 
     successful = false; 
    } 
} while (!successful) 

回答

0

隨着你包含的東西,你的方法似乎是合理的。您不必爲每個添加文檔的請求創建發現類的實例。我認爲這裏的核心問題是處理您提供給CreateDocumentRequest.Builder的文件流。據我所知,它看起來像文件流過早關閉。

下面是一個scala示例,它通過上傳文件夾中的所有文件來實現類似的功能,這些文件的工作沒有問題。

import java.nio.file.{Files, Paths} 
import com.ibm.watson.developer_cloud.discovery.v1.Discovery 
import com.ibm.watson.developer_cloud.discovery.v1.model.document.CreateDocumentRequest 
import com.ibm.watson.developer_cloud.http.HttpMediaType 

object Run { 
    def main(args: Array[String]): Unit = { 
    if(args.length == 0) { 
     println("Usage: <app> <folder-to-upload>") 
     System.exit(0) 
    } 

    val discovery = new Discovery("2017-08-01") 
    discovery.setEndPoint("https://gateway.watsonplatform.net/discovery/api") 
    discovery.setUsernameAndPassword("{username}", "{password}") 

    val environmentId = "<environment-id>" 
    val collectionId = "<collection-id>" 

    Files.list(Paths.get(args(0))).forEach { path => 
     println(s"Processing ${path.getFileName}") 
     val createDocumentBuilder = new CreateDocumentRequest.Builder(environmentId, collectionId) 
     .file(path.toFile, HttpMediaType.APPLICATION_JSON) 
     val response = discovery.createDocument(createDocumentBuilder.build()).execute() 
     println(s"DocumentID ${response.getDocumentId}") 
    } 
    } 
} 

我不能確定你使用的是基於哪一種方法所提供的片斷,但如果有選擇,我會用Builder#file(File inputFile, String mediaType)法在Builder#file(InputStream content, String mediaType)。否則,您必須確保在您確定請求已構建併發送到服務器之前,流尚未關閉。

+0

我已經在使用'Builder文件(File inputFile,String mediaType)'。該錯誤發生在不同的迭代索引中,所以我認爲這個問題可能是由於我的連接帶寬。 –

+0

我無法爲您的更新添加評論,但是您不必重新初始化發現類。如果你看看https://github.com/watson-developer-cloud/java-sdk/blob/develop/discovery/src/main/java/com/ibm/watson/developer_cloud/discovery/v1/Discovery.java# L89,你可以看到在初始化過程中沒有什麼特別的事情發生。它僅存儲在稍後時間點調用端點時可能需要的信息。 對於連接問題,您可能是正確的。當您遇到異常情況時,您可以重試文檔上傳請求。 – User10001