2013-12-04 1 views
6

현재 Jax Rs 응용 프로그램에서 작업 중이며 Base64로 인코딩 된 이미지를 클라이언트에 출력하려고합니다. 클라이언트는 모바일 장치입니다.Java FX를 사용하여 서버 측에서 이미지 생성

모바일 장치는이 매개 변수를 사용하여이 서비스를 호출하고 서버는 가로 막 대형 차트를 그려 장치에 base64 인코딩 된 이미지 문자열로 다시 보내야합니다.

필요한 차트 라이브러리가있는 java Fx 이후로 다음 튜토리얼을 사용하여 샘플을 만들었습니다. "스냅 샷"기능도 예상대로 올바르게 작동하여 화면 이미지를 만들었습니다.

http://docs.oracle.com/javafx/2/charts/bar-chart.htm#CIHJFHDE

지금 나는 내가 잭스 루피 응용 프로그램 내에서이 필요하기 때문에 응용 프로그램 클래스를 확장하지 않고이 작업을 수행 할 수 있습니다. 그래서 내가 API를 사용하여 BuffredImage를 만든 다음 Base64 문자열을 만드는 데 사용할 수 있습니다.

JFreeChart를 사용하여이 작업을 수행하는 방법을 발견했습니다. 그러나 Java FX를 사용하여이 작업을 수행 할 수 있으면 더 좋습니다. 내가

조언을 주시기 바랍니다 자바 FX를 이용한 이전의 경험을 가지고하지 않는

답변

8

서버 기반의 자바 FX 런타임 초기화

서버에 자바 FX를 실행하려면 다음이 필요 하나에 :

  1. 시작 JavaFX Application 또는
  2. JFXPanel을 사용하십시오.

JavaFX 런타임 시스템을 JavaFX 2에서 초기화하여 사용할 수있는 유일한 방법입니다.

JFXPanel을 사용하면 JavaFX 응용 프로그램을 사용하는 것보다 처리 효율성이 약간 떨어집니다.

StackOverflow 질문의 JavaFX 시스템 초기화에 대한 자세한 설명은 JavaFX 2.1: Toolkit not initialized입니다.

자바 FX는 단일 스레드 시스템

당신은 어떤 스레드에서 대부분의 자바 FX 구성 요소를 만들 수 있습니다. 그러나 장면에서 구성 요소를 렌더링하려면 JavaFX 응용 프로그램 스레드에서 작업을 수행해야합니다. 즉, 대부분의 서버가있는 다중 스레드 서버 프로세스가 있고 여러 차트를 생성하려는 경우 동시성 제약 조건을 사용하여 차트 렌더링 요청을 단일 스레드해야합니다.

  1. 차트 요청이 들어 오면 Platform.runLater 명령을 실행하십시오. runLater 블록의 모든 코드는 결국 JavaFX 응용 프로그램 스레드에서 실행되는 대기열에 배치됩니다.
  2. runLater 블록에서 차트의 장면을 만들고 이미지에 스냅 샷을 만듭니다. callback version of snapshot은 JavaFX 응용 프로그램 스레드를 많이 묶지 않으므로 여기에서 사용하는 것이 가장 적합 할 수 있습니다. 그러나 사용하는 것이 더 까다 롭습니다.
  3. SwingFXUtils.fromFXImage을 사용하여 JavaFX 이미지를 AWT 이미지로 변환하십시오.
  4. 서버 처리기 스레드에서 이미지 결과를 다시 얻으려면 Return result from javafx platform runlater에 sarcan에 설명 된 FutureTask 기술을 사용하십시오.

서버 핸들러 스레드는 PNG와 같은 형식으로 출력 스트림에 AWT 이미지를 변환 할 ImageIO를 사용할 수 있습니다. 결과 스트림과 Base64 encode it을 가져 와서 원본 이미지 요청 호출에 대한 응답으로 기본 64 인코딩 된 스트림을 서버가 반환하도록 할 수 있습니다.

정상 종료를 확인

당신은 당신이 또한 셧다운에 Platform.exit()를 호출 할 수 있도록, 서버가 시작될 때 Platform.setImplicitExit(false)를 호출하고 종료 훅 또는 서블릿이 파괴 될 때 모니터링하는 ServletContextListener을 등록 할 것 JavaFX 시스템. 이렇게하지 않으면 JavaFX 응용 프로그램 스레드가 기다리는 작업을 계속해서 실행하기 때문에 서버를 정상적으로 종료 할 수 없습니다.

자바 FX 2.2은 정말 시스템 프로퍼티 java.awt.headless를 사용하여 헤드리스 서버

스윙 응용 프로그램을 할 수 run in headless mode에서 실행하도록 인증되지 않습니다. JavaFX와 비슷한 속성을 알지 못합니다. 그 중 하나가있을 수도 있고,있을 경우 openjfx-dev mailing list을 묻는 것으로 알 수 있습니다.

JavaFX는 주로 클라이언트 그래픽 툴킷으로 설계되었습니다. 서버에서 응용 프로그램에 맞게 작동하고 만족스럽게 작동하도록 할 수는 있지만 서버가 headless server으로 설정되어 있지 않고로드시 적절한 성능을 제공하는 적절한 그래픽 가속기 카드가 있어야합니다 .

JavaFX issue tracker에 헤드리스 모드의 공식 지원 요청을 제출할 수 있습니다.

+0

JFXPanel이 내 문제를 해결할 것이라고 생각합니다. 하지만 서버 측에서 새 스레드를 시작하고 Java FX 논리를 실행하는 것이 더 좋습니다. 감사합니다 .. –

+0

추가 답변을 제공하기 위해 제 답변을 편집했습니다. – jewelsea

+0

JFXPanel을 사용하여 구현할 때도 이러한 질문이 모두있었습니다. 특별히 쓰레드 처리. 헤드리스 서버 문제의 경우 http://stackoverflow.com/questions/17940329/javafx-for-server-side-image-generation this에 대한 답변을 찾았습니다. 그러나 나는 아직 그것을 시도하지 않았다. 자세한 답변을 주셔서 감사합니다. –

관련 문제