当前位置: 首页 > 知识库问答 >
问题:

等级P4Java java.net。SocketTimeoutException:读取超时

汝楷
2023-03-14

我在我的build.gradle文件中使用P4Java库来同步一个大的zip文件(

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

非常感谢。

提供代码片段:

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.SocketTimeout例外:读取超时”,这就是为什么我最终在第二个捕获块中注释了第二次删除尝试的原因。

共有1个答案

曾宏毅
2023-03-14

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

http://www.perforce.com/perforce/doc.current/user/p4javanotes.txt

以下是一些变体,您可以在有代码的地方尝试,以增加超时时间并实例化服务器:

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

  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);

或类似以下内容:

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

您还可以将超时设置为“0”以使其没有超时。

b]

   props.put(RpcPropertyDefs.RPC_SOCKET_SO_TIMEOUT_NICK, "60000");
   props.put(RpcPropertyDefs.RPC_SOCKET_POOL_SIZE_NICK, "5");

c]

Properties props = System.getProperties();
props.put(RpcPropertyDefs.RPC_SOCKET_SO_TIMEOUT_NICK, "60000");

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

d]如果您有Eclipse用户使用我们的P4Eclipse插件,可以在插件首选项中设置该属性(Team-

"sockSoTimeout":"3000000"

引用

>

  • 类RpcPropertyDefshttp://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

  •  类似资料:
    • 问题内容: 这是一个基于客户端/服务器的简单ping / pong程序。不幸的是,IT无法正常工作并显示以下错误消息: 它停止在CLIENT TASK 30行,实际上,客户端不读取服务器已发送的内容。这里的代码: 服务器 服务器任务 客户 客户任务 问题答案: 问题出在循环内部的使用与从连接另一端处理套接字的方式之间的交互。 仅当从其读取的流结束时才返回-1,这在本质上将意味着套接字已关闭。在关闭

    • 我已经研究这个话题几天了,但是我在网上找到的答案都没有对我有用。 上下文:我有一个Spring Boot Web应用程序,它使用JavaMail API和Spring Boot Starter Mail发送自动电子邮件通知。 它使用谷歌办公套件帐户的GMail SMTP服务器。我最近升级到使用Spring 5.0.6和Spring Boot 2.0.2,电子邮件发送停止工作。 一些线索: 发送电子

    • 我需要知道如何读取(同步或异步不重要)与超时。我想检查一个设备是否与串行端口连接。 为此,我使用,然后等待设备的响应。 如果连接了设备工作正常,但如果没有设备,程序就会停止,这就是我需要超时的原因

    • 问题内容: 我有一个RESTful服务器,该服务器从客户端接收http POST输入以投票表决服务器上的歌曲。我已经使用Apache HTTPClient作为客户端。 当我连续点击投票按钮时,经过几次投票(例如7-8),我得到了例外。当我搜索原因时,我发现这是因为客户端在超时期间没有得到服务器响应。但是问题是,当我使用其他应用程序(例如Chrome REST Console或JMeter)时,可以

    • 我正在尝试使用Spring Data Redis绝地组合连接到AWS ElastiCache Redis。[Redis Cluster enabled,因此它有Cluster Config endpoint,有3个碎片-每个碎片有1个主节点和2个副本节点] 读取超时错误。 AWS Redis服务器版本:5.0.3/群集模式:已启用/SSL:已启用/Auth:已启用(通过密码) 库——Spring数

    • 我最近用java1将我的项目从jboss4迁移到了wildfly 8.2。8.我有一个使用SAAJ的webservice调用,它在命令行中运行良好。但当它从wildfly8内部运行时。2.60秒后超时。我在jboss论坛上读到,读取请求的默认超时时间为60秒。所以我在单机版中更改了配置。xml到 但60秒后仍会超时,并出现以下错误。 我在这里读到,我可以设置超时,但我不必这样做,因为程序运行正常,