[英]how to instantiate dynamically asynchronous service workers in java
我正在為銀行工作,我使用Java 1.4進行開發和應用。 我必須異步調用某些AS400服務,所以我決定使用這種方法:我創建一個private static Map
並在static
塊中填充它。 當我必須調用實例時,我獲取要作為參數調用的服務的名稱,搜索映射是否包含該String作為鍵並實例化服務類。
我遇到的問題是,在同一個JVM上同時運行許多異步進程,它們會同時檢索同一個服務類實例。
例如:
由於映射是靜態的,因此我將始終向進程提供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服務的東西,並且if-else if
不是真的可讀,則有60-70 if-else if
。
任何建議都是相關的。 在此先感謝Francesco
您可以創建服務工廠的映射,然后使用它。
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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.