我不确定这里发生了什么。我在一个单独的JVM中启动RMI服务器。在连接到调用远程方法的实例时,该方法在很短的时间后就会卡住。一旦我关闭客户端进程,执行就会继续。
我做错了什么?
class Client
...
//name some kind of name
String name= "HelloService";
//libname points to a runnable jar with the server class as main class
ProcessBuilder jvm= new ProcessBuilder(javaPath, "-jar", libname, "-n", name);
jvm.start();
//Waiting for RMI server to start
try { Thread.sleep(10000); } catch ...
try {
Registry registry= LocateRegistry.getRegistry(1199);
//String as input and String as output
IRemoteService<String, String> service= (IRemoteService<String, String>) registry.lookup(name)
String returnVal= service.execute("SomeValue");
return returnVal;
} catch ...
以下是服务器代码片段。服务器代码打包在一个可运行的jar中,其自身为MainClass。
class Server implements IRemoteService<String, String>
//Is not returning a value, due the fact that I liked to examine the behaviour of
//this method. Doing this by running an infinite loop.
public String execute(String str) {
log.info("Running doExectue from "+getClass().getSimpleName());
int i=0;
while(true) {
i++;
log.info(String.valueOf(i));
}
}
protected static void register(String name, IRemoteService service) {
try {
IRemoteService rsStub= (IRemoteService) UnicastRemoteObject.exportObject(service,0);
Registry registry= LocateRegistry.getRegistry(1199);
try {
registry.bind(name, rsStub);
} catch (ConnectException ce) {
registry= LocateRegistry.createRegistry(1199);
registry.bind(name, rsStub);
}
} catch ...
}
public static void main(String[] args) {
String rmiName= args[1];
IRemoteService<String, String> service= (IRemoteService<String, String>) new Server();
register(rmiName, service);
}
现在,如果我启动客户端,日志文件会在方法&#34;执行&#34;中显示循环的36次运行。比它停止。没有其他客户端获取此对象或调用此方法。
它再次启动,并在我终止客户端进程后立即运行。
对我而言,客户端似乎阻止了远程服务器方法的执行。但我不知道如何克服这种情况。
感谢您提前提供任何帮助,
丹尼
答案 0 :(得分:0)
你描述的是不可能的。在服务器执行远程方法时,客户端无法阻止服务器。找另一种解释。
答案 1 :(得分:0)
感谢您的支持。你是对的,RMI客户端无法阻止服务器。所以我真的很困惑。但我发现了失败。
关于进程正在写入控制台。一旦缓冲区已满,进程就会停止等待收集输出的人。
从日志配置中删除ConsoleAppender后,作业按预期运行。