我将在这里回答如何在没有 spring 的情况下创建多进程应用程序:)。
使用 spring 你可以通过 xml 配置来做到这一点。
多线程是另一回事,这是多进程
如下所示创建一个 JavaProces 类。您可以在您的环境中存储此类的对应方 XML/JSON。然后使用Runtime.getRuntime().exec(processRunnerString); 开始您的流程,
你应该先找到java.exe,vm args,然后分别设置-classpath然后mainClass和args。
最后你会得到类似 java JRE\java.exe -classpath
.;*;lib* AClass arg1 - Dprop=val
您可以使用JMX与其他进程通信。
import java.util.Dictionary;
import java.util.List;
public class JavaProcess {
private String mainClass;
private Dictionary<String, String> vmParameters;
private List<String> classPath;
private List<String> mainArgs;
public String getMainClass() {
return mainClass;
}
public void setMainClass(String mainClass) {
this.mainClass = mainClass;
}
public Dictionary<String, String> getVmParameters() {
return vmParameters;
}
public void setVmParameters(Dictionary<String, String> vmParameters) {
this.vmParameters = vmParameters;
}
public List<String> getClassPath() {
return classPath;
}
public void setClassPath(List<String> classPath) {
this.classPath = classPath;
}
public List<String> getMainArgs() {
return mainArgs;
}
public void setMainArgs(List<String> mainArgs) {
this.mainArgs = mainArgs;
}
}
MainRunner 应用程序,您可以从一个
配置文件。我刚刚在这里创建了一个虚拟进程,以防万一
错误我从进程的回调中停止它。
//process
JavaProcess jp = new JavaProcess();
//java class
jp.setMainClass("com.hmg.vidapter.run.DriverLauncher");
//main args[]
List<String> mainArgsList = new ArrayList<String>();
mainArgsList.add("ABC1 ARG2 ARG3 ARGN");
jp.setMainArgs(mainArgsList);
//-classpath
List<String> classPath = new ArrayList<String>();
classPath.add("*");
classPath.add("libs\\*");
classPath.add("repo\\*");
jp.setClassPath(classPath);
//-Dvm args.
Dictionary<String, String> vmArgs = new Hashtable<String, String>();
vmArgs.put("-Dcom.sun.management.jmxremote", "");
vmArgs.put("-Dcom.sun.management.jmxremote.authenticate=false", "");
vmArgs.put("-Dcom.sun.management.jmxremote.port=1453", "");
vmArgs.put("-Dcom.sun.management.jmxremote.ssl=false", "");
jp.setVmParameters(vmArgs);
String params = JSONUtils.convertToJSON(jp);
System.out.println(params);
StringBuilder sb = new StringBuilder("\"" + getJavaExecutablePath()+ "\"");
sb.append(" ");
Enumeration<String> vmaEnum = vmArgs.keys();
while (vmaEnum.hasMoreElements()) {
String key = vmaEnum.nextElement();
sb.append(key + " ");
String val=vmArgs.get(key);
if(val!=null && !val.isEmpty())
{
sb.append(val + " ");
}
}
sb.append(" -classpath ");
List<String> cps = jp.getClassPath();
for (String cp : cps) {
sb.append(cp+";");
}
sb.append(" ");
sb.append(jp.getMainClass());
sb.append(" ");
List<String> mainArgs = jp.getMainArgs();
for (String ma : mainArgs) {
sb.append(ma+" ");
}
System.out.println(sb.toString());
Process p = Runtime.getRuntime().exec(sb.toString());
//write output
InputStreamReader isrO = new InputStreamReader(p.getInputStream());
BufferedReader brO = new BufferedReader(isrO);
String callBackO = brO.readLine();
if (callBackO!=null)
{
System.out.println("Application Output: " + callBackO);
}
//write errput
InputStreamReader isr = new InputStreamReader(p.getErrorStream());
BufferedReader br = new BufferedReader(isr);
String callBack = br.readLine();
if (callBack!=null)
{
System.err.println("Application Error: "+ callBack);
//you can do whatever you want if you don't wanna stop it
p.destroyForcibly();
}
从 java.home 环境中确定 java.exe 的位置。变量
private static String getJavaExecutablePath(){
String javaHome = System.getProperty("java.home");
File f = new File(javaHome);
f = new File(f, "bin");
f = new File(f, "java.exe");
return f.getAbsolutePath();
}