gpt4 book ai didi

java - 如何在java中动态实例化异步服务 worker

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:47 26 4
gpt4 key购买 nike

我在一家银行工作,我使用 Java 1.4 进行开发和应用。我必须异步调用某些特定的 AS400 服务,所以我决定使用这种方法:我创建一个 private static Map 并将它填充到一个 static block 中。当我必须调用实例时,我获取要调用的服务名称作为参数,搜索 map 是否包含该字符串作为键并实例化服务类。

我遇到的问题是,有许多异步进程同时在同一个 JVM 上工作,它们可能会同时检索同一个服务类实例。

例如:

  • 在时间 1 进程 A 调用 WBX133 并在时间 10 释放它
  • 在时间 3 进程 B 调用 WBX220 并在时间 8 释放它
  • 在时间 4 进程 C 调用 WBX133 并在时间 13 释放它

由于映射是静态的,我将始终向进程提供工作类的相同实例,但是,每个进程将有不同的输入并期望来自相同服务的不同输出。

这是我解释过的代码:

public class AS400ServiceFactory {
private static Map serviceMap;

static {
serviceMap = new HashMap();

serviceMap.put("WBX133", new Wbx133Service());
serviceMap.put("WBX134", new Wbx134Service());
serviceMap.put("WBX220", new Wbx220Service());
serviceMap.put("WBX360", new Wbx360Service());
serviceMap.put("WBX370", new Wbx370Service());
serviceMap.put("WBX371", new Wbx371Service());
}

public static AS400Container getInstance(String serviceName) {
ASService service = null;
if (serviceMap.containsKey(serviceName)) {
service = (ASService) serviceMap.get(serviceName);
}
}
}

一个快速(但在我看来并不优雅)的解决方案是,不用静态 map ,只需:

public class AS400ServiceFactory {
public static AS400Container getInstance(String serviceName) {
ASService service = null;

if (("WBX133").equals(serviceName)) {
service = new Wbx133Service();
}
if (("WBX134").equals(serviceName)) {
service = new Wbx134Service();
}
if (("WBX220").equals(serviceName)) {
service = new Wbx220Service();
}
if (("WBX360").equals(serviceName)) {
service = new Wbx360Service();
}
if (("WBX370").equals(serviceName)) {
service = new Wbx370Service();
}
if (("WBX371").equals(serviceName)) {
service = new Wbx371Service();
}
}
}

这样我就不会再有总是有相同实例的问题了。但是,我将来会有类似 60-70 服务和 60-70 的 if-else if 不是真正可读的。

任何建议都会受到赞赏。提前致谢,弗朗切斯科

最佳答案

您可以创建一个服务工厂 map ,然后使用它。

public class AS400ServiceFactory {
private static Map factories = createFactories();

private static Map createFactories() {
Map factories = new HashMap();
factories.put("WBX133", new ServiceFactory(){ public ASService create() { return new Wbx133Service(); } });
factories.put("WBX134", new ServiceFactory(){ public ASService create() { return new Wbx134Service(); } });
factories.put("WBX220", new ServiceFactory(){ public ASService create() { return new Wbx220Service(); } });
// More factories here
return factories;
}

public static AS400Container getInstance(String serviceName) {
ServiceFactory factory = (ServiceFactory)factories.get(serviceName);
ASService service = null;
if (factory != null) {
service = factory.create();
}
// Rest of the method
}
private interface ServiceFactory {
ASService create();
}
}

关于java - 如何在java中动态实例化异步服务 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42901622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com