2009-12-10 2 views
5

Когда я использую Java Bloomber V3 API, он обычно работает. Однако иногда, особенно после перезагрузки, bbcomm.exe не работает в фоновом режиме. Я могу запустить его вручную, запустив blp.exe, но я подумал, есть ли способ сделать это через API?Запуск bbcomm в Java v3 Bloomberg API

Я все еще жду на Help-Help ...

ответ

4

После разговора с справочной службой выясняется, что на 64-битной Windows запуск под 64-битной JBM-bbcomm не запускается автоматически. Это не происходит под 32-разрядной Java - до 32 бит bbcomm автоматически запускается.

Итак, мои решения - либо дождаться, когда проблема будет исправлена ​​Bloomberg (теперь я это понимаю), либо для проверки этого конкретного случая.

Чтобы проверить конкретный случай:

  • при работе под 64-битной ОС Windows (Свойства системы os.arch)
  • и при работе под 64-битной виртуальной машины Java (Свойства системы java.vm.name)
  • затем попытаться старт a
  • Если это не удается, предположим, что bbcomm.exe не работает. Попробуйте запустить bbcomm.exe с помощью Runtime.exec()

Я еще не протестировал вышеуказанное. У него могут быть те же проблемы, что и у Bloomberg с 64-битными виртуальными машинами.

+0

Я пробовал это, и он работает. –

-2

bbcomm.exe автоматически запускается в V3 API.

+0

На самом деле, это иногда, но иногда нет. Я добавлю ответ с моей окончательной резолюцией –

+0

Вы должны сообщить об этой проблеме. Клиентская библиотека API уже делает именно то, что вы пытаетесь сделать.Если он не может подключиться к bbcomm, он пытается запустить его. Если это не работает в некоторых случаях, вы должны сообщить об этом в bloomberg, если вы этого еще не сделали. –

+1

Я закончил тем, что предложил в своем ответе. Я не могу беспокоиться о том, чтобы пройти через службу поддержки BB, чтобы получить кого-то, кто знает, о чем они говорят. Если вы работаете в bloomberg, не стесняйтесь сообщать или сообщать мне конфиденциально –

0

У нас такая же проблема на 64-разрядной машине Windows 7, используя API .net. Bbcomm.exe не запускается автоматически, и единственным обходным решением является запуск приложения «Bloomberg API DEMO» ...

3

Проведя некоторое время с помощью справки, кажется, что bbcomm запускается либо при использовании Excel API или запустить демонстрацию API. Но он не запускается автоматически при вызове из Java API. Возможные способы его запуска являются:

  • добавления записи в реестре для автоматического запуска bbcomm при запуске: в HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run добавить строковое значение с именем bbcomm со значением C:\blp\API\bbcomm.exe - но это открывает окно командной строки, которая остается видимой, так что не действительно вариант (и если закрыть это окно он завершает процесс bbcomm)
  • создать пакетный файл START /MIN C:\blp\API\bbcomm.exe и заменить запись в реестре с этим (не тестировалось), чтобы вызвать bbcomm молча
  • вручную запустить bbcomm из вашего Java как уже было предложено. В качестве ссылки я размещаю ниже кода, который я использую.
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); 
    } 
} 
Смежные вопросы