Запуск bbcomm в Java v3 Bloomberg API

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

Я все еще жду помощи-помощи...


person Nick Fortescue    schedule 10.12.2009    source источник


Ответы (4)


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

Так что мои решения — либо дождаться решения проблемы Bloomberg (теперь я это понимаю), либо проверить этот конкретный случай.

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

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

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

person Nick Fortescue    schedule 17.12.2009

Потратив некоторое время на Help Help, кажется, что 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);
    }
}
person assylias    schedule 27.09.2012

Я знаю, что это старый пост, но я решил добавить свое решение для справки на случай, если кому-то понадобится помощь в проверке/запуске процесса bbcomm.exe из окна консоли, скрывающего код.

Этот фрагмент написан на C#, но я надеюсь, что вы сможете легко перевести его на Java.

void Main()
{
    var processes = Process.GetProcessesByName("bbcomm");
    if (processes.Any())
    {
        Console.WriteLine(processes.First().ProcessName + " already running");
        return;
    }

    var exePath = @"C:\blp\DAPI\bbcomm.exe";
    var processStart = new ProcessStartInfo(exePath);
    processStart.UseShellExecute = false;
    processStart.CreateNoWindow = true;
    processStart.RedirectStandardError = true;
    processStart.RedirectStandardOutput = true;
    processStart.RedirectStandardInput = true;  
    var process = Process.Start(processStart);
    Console.WriteLine(process.ProcessName + " started");
}
person Art    schedule 30.07.2019

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

person G Sousa    schedule 16.12.2009
comment
На самом деле, иногда это так, а иногда и нет. Я добавлю ответ с моим окончательным решением - person Nick Fortescue; 17.12.2009
comment
Вы должны сообщить о проблеме. Клиентская библиотека API уже делает именно то, что вы пытаетесь сделать. Если он не может подключиться к bbcomm, он пытается его запустить. Если в некоторых случаях это не работает, вы должны сообщить об этом в Bloomberg, если вы еще этого не сделали. - person G Sousa; 17.12.2009
comment
В итоге я сделал то, что предложил в своем ответе. Мне не терпится пройти через службу поддержки BB, чтобы найти кого-то, кто знает, о чем они говорят. Если вы работаете в Bloomberg, не стесняйтесь сообщить об этом или написать мне лично. - person Nick Fortescue; 28.05.2010