Я отвечу здесь, как создать многопроцессное приложение без пружины :).С весной вы можете сделать это с помощью 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 из файла конфигурации.Я только что создал фиктивный процесс здесь, и в случае ошибки я прекращаю его обратный вызов процесса.
//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.exe из java.home env.переменная
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();
}