如何在 Java 中实例化动态异步服务工作线程



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

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

例如:

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

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

这是我解释的代码:

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);
}
}
}

一个快速(但在我看来,并不优雅)的解决方案是,而不是拥有静态地图,只需:

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-70if-else if并不是真正可读的。

任何建议都值得赞赏。 提前感谢, 弗朗切斯科

您可以创建服务工厂的映射,然后使用它。

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();
}
}

最新更新