Upload
yasumasa-suenaga
View
1.901
Download
4
Embed Size (px)
DESCRIPTION
JavaFX Night講演資料
Citation preview
末永恭正 @YaSuenag
はじめに
私はJavaFX(Javaも?)素人です
我流でやってきた内容をお話しします
マサカリ禁止
×
自己紹介
末永恭正(すえながやすまさ) @YaSuenag
SIerでJavaやってるサンデープログラマー
OpenJDK Author(jdk9)
IcedTea Committer
HeapStats作ってますhttp://icedtea.classpath.org/wiki/HeapStats/jp
HeapStats
Javaの障害解析支援&監視ツール
とにかくエージェントの性能に腐心
より軽く・より速く
JRE (JVM) JVM監視エージェント
Javaアプリケーション(Java製アプリケーションサーバも含む)
JVMにアタッチ
Javaアプリケーション実行マシン
Java関連情報• ヒープスナップショット• OSリソース• etc…
アナライザ
解析
置き去りにされたアナライザ…
Java SE 6ベース
Swing
コードが冗長
やっぱり今風にしておきたい
見た目重要
HeapStats×
JavaFX
HeapStatsFXAnalyzerhttps://github.com/YaSuenag/HeapStatsFXAnalyzer
HeapStatsFXAnalyzer
HeapStats Analyzer ♥ JavaFX8
Java8のコード
Lambda、StreamAPIバリバリ使いたい
プラガブル
アナライザへの機能追加を誰でもできる
コミュニティドリブンな開発
GitHub
developブランチ見てください
将来的には本家(IcedTea)へマージ予定
なぜJavaFX8?
SwingNodeが使いたかったから
使っている主な(?)機能
FXML
Chart PieChart
StackedAreaChart
AreaChart
LineChart
Task ProgressIndicatorとbind
国際化(と言えるか?) とりあえず日本語と英語
構成
HeapStats 1.0相当のアナライザを実装
プラグインで機能拡張
HeapStatsFXAnalyzer
コア機能
スナップショットパーサー
ログパーサー
GUI部品プラグイン
管理
組み込みプラグイン
スナップショット
リソースログ
CSV出力
プラグイン
参照ツリー表示
JVM死活監視 …
HeapStatsのプラグイン
FXMLを含むJAR形式
コントローラはHeapStatsFXAnalyzerに含まれるPluginControllerを継承する必要あり
Java8/JavaFX8可
プラグインにはTabが1枚与えられる
FXMLの含まれるパッケージ名を設定してlibにJARと関連ライブラリを入れておけばOK
heapstats.properties:plugins=jp.co.ntt.oss.heapstats.plugin.builtin.log ; \
jp.co.ntt.oss.heapstats.plugin.builtin.snapshot ; \jp.dip.ysfactory.heapstats.plugin.jvmlive
プラグインが呼ばれるまで 1
クラスローダの設定
PluginClassLoader
HeapStatsFXAnalyzerのlibを向くクラスローダ
lib配下のJARをすべてロード
FXMLLoader#setDefaultClassLoader()にセット
PluginClassLoader
設定
FXMLLoader
jp.co.ntt.oss.heapstats.WindowController#loadPlugin()
プラグインが呼ばれるまで 2
各プラグインのロード
heapstats.propertiesのpluginsに指定されたもの
FXMLLoaderインスタンスはResourceBundleを指定して作成
日本語or英語
普通にFXMLLoader#load()
staticなload()は使わない
プラグインリスト
ロード
FXMLLoader
jp.co.ntt.oss.heapstats.WindowController#addPlugin()
プラグインが呼ばれるまで 3
コントローラインスタンスの取得 FXMLLoader#getController()
HeapStatsのPluginControllerにキャスト
プラグインの初期設定 オーナーWindow、ProcessIndicator関連
タブ選択イベントの設定 Tab#setOnSelectionChanged()
タブへの画面追加
セットアップ 画面タブ表示
jp.co.ntt.oss.heapstats.WindowController#addPlugin()
FXMLLoader
取得
コントローラ
PluginController
FXMLコントローラのabstractクラス
プラグインは必ず継承する必要あり
最小限の機能とインターフェースを提供
Taskのbind
ProcessIndicator、画面のグレーアウト
イベントのキック
タブ選択
ウィンドウのリサイズ
プラグインのライセンス情報の提供
オーナーウィンドウのインスタンス取得
jp.co.ntt.oss.heapstats.plugin.PluginController
プラグイン間のデータ受け渡し
各プラグインのコントローラに直接アクセス
コントローラのインスタンスは親ウィンドウのコントローラから取得
ロード済みプラグインのリストを持っている
他にいい案が思い浮かばなかった…
<RefTreePlugin>jp.co.ntt.oss.heapstats.plugin.reftree.RefTreeController#initialize()
今あるプラグイン
参照ツリー表示には…
RefTreePluginhttps://github.com/YaSuenag/RefTreePlugin
RefTreePlugin
HeapStatsFXAnalyzerにオブジェクト参照ツリー表示機能を追加
SwingNodeで実装
要JGraphX
http://www.jgraph.com/jgraphdownload.html
HeapStatsでネットワーク上のJVMをすべてルックアップ&死活監視!
JVMLivehttps://github.com/YaSuenag/JVMLive
JVMLive
JDP(Java Discovery Protocol)を使ってネットワーク上のJVMを自動ルックアップ
見つけたJVMで動いているメインクラスや稼働時間などを確認可能
JDPパケットの定期受信ができないJVMをハイライト表示
JVMのクラッシュ検知機能
OracleJDK限定
-XX:+TransmitErrorReportと-XX:ErrorReportServerが指定されていればJVMLiveでクラッシュを検知&hs_errログを自動回収
JavaFXで困ったこと
困ったこと その1
ダイアログがない
自作しました
Accordionで詳細メッセージが見れるようにしました
8u40までの命
Jp/co/ntt/oss/heapstats/utils/infoDialog.fxml
困ったこと その2
複数Chartの合成に対応していない
JIRAに要望は上がっているみたいです
RT-12710: chart API -- multiple chart types on the same axis
https://javafx-jira.kenai.com/browse/RT-1271※要ログイン
StackPaneと透過を使って複数Chartを組み合わせてた時期もあり
結局、複数枚のChartに分割で落ち着く
困ったこと その3
ChartのTooltipが重い
描画要素数に応じてとても重くなる
Tooltipもどきを自作
マウスポインタ周辺にPopupを表示
描画タイミングはonMouseMoved/onMouseExitedの組み合わせ
マウスのX座標のみに注目
Yの値はXがわかればChartのデータから取れる
XAxisのgetLayoutX/getStartMargin/getValueForDisplay
jp.co.ntt.oss.heapstats.plugin.builtin.log.LogController#onChartMouseMoved()
困ったこと その4
animated=trueなAreaChartで多要素の描画をさせるとシンボルが表示されない
アニメーションやめた(PieChart以外)
今のところアニメーションによる
悪影響なし
JavaFXで困ってること
困ってること その1
SwingNodeが絡むと一部JavaFXコントロールがブラックアウトする
ウィンドウをリサイズすると全部真っ黒に…
黒い部分の上をマウスでグルグルすると表示される
<RefTreePlugin>
JavaFXコントロール
SwingNode
困ってること その2
ChartのSeriesを含むFXMLがSceneBuilderでロードできない
UI作るのにかなり致命的
OpenJFXからビルドしたものだときちんとロードできた
ココ
困ってること その3
WindowsとLinuxでウィンドウサイズ関連プロパティの動きが違う
Windowクラスのwidth/heightにセットするChangeListener
Fedora20だとwidth/heightプロパティの変化がワンテンポ遅い
Win7(期待通り) Fedora20(ズレる)
黒い縦線(障害発生ポイント)をChangeListenerで描画
困ってること その4
SwingNodeのDrag and Dropイベントがおかしい
java.awt.dnd.InvalidDnDOperationException
セルをドラッグする際のJGraphX内部の処理で例外発生
<RefTreePlugin>
お願い
お願いします!
まずはFork
次にPull Request
できればプラグイン作成
「いいね!」
ご意見もお願いいます!
あったらいいな… プラグイン
vmstat
sar
iostat
etc…