首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多线程java上获得新通信通道时出现py4J错误

在多线程java上获得新通信通道时出现py4J错误
EN

Stack Overflow用户
提问于 2018-06-15 15:40:42
回答 1查看 4K关注 0票数 1

在多线程Java应用程序中使用py4J时,我遇到了问题。

我用Python实现了一个Java接口

代码语言:javascript
复制
class PythonListener(object):
    def __init__(self):
        pass
    def onNewMessage(self, message):
        print(message)
    class Java:
        implements = ["com.myMessaging.IListener"]

我从Python启动JVM:

代码语言:javascript
复制
java_gateway = JavaGateway.launch_gateway(
                die_on_exit = True)

java_import(java_gateway.jvm, 'com.myMessaging.*')

// Start the multithread messaging server
myMessaging.Server.start()
// Register the listener
myMessaging.Server.registerListener(PythonListener())

myMessaging是一个Java多线程应用程序。当消息到达时,某个线程将接收消息并调用已注册侦听器的onNewMessage方法。

事实上,当一条消息到达时,我会收到这个错误。

代码语言:javascript
复制
py4j.Py4JException: Error while obtaining a new communication channel
    at py4j.CallbackClient.getConnectionLock(CallbackClient.java:257)
    at py4j.CallbackClient.sendCommand(CallbackClient.java:377)
    at py4j.CallbackClient.sendCommand(CallbackClient.java:356)
    at py4j.reflection.PythonProxyHandler.invoke(PythonProxyHandler.java:106)
    at com.sun.proxy.$Proxy79.onNewMessage(Unknown Source)
    at com.myMessaging.Server.notifyMessage(Server.java:235)
       ...Some stuff...
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:218)
    at javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:212)
    at py4j.CallbackConnection.start(CallbackConnection.java:226)
    at py4j.CallbackClient.getConnection(CallbackClient.java:238)
    at py4j.CallbackClient.getConnectionLock(CallbackClient.java:250)
    ... 32 more

我认为这是因为有多个Java线程试图连接到同一端口上的同一个Python实例,但是如何修复它呢?我假设系统是多线程的,就像描述的在Py4J指南中一样。

它是否是接口实现中的一个错误呢?谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-17 12:17:59

当您使用launch_gateway时,负责执行Python回调的回调服务器不会启动。您必须显式地启动它:

代码语言:javascript
复制
java_gateway = JavaGateway.launch_gateway(die_on_exit = True)
java_gateway.start_callback_server()
# Your code here

请注意,这将使用Python回调的默认端口,但您使用的是用于Java调用的临时端口。如果您想同时使用Java和Python的临时端口,请使用在Py4J的高级主题部分中提出的解决方案稍微复杂一些。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50878834

复制
相关文章

相似问题

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