def testGoodRetryFromJava(self): """Should retry from Java to Python. Similar use case as testGoodRetry, but from Java: Python calls Java, which calls Python back. Then Java waits for a while and calls Python again. Because Python Server has been waiting for too much time, the receiving socket has closed so the call from Java to Python will fail on send, and Java must retry by creating a new connection (ClientServerConnection). Because ClientServer reuses the same connection in each thread, we must launch a new thread on the Java side to correctly test the Python Server. """ client_server = ClientServer(JavaParameters(), PythonParameters(read_timeout=0.250)) with clientserver_example_app_process(): try: operator = WaitOperator(0) opExample = client_server.jvm.py4j.examples.OperatorExample() opExample.launchOperator(operator, 500) sleep(0.1) str_connection = str( list(client_server._callback_server.connections)[0]) sleep(0.75) str_connection2 = str( list(client_server._callback_server.connections)[0]) self.assertNotEqual(str_connection, str_connection2) except Py4JJavaError: self.fail("Callbackserver did not retry.") finally: client_server.shutdown()
def testBadRetryFromJava(self): """Should not retry from Java to Python. Similar use case as testBadRetry, but from Java: Java calls a long Python operation. If there is a bug, Java will call Python, then read will fail, then it will call Python again. If there is no bug, Java will call Python, read will fail, then Java will raise an Exception that will be received as a Py4JError on the Python side. """ client_server = ClientServer(JavaParameters(), PythonParameters()) with clientserver_example_app_process(False, True): try: operator = WaitOperator(0.5) opExample = client_server.jvm.py4j.examples.OperatorExample() opExample.randomBinaryOperator(operator) self.fail( "Should never retry once the first command went through." " number of calls made: {0}".format(operator.callCount)) except Py4JError: # XXX This occurs when WaitOperator tries to send a response to # the Java side (this is slightly different then the # GatewayServer equivalent where the Py4JError occurs on the # clientserver, but the Java side can still send back an # exception to the JavaGateway). self.assertTrue(True) finally: client_server.shutdown()