2009-12-10 9 views
5

Kiedy używam API Java Bloomber V3 zwykle działa. Jednak czasami, szczególnie po ponownym uruchomieniu, bbcomm.exe nie działa w tle. Mogę uruchomić go ręcznie, uruchamiając blp.exe, ale zastanawiałem się, czy był sposób na to poprzez API?Uruchamianie bbcomm w Javie v3 Bloomberg API

Nadal czekam na Help-help ...

Odpowiedz

4

Po rozmowie z help desk, okazuje się, że w 64-bitowym systemie Windows, działa pod 64-bitową maszyną JVM bbcomm nie uruchamia się automatycznie. Nie dzieje się to pod 32-bitową Javą - w 32-bitowym bbcomm uruchamia się automatycznie.

Moje rozwiązania polegają więc albo na tym, aby problem został naprawiony przez Bloomberg (teraz rozumiem), albo na sprawdzeniu tego konkretnego przypadku.

Aby sprawdzić konkretny przypadek:

  • jeśli działa w 64-bitowych systemach Windows (właściwość systemu os.arch)
  • a jeśli działa pod 64-bitowym JVM (właściwość systemu java.vm.name)
  • następnie spróbuj i początek sesja
  • Jeśli to się nie powiedzie, załóżmy, że bbcomm.exe nie działa. Spróbuj uruchomić polecenie bbcomm.exe przy użyciu Runtime.exec()

Nie testowałem jeszcze powyższego. Może mieć dokładnie te same problemy, co Bloomberg z 64-bitowymi maszynami wirtualnymi.

+0

Próbowałem tego i działa. –

-2

bbcomm.exe jest automatycznie uruchamiany przez API V3.

+0

Właściwie, to czasami jest, ale czasami nie jest. Dodam odpowiedź z moją ostateczną rezolucją –

+0

Powinieneś zgłosić problem. Biblioteka klienta API już robi dokładnie to, co próbujesz zrobić.Jeśli nie może połączyć się z bbcomm, próbuje go uruchomić. Jeśli to nie działa w niektórych przypadkach, powinieneś zgłosić to do bloomberg, jeśli jeszcze tego nie zrobiłeś. –

+1

Skończyło się na tym, co zasugerowałem w mojej odpowiedzi. Nie mogę zadać sobie trudu, aby przejść przez serwis pomocy technicznej BB, aby uzyskać kogoś, kto wie, o czym mówią. Jeśli pracujesz dla bloomberga, nie krępuj się zgłaszać lub przesyłaj mi prywatnie –

0

Mamy ten sam problem na 64-bitowym komputerze z systemem Windows 7, korzystając z interfejsu API .net. Plik bbcomm.exe nie uruchamia się automatycznie, a jedynym rozwiązaniem jest uruchomienie aplikacji "Bloomberg API DEMO" ...

3

Po spędzeniu trochę czasu z pomocą pomocy, wydaje się, że bbcomm uruchamia się, gdy używasz Excel API lub uruchom demo interfejsu API. Ale nie uruchamia się automatycznie po wywołaniu z Java API. Możliwych sposobów, aby go uruchomić to:

  • dodanie wpisu w rejestrze, aby automatycznie uruchomić bbcomm na starcie: w HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run dodać wartość ciągu o nazwie bbcomm o wartości C:\blp\API\bbcomm.exe - ale to otwiera okno poleceń, który pozostaje widoczny, więc nie naprawdę opcją (a jeśli zamknąć to okno to kończy proces bbcomm)
  • utworzyć plik wsadowy START /MIN C:\blp\API\bbcomm.exe i zastąpić wpis w rejestrze z tym (nie badane) zadzwonić bbcomm milczeniu
  • ręcznie uruchomić bbcomm z java kod już zasugerowany. Jako punkt odniesienia zamieszczam poniżej kod, którego używam.
private final static Logger logger = LoggerFactory.getLogger(BloombergUtils.class); 
private final static String BBCOMM_PROCESS = "bbcomm.exe"; 
private final static String BBCOMM_FOLDER = "C:/blp/API"; 

/** 
* 
* @return true if the bbcomm process is running 
*/ 
public static boolean isBloombergProcessRunning() { 
    return ShellUtils.isProcessRunning(BBCOMM_PROCESS); 
} 

/** 
* Starts the bbcomm process, which is required to connect to the Bloomberg data feed 
* @return true if bbcomm was started successfully, false otherwise 
*/ 
public static boolean startBloombergProcessIfNecessary() { 
    if (isBloombergProcessRunning()) { 
     logger.info(BBCOMM_PROCESS + " is started"); 
     return true; 
    } 

    Callable<Boolean> startBloombergProcess = getStartingCallable(); 
    return getResultWithTimeout(startBloombergProcess, 1, TimeUnit.SECONDS); 
} 

private static Callable<Boolean> getStartingCallable() { 
    return new Callable<Boolean>() { 
     @Override 
     public Boolean call() throws Exception { 
      logger.info("Starting " + BBCOMM_PROCESS + " manually"); 
      ProcessBuilder pb = new ProcessBuilder(BBCOMM_PROCESS); 
      pb.directory(new File(BBCOMM_FOLDER)); 
      pb.redirectErrorStream(true); 
      Process p = pb.start(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       if (line.toLowerCase().contains("started")) { 
        logger.info(BBCOMM_PROCESS + " is started"); 
        return true; 
       } 
      } 
      return false; 
     } 
    }; 

} 

private static boolean getResultWithTimeout(Callable<Boolean> startBloombergProcess, int timeout, TimeUnit timeUnit) { 
    ExecutorService executor = Executors.newSingleThreadExecutor(new ThreadFactory() { 

     @Override 
     public Thread newThread(Runnable r) { 
      Thread t = new Thread(r, "Bloomberg - bbcomm starter thread"); 
      t.setDaemon(true); 
      return t; 
     } 
    }); 
    Future<Boolean> future = executor.submit(startBloombergProcess); 

    try { 
     return future.get(timeout, timeUnit); 
    } catch (InterruptedException ignore) { 
     Thread.currentThread().interrupt(); 
     return false; 
    } catch (ExecutionException | TimeoutException e) { 
     logger.error("Could not start bbcomm", e); 
     return false; 
    } finally { 
     executor.shutdownNow(); 
     try { 
      if (!executor.awaitTermination(100, TimeUnit.MILLISECONDS)) { 
       logger.warn("bbcomm starter thread still running"); 
      } 
     } catch (InterruptedException ex) { 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

ShellUtils.java

public class ShellUtils { 

    private final static Logger logger = LoggerFactory.getLogger(ShellUtils.class); 

    /** 
    * @return a list of processes currently running 
    * @throws RuntimeException if the request sent to the OS to get the list of running processes fails 
    */ 
    public static List<String> getRunningProcesses() { 
     List<String> processes = new ArrayList<>(); 

     try { 
      Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "tasklist.exe"); 
      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line; 
      int i = 0; 
      while ((line = input.readLine()) != null) { 
       if (!line.isEmpty()) { 
        String process = line.split(" ")[0]; 
        if (process.contains("exe")) { 
         processes.add(process); 
        } 
       } 
      } 
     } catch (IOException e) { 
      throw new RuntimeException("Could not retrieve the list of running processes from the OS"); 
     } 

     return processes; 
    } 

    /** 
    * 
    * @param processName the name of the process, for example "explorer.exe" 
    * @return true if the process is currently running 
    * @throws RuntimeException if the request sent to the OS to get the list of running processes fails 
    */ 
    public static boolean isProcessRunning(String processName) { 
     List<String> processes = getRunningProcesses(); 
     return processes.contains(processName); 
    } 
}