Генерация изображения на стороне сервера с использованием Java FX
В настоящее время я работаю над приложением Jax Rs и хочу вывести клиенту изображение в кодировке Base64. Клиент является мобильным устройством.
Мобильное устройство вызовет эту службу с некоторыми параметрами, и сервер должен нарисовать гистограмму и отправить ее обратно на устройство в виде строки изображения в кодировке base64.
Поскольку java Fx имеет необходимые библиотеки диаграмм, я сделал пример, используя следующий учебник. Функция "снимок" также работала корректно, как и ожидалось (для создания изображения экрана).
http://docs.oracle.com/javafx/2/charts/bar-chart.htm
Теперь я хочу сделать это без расширения класса Application, потому что мне нужно это в приложении Jax Rs. Так что я могу просто использовать API для создания BuffredImage, а затем использовать его для создания строки Base64.
Я нашел способ сделать это с помощью JFreeChart. Но я предпочитаю, если я могу сделать это с помощью Java FX. У меня нет опыта работы с Java Fx
Пожалуйста посоветуй
1 ответ
Инициализация времени выполнения JavaFX на сервере
Для запуска JavaFX на сервере вам необходимо:
- Запустите приложение JavaFX ИЛИ
- Используйте JFXPanel.
Это единственные способы инициализации системы исполнения JavaFX в JavaFX 2, чтобы вы могли ее использовать.
Использование JFXPanel, вероятно, немного менее эффективно с точки зрения обработки, чем использование приложения JavaFX.
Далее обсуждается вопрос инициализации системы JavaFX в вопросе Stackru: JavaFX 2.1: инструментарий не инициализирован.
JavaFX - однопоточная система
Вы можете создавать большинство компонентов JavaFX в любом потоке. Однако для рендеринга компонентов в сцене вы должны выполнить работу в потоке приложения JavaFX. Это означает, что если у вас есть многопоточный серверный процесс, которым является большинство серверов, и вы хотите сгенерировать несколько диаграмм, вам нужно будет однопоточно обрабатывать запросы рендеринга диаграммы, используя ограничения параллелизма.
- Когда вы получите входящий запрос для диаграммы, введите команду Platform.runLater. Весь код в блоке runLater будет помещен в очередь, которая в конечном итоге будет выполняться в потоке приложения JavaFX.
- В блоке runLater создайте сцену для своего графика и сделайте снимок этого изображения. Версия с обратным вызовом снимка может быть наиболее подходящей для использования здесь, так как она, скорее всего, не так сильно связывает поток приложений JavaFX, хотя, скорее всего, обмануть ее.
- Преобразуйте образ JavaFX в образ AWT, используя SwingFXUtils.fromFXImage.
- Чтобы вернуть результат изображения в поток обработчика сервера, используйте технику FutureTask, описанную sarcan в: Возвращение результата из runlater платформы javafx.
Затем ваш обработчик сервера может использовать ImageIO для преобразования изображения AWT в выходной поток в формате, подобном png. Вы можете взять поток результатов и Base64 закодировать его и заставить сервер вернуть закодированный base 64 поток в ответ на исходный вызов запроса изображения.
Обеспечить корректное отключение
Вы захотите вызвать Platform.setImplicitExit (false), когда ваш сервер запускается, и зарегистрировать перехват выключения или ServletContextListener, который отслеживает, когда сервлет уничтожается, так что вы также вызываете Platform.exit () для выключения системы JavaFX. Если вы этого не сделаете, скорее всего, ваш сервер не сможет корректно завершить работу, поскольку поток приложения JavaFX продолжит работу в ожидании работы.
JavaFX 2.2 не сертифицирован для работы на автономном сервере
Приложения Swing могут запускаться в автономном режиме с использованием системного свойства java.awt.headless. Мне не известно о подобном свойстве для JavaFX, хотя оно может быть, и, если таковое имеется, вы можете узнать, что это было, спросив список рассылки openjfx-dev.
JavaFX в первую очередь разработан как клиентский графический инструментарий. Несмотря на то, что вы можете заставить его работать и удовлетворительно работать для вашего приложения на сервере, для этого вам может потребоваться убедиться, что сервер не настроен в качестве автономного сервера и что у него есть соответствующая карта графического ускорителя для обеспечения разумной производительности при нагрузки.
Вы можете подать запрос на официальную поддержку безголового режима в трекере проблем JavaFX.