基于maven的项目中的循环依赖/依赖反转(令人尴尬,但确实很容易)



我正在从事一个由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;
    }
}

为了处理任务,我编写了一个Jobs类,它检查作业,构建任务数组,然后尝试实例化一个新类来处理任务,具体取决于JSON文件指定的内容。它看起来像这样:

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_SOMEHING_2是maven模块,它们目前依赖于核心,因此它们知道任务是什么,因此我可以传递任务类型变量(task[I])。

问题是在核心应用程序中,我需要调用Do-SOMETHING_1和Do_SOMETHING_2。因此,核心需要依赖于模块,我想这是不好的。然而,我如何传递任务,以便Do_SOMETHING_1可以访问这些信息。例如,网络和论点?

感谢您的帮助,因为我在这里压力很大。

层次结构:

模块(Do_SOMETHING_1)取决于CORE

模块(Do_SOMETHING_2)取决于CORE

CORE取决于模块(Do_SOMETHING_1)<--错误的

CORE取决于模块(Do_SOMETHING_2)<--错误的

干杯,斯蒂芬妮。

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

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

相关内容

最新更新