簡體   English   中英

如何在java中實例化動態異步服務工作者

[英]how to instantiate dynamically asynchronous service workers in java

我正在為銀行工作,我使用Java 1.4進行開發和應用。 我必須異步調用某些AS400服務,所以我決定使用這種方法:我創建一個private static Map並在static塊中填充它。 當我必須調用實例時,我獲取要作為參數調用的服務的名稱,搜索映射是否包含該String作為鍵並實例化服務類。

我遇到的問題是,在同一個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服務的東西,並且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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM