ConsoleAppender正在阻止

时间:2014-05-23 10:14:09

标签: java logging blocking

我不确定这里发生了什么。我在一个单独的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次运行。比它停止。没有其他客户端获取此对象或调用此方法。

它再次启动,并在我终止客户端进程后立即运行。

对我而言,客户端似乎阻止了远程服务器方法的执行。但我不知道如何克服这种情况。

感谢您提前提供任何帮助,

丹尼

2 个答案:

答案 0 :(得分:0)

你描述的是不可能的。在服务器执行远程方法时,客户端无法阻止服务器。找另一种解释。

答案 1 :(得分:0)

感谢您的支持。你是对的,RMI客户端无法阻止服务器。所以我真的很困惑。但我发现了失败。

关于进程正在写入控制台。一旦缓冲区已满,进程就会停止等待收集输出的人。

从日志配置中删除ConsoleAppender后,作业按预期运行。