我正在从事一个由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,了解它在实践中的工作原理。