gpt4 book ai didi

java - 使用对象模型作为参数启动 java 程序

转载 作者:行者123 更新时间:2023-12-01 16:41:48 25 4
gpt4 key购买 nike

服务器监听端口,等待来自客户端的传入请求(客户端实际上是一个 ejb)。这些请求将完整的对象模型作为参数传递(例如,员工列表、每个员工的任务列表等)。

现在服务器必须在同一台机器上的新 JVM 实例中启动另一个 java 程序,并以此对象模型作为参数。

这个其他 java 程序应该是一个独立的 java 程序,但我无法将对象模型作为参数传递给 main 方法 (void main(String[] args))。

那么该怎么办呢?我正在寻找一个“简单”的解决方案,例如最好没有数据库或文件来实现持久性。独立程序实际上是 CPU 密集型的,无法由应用程序服务器托管。

谢谢。

最佳答案

运行应用程序并捕获其输入/输出流,然后通过它传输序列化对象模型。新应用程序应该反序列化来自 System.in 的输入。

概念示例(我只是想确保我的示例有效,抱歉延迟了):

package tests;

import java.io.File;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class AppFirst {
public static void main(String[] args) throws Exception {
ProcessBuilder pb = new ProcessBuilder("java", "-cp",
"./bin", "tests.AppSecond");
pb.directory(new File("."));
pb.redirectErrorStream(true);
Process proc = pb.start();

ObjectOutputStream out = new ObjectOutputStream(
proc.getOutputStream());
ObjectInputStream oin = null;

for (int i = 0; i < 1000; i++) {
out.writeObject("Hello world " + i);
out.flush();
if (oin == null) {
oin = new ObjectInputStream(proc.getInputStream());
}
String s = (String)oin.readObject();
System.out.println(s);
}
out.writeObject("Stop");
out.flush();

proc.waitFor();
}
}
<小时/>
package tests;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class AppSecond {
public static void main(String[] args) throws Exception {
ObjectInputStream oin = null;
ObjectOutputStream out = new ObjectOutputStream(System.out);
while (true) {
if (oin == null) {
oin = new ObjectInputStream(System.in);
}
String s = (String)oin.readObject();
if ("Stop".equals(s)) {
break;
}
out.writeObject("Received: " + s);
out.flush();
}
}
}

编辑:添加了循环版本。请注意,OOS 需要有一个技巧,因为它会立即开始读取传入的流(并阻止您的应用程序,如果您在错误的步骤中执行此操作 - 它应该在第一个流之后被包装)对象被发送到子进程)。

关于java - 使用对象模型作为参数启动 java 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1150556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com