我在这里回答如何创建没有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应用程序,您可以从配置文件中收集JavaProcess实例。我在这里创建了一个虚拟进程,在出现错误时,我会通过回调函数停止它。
JavaProcess jp = new JavaProcess();
jp.setMainClass("com.hmg.vidapter.run.DriverLauncher");
List<String> mainArgsList = new ArrayList<String>();
mainArgsList.add("ABC1 ARG2 ARG3 ARGN");
jp.setMainArgs(mainArgsList);
List<String> classPath = new ArrayList<String>();
classPath.add("*");
classPath.add("libs\\*");
classPath.add("repo\\*");
jp.setClassPath(classPath);
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());
InputStreamReader isrO = new InputStreamReader(p.getInputStream());
BufferedReader brO = new BufferedReader(isrO);
String callBackO = brO.readLine();
if (callBackO!=null)
{
System.out.println("Application Output: " + callBackO);
}
InputStreamReader isr = new InputStreamReader(p.getErrorStream());
BufferedReader br = new BufferedReader(isr);
String callBack = br.readLine();
if (callBack!=null)
{
System.err.println("Application Error: "+ callBack);
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();
}
-cp
并加载java
。 - jmj