首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gradle P4Java java.net.SocketTimeoutException:读取超时

Gradle P4Java java.net.SocketTimeoutException:读取超时
EN

Stack Overflow用户
提问于 2015-07-14 19:21:50
回答 1查看 2.1K关注 0票数 2

我在build.gradle文件中使用build.gradle库来同步驻留在远程Perforce存储库中的大型zip文件(>200 my ),但在同步过程中或在删除为同步操作创建的临时客户端期间(大多数情况下),我遇到了"java.net.SocketTimeoutException: Read“错误。我指的是使用http://razgulyaev.blogspot.in/2011/08/p4-java-api-how-to-work-with-temporary.html API处理临时客户端的P4Java。

我尝试按照http://answers.perforce.com/articles/KB/8044中的建议,从默认的30秒增加套接字读取超时,并引入睡眠,但这两种方法都没有解决问题。在执行同步或删除操作之前,探查服务器以使用getServerInfo()验证连接将导致成功的连接检查。有人能指点我到哪里去找答案吗?

谢谢。

提供代码片段:

代码语言:javascript
复制
void perforceSync(String srcPath, String destPath, String server) {

    // Generating the file(s) to sync-up
    String[] pathUnderDepot = [
            srcPath + "*"
        ]

    // Increasing timeout from default 30 sec to 60 sec
    Properties defaultProps = new Properties()
    defaultProps.put(PropertyDefs.PROG_NAME_KEY, "CustomBuildApp")
    defaultProps.put(PropertyDefs.PROG_VERSION_KEY, "tv_1.0")
    defaultProps.put(RpcPropertyDefs.RPC_SOCKET_SO_TIMEOUT_NICK, "60000")

    // Instantiating the server
    IOptionsServer p4Server = ServerFactory.getOptionsServer("p4java://" + server, defaultProps)
    p4Server.connect()

    // Authorizing
    p4Server.setUserName("perforceUserName")
    p4Server.login("perforcePassword")

    // Just check if connected successfully
    IServerInfo serverInfo = p4Server.getServerInfo()
    println 'Server info: ' + serverInfo.getServerLicense()

    // Creating new client
    IClient tempClient = new Client()

    // Setting up the name and the root folder
    tempClient.setName("tempClient" + UUID.randomUUID().toString().replace("-", ""))
    tempClient.setRoot(destPath)
    tempClient.setServer(p4Server)

    // Setting the client as the current one for the server
    p4Server.setCurrentClient(tempClient)

    // Creating Client View entry
    ClientViewMapping tempMappingEntry = new ClientViewMapping()

    // Setting up the mapping properties
    tempMappingEntry.setLeft(srcPath + "...")
    tempMappingEntry.setRight("//" + tempClient.getName() + "/...")
    tempMappingEntry.setType(EntryType.INCLUDE)

    // Creating Client view
    ClientView tempClientView = new ClientView()

    // Attaching client view entry to client view
    tempClientView.addEntry(tempMappingEntry)
    tempClient.setClientView(tempClientView)

    // Registering the new client on the server
    println p4Server.createClient(tempClient)

    // Surrounding the underlying block with try as we want some action
    // (namely client removing) to be performed in any way
    try {

        // Forming the FileSpec collection to be synced-up
        List<IFileSpec> fileSpecsSet = FileSpecBuilder.makeFileSpecList(pathUnderDepot)

        // Syncing up the client
        println "Syncing..."
        tempClient.sync(FileSpecBuilder.getValidFileSpecs(fileSpecsSet), true, false, false, false)
    }
    catch (Exception e) {
        println "Sync failed.  Trying again..."
        sleep(60 * 1000)
        tempClient.sync(FileSpecBuilder.getValidFileSpecs(fileSpecsSet), true, false, false, false)
    }
    finally {
        println "Done syncing."

        try {
            p4Server.connect()

            IServerInfo serverInfo2 = p4Server.getServerInfo()
            println '\nServer info: ' + serverInfo2.getServerLicense()

            // Removing the temporary client from the server
            println p4Server.deleteClient(tempClient.getName(), false)
        }
        catch(Exception e) {
            println 'Ignoring exception caught while deleting tempClient!'

            /*sleep(60 * 1000)
            p4Server.connect()

            IServerInfo serverInfo3 = p4Server.getServerInfo()
            println '\nServer info: ' + serverInfo3.getServerLicense()

            sleep(60 * 1000)
            println p4Server.deleteClient(tempClient.getName(), false)*/
        }
    }
}

我在删除tempClient时观察到的一件不寻常的事情是,它实际上删除了客户机,但仍然抛出"java.net.SocketTimeoutException: Read“,这就是为什么我最后在第二个catch块中注释了第二个delete尝试。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-15 21:33:43

您使用的是哪个版本的P4Java?你用最新的P4Java试过这个吗?自2013.2版本转发以来,有一些处理RPC套接字的值得注意的修补程序,如发行说明所示:

代码语言:javascript
复制
http://www.perforce.com/perforce/doc.current/user/p4javanotes.txt

这里有一些变体,您可以在有代码的地方尝试这些变体来增加超时和实例化服务器:

你有没有试过在它自己的论点中传递道具?例如:

代码语言:javascript
复制
  Properties prop = new Properties();
  prop.setProperty(RpcPropertyDefs.RPC_SOCKET_SO_TIMEOUT_NICK, "300000");
  UsageOptions uop = new UsageOptions(prop);
  server = ServerFactory.getOptionsServer(ServerFactory.DEFAULT_PROTOCOL_NAME + "://" + serverPort, prop, uop);

或者类似于以下几点:

代码语言:javascript
复制
  IOptionsServer p4Server = ServerFactory.getOptionsServer("p4java://" + server, defaultProps)

您还可以将超时设置为"0“,以使其不超时。

(B)

代码语言:javascript
复制
   props.put(RpcPropertyDefs.RPC_SOCKET_SO_TIMEOUT_NICK, "60000");
   props.put(RpcPropertyDefs.RPC_SOCKET_POOL_SIZE_NICK, "5");

(C)

代码语言:javascript
复制
Properties props = System.getProperties();
props.put(RpcPropertyDefs.RPC_SOCKET_SO_TIMEOUT_NICK, "60000");

IOptionsServer server =
ServerFactory.getOptionsServer("p4java://perforce:1666", props, null);

d]如果P4Eclipse用户使用我们的P4Java插件,则可以在自定义P4Java属性下的插件首选项(Team->Perforce->Advanced)中设置该属性。

sockSoTimeout:"3000000“

参考文献

  • 类RpcPropertyDefs http://perforce.com/perforce/doc.current/manuals/p4java-javadoc/com/perforce/p4java/impl/mapbased/rpc/RpcPropertyDefs.html
  • P4Eclipse还是P4Java: SocketTimeoutException:读取超时的http://answers.perforce.com/articles/KB/8044
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31415512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档