2015-07-14 2 views
2

J'utilise la bibliothèque P4Java dans mon fichier build.gradle pour synchroniser un gros fichier zip (> 200MB) résidant dans un dépôt Perforce distant, mais je rencontre un "java.net" Erreur ".socketTimeoutException: lecture expirée" au cours du processus de synchronisation ou (principalement) lors de la suppression du client temporaire créé pour l'opération de synchronisation. Je fais référence http://razgulyaev.blogspot.in/2011/08/p4-java-api-how-to-work-with-temporary.html pour travailler avec des clients temporaires en utilisant l'API P4Java.Gradle P4Java java.net.SocketTimeoutException: J'ai dépassé le délai

J'ai essayé d'augmenter le délai d'attente de lecture du socket par défaut de 30 secondes comme suggéré dans http://answers.perforce.com/articles/KB/8044 et également en introduisant le sommeil, mais les deux approches n'ont pas résolu le problème. Si vous tentez de vérifier la connexion à l'aide de getServerInfo() juste avant d'effectuer des opérations de synchronisation ou de suppression, le serveur vérifie la connexion. Quelqu'un peut-il me dire où je devrais chercher des réponses?

Merci.

Fournir l'extrait de code:

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)*/ 
     } 
    } 
} 

Une chose inhabituelle que j'ai observé pendant la suppression tempClient était-il supprimait effectivement le client, mais en jetant encore « java.net.SocketTimeoutException: Read timed out » qui est pourquoi je a fini par commenter la deuxième tentative d'effacement dans le second bloc catch.

+0

Pouvez-vous montrer du code? – JimiLoe

+0

@JimiLoe Pouvez-vous s'il vous plaît jeter un oeil sur le code? –

Répondre

2

Quelle version de P4Java utilisez-vous? Avez-vous essayé cela avec le plus récent P4Java? Il y a des corrections notables traiter les sockets RPC depuis la version 2013,2 avant que peut être vu dans les notes de version:

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

Voici quelques variations que vous pouvez essayer où vous avez votre code pour augmenter délai et instancier le serveur: A] Avez-vous essayé de transmettre des arguments dans son propre argument? Par exemple:

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

Ou quelque chose comme ce qui suit:

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

Vous pouvez également définir le délai d'attente à « 0 » pour lui donner aucun délai.

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] Si vous avez des utilisateurs Eclipse en utilisant notre plugin P4Eclipse, la propriété peut être définie dans les préférences du plugin (Team-> Perforce- > Avancé) sous les propriétés personnalisées P4Java.

"sockSoTimeout": "3000000"

RÉFÉRENCES

+1

Merci pour la réponse élaborée. Cela a résolu mon problème. J'utilisais la version P4Java 2014.1.965322. Le changement à la dernière version disponible 2015.1.1067177 seul n'a pas été utile. J'ai aussi utilisé l'option [a] de votre réponse, c'est-à-dire passé les accessoires dans son propre argument. En outre, dans le cas où la synchronisation échoue dans le bloc try, l'ajout de sleep (60 * 1000) et la synchronisation à nouveau fonctionnent. Je ne sais pas si le sommeil() est requis ici. –