2011-05-31 75 views
0

我正在寻找一种从命令行访问正在运行的java程序的方法。最好woud是东西,执行以下操作:从shell命令访问正在运行的java程序

启动Java应用程序:

bash$java -jar MyBundle.jar App 

访问应用程序:

bash$test.sh param1 param2 

所以,test.sh电话AppMyBundle.jar莫名其妙并将值param1 & param2

重要提示:我正在寻找非常快的方法。 App保持数据库连接,并且每次我需要访问数据库时启动App的开销非常大。

我需要可在Ubuntu和Debian中使用的解决方案。如果它能在Mac上运行 - 太棒了。

任何帮助表示赞赏!

+0

从'System.in'中读取不是一个选项? – joe776 2011-05-31 14:14:23

+0

那么,你想发送命令到正在运行的进程? – McDowell 2011-05-31 14:15:30

+0

joe776 - 你有什么例子吗?会很棒... – Worker 2011-05-31 14:15:37

回答

1

我认为你需要采取客户端 - 服务器方式。你的应用程序是服务器,它作为后台进程运行并监听某个端口上的连接。而你的客户端向服务器发出请求并获取响应。

在java中实现这个快速简单的方法是将您的应用程序包装在Jetty servlet容器中。例如,您可以将其设置为返回JSON响应,这很容易处理。

+0

也许可能...但是没有JSON和Jetty也许 – Worker 2011-05-31 14:20:25

+0

任何示例如何将jetty整合到项目中?如果它开始作为我正在开发的服务的一部分,会不错? – Worker 2011-05-31 14:25:57

+0

RMI是另一种选择。可以说更容易(我认为,OP不介意紧密耦合)。简介:http://download.oracle.com/javase/6/docs/technotes/guides/rmi/hello/hello-world.html – wds 2011-05-31 14:28:35

1

从shell中打开TCP/IP套接字并使用netcat将非常简单。

Java代码

final ServerSocket serverSocket = new ServerSocket(9050); 
while (true) { 
    final Socket socket = serverSocket.accept(); 
    java.util.logging.Logger.getAnonymousLogger().info("Accepted"); 
    final BufferedReader br = new BufferedReader(new InputStreamReader(
      socket.getInputStream())); 
    final String input = br.readLine(); 
    final BufferedWriter bw = new BufferedWriter(
      new OutputStreamWriter(socket.getOutputStream())); 
     bw.write("You said [" + input + "]"); 
    bw.flush(); 
    socket.close(); 
} 

shell代码

echo 'bla' | nc localhost 9050 

你需要周围的淤泥用螺纹继续开放服务多个请求的插槽中。

+0

>你需要大量的线程 - 这就是为什么我建议Jetty在我的答案,因为这一切都为你处理。 – 2011-06-01 08:53:00

+0

是的,好点。我想这取决于应用程序的复杂性。通过shell命令与http服务器通信的简单方法是什么? – artbristol 2011-06-01 10:03:55

+0

telnet或netcat,但理想情况下,你会写一个简单的客户端,可能更容易重新解析/处理响应 – 2011-06-01 10:16:30