Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于maven的项目中的循环依赖/依赖倒置(令人尴尬,但相当容易)_Java_Json_Maven_Dependency Injection_Circular Dependency - Fatal编程技术网

Java 基于maven的项目中的循环依赖/依赖倒置(令人尴尬,但相当容易)

Java 基于maven的项目中的循环依赖/依赖倒置(令人尴尬,但相当容易),java,json,maven,dependency-injection,circular-dependency,Java,Json,Maven,Dependency Injection,Circular Dependency,我正在从事一个maven管理的Java项目。目标是从JSON文件中读取任务并对其进行处理。我们还试图保持整个项目模块化。因此,我们有一个核心项目和许多模块。 基本思想是,核心定义任务,如何检索它们。。。模块正在执行该任务 我读过很多关于循环依赖或依赖反转的书,以及如何在理论上避免它们。然而,我无法将这些例子和方法付诸实践,我不太确定这是否是我的问题。因此我希望有人能给我指出正确的方向。以下是我的问题: 我从JSON文件中读取任务,并使用GSON将它们转换为数组 [ { "name":

我正在从事一个maven管理的Java项目。目标是从JSON文件中读取任务并对其进行处理。我们还试图保持整个项目模块化。因此,我们有一个核心项目和许多模块。 基本思想是,核心定义任务,如何检索它们。。。模块正在执行该任务

我读过很多关于循环依赖或依赖反转的书,以及如何在理论上避免它们。然而,我无法将这些例子和方法付诸实践,我不太确定这是否是我的问题。因此我希望有人能给我指出正确的方向。以下是我的问题:

我从JSON文件中读取任务,并使用GSON将它们转换为数组

[
  {
    "name": "Do_SOMETHING_1",
    "arguments": "myArgs, myArgs_devided_by_comma",
    "network": [
      {
        "start_ip": "192.168.1.1",
        "end_ip": "192.168.1.255"
      }
    ]
  },
  {
    "name": "Do_SOMETHING_2",
    "arguments": "myArgs, myArgs_devided_by_comma"
  }
]
我的Task.class如下所示:

public class Task {
    private String name;
    private String arguments;
    private List<network> network;

    public String getType() {
        return command.toLowerCase();
    }

    public String[] getArgs() {
        String[] args = arguments.split("\\,");
        return args;
    }

    @Override
    public String toString() {
        return name + " - " + arguments;
    }
}


class network {
    private String start_ip;
    private String end_ip;

    @Override
    public String toString() {
        return start_ip + " - " + end_ip;
    }
}
public class Job {
    public static Task[] task;
    ExecutorService executor = Executors.newFixedThreadPool(25);

    public void run() {
        try {
            fetch_jobs();
        } catch (IOException e) {
        //Handle e
        }
        process_jobs();
        executor.shutdown();
        while (!executor.isTerminated()) {
        //Wait until exit
        }

    }

    public void fetch_jobs()  throws UnsupportedEncodingException, IOException  {
        Reader reader = new InputStreamReader(Job.class.getResourceAsStream("/tasks.json"), "UTF-8");
        Gson gson = new GsonBuilder().create();
        task = gson.fromJson(reader, Task[].class);
    }   

    private void process_jobs() {
        for (int i = 0; i < task.length; i++) {
            switch(task[i].getType()) {
            case "Do_SOMETHING_1":
                Runnable worker1 = new Do_SOMETHING_1(task[i]);
                executor.execute(worker1);
                break;
            case "Do_SOMETHING_2":
                Runnable worker2 = new Do_SOMETHING_2(task[i]);
                executor.execute(worker2);
                break;
            default: 
            //Do Nothing
            }}      }
}
为了处理这些任务,我编写了一个Jobs类,它检查作业,构建任务数组,然后根据JSON文件指定的内容尝试实例化一个新类来处理任务。看起来是这样的:

public class Task {
    private String name;
    private String arguments;
    private List<network> network;

    public String getType() {
        return command.toLowerCase();
    }

    public String[] getArgs() {
        String[] args = arguments.split("\\,");
        return args;
    }

    @Override
    public String toString() {
        return name + " - " + arguments;
    }
}


class network {
    private String start_ip;
    private String end_ip;

    @Override
    public String toString() {
        return start_ip + " - " + end_ip;
    }
}
public class Job {
    public static Task[] task;
    ExecutorService executor = Executors.newFixedThreadPool(25);

    public void run() {
        try {
            fetch_jobs();
        } catch (IOException e) {
        //Handle e
        }
        process_jobs();
        executor.shutdown();
        while (!executor.isTerminated()) {
        //Wait until exit
        }

    }

    public void fetch_jobs()  throws UnsupportedEncodingException, IOException  {
        Reader reader = new InputStreamReader(Job.class.getResourceAsStream("/tasks.json"), "UTF-8");
        Gson gson = new GsonBuilder().create();
        task = gson.fromJson(reader, Task[].class);
    }   

    private void process_jobs() {
        for (int i = 0; i < task.length; i++) {
            switch(task[i].getType()) {
            case "Do_SOMETHING_1":
                Runnable worker1 = new Do_SOMETHING_1(task[i]);
                executor.execute(worker1);
                break;
            case "Do_SOMETHING_2":
                Runnable worker2 = new Do_SOMETHING_2(task[i]);
                executor.execute(worker2);
                break;
            default: 
            //Do Nothing
            }}      }
}
Do_SOMETHING_1和Do_SOMETHING_2是maven模块,目前依赖于核心,因此它们知道任务是什么,因此我可以传递任务类型变量task[I]

问题是,在核心应用程序中,我需要调用Do-SOMETHING_1和Do-SOMETHING_2。因此,核心需要依赖于模块,我想这是不好的。但是,我如何才能传递任务,以便Do_某事\u 1能够访问这些信息。例如,网络和参数

谢谢你的帮助,因为我在这里压力很大

层次结构:

模块化取决于核心

模化的东西取决于核心


CORE依赖于ModuleDo_SOMETHING_1您不应该像那样将实现类硬编码到交换机中;它从本质上消除了多态性的所有优点。相反,使用一个抽象工厂来实例化操作的Runnable


在这种情况下,Java的服务提供者接口是完美的;它本质上允许您在运行时扫描某些接口的实现插件,使用起来并不困难。请参阅javax.crypto API,以了解其在实践中的工作原理。

您好!谢谢你的回复。但是我还是很困惑。我试图围绕任务构建一个抽象类。这样做会破坏GSON映射。你介意澄清一下你的方法吗?甚至可以整合我上面的例子。再次感谢你,很抱歉让你这么痛苦-斯蒂芬妮