ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2015年5月15日金曜日

[Java] QuickFIX/J 1.6.0 (2) リリース

QuickFIX/J 1.6.0 がリリースされたようなので試してみた

・QFJ 1.6.0 release notes

□ ダウンロードと実行(java version "1.8.0_45")
ビルド済みのバイナリファイルをダウンロード
quickfixj-core-1.6.0.jar
quickfixj-messages-fixXX-1.6.0.jar (必要なバージョン、allなら全部込み)
をパスに指定する。

実行したところ、NewOrderSingleのインスタンス作成時 new NewOrderSingle() に以下のエラーが発生

java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    quickfix/fix44/NewOrderSingle.get(Lquickfix/field/SettlType;)Lquickfix/field/SettlType; @2: invokevirtual
  Reason:
    Type 'quickfix/field/SettlType' (current frame, stack[1]) is not assignable to 'quickfix/CharField'
  Current Frame:
    bci: @2
    flags: { }
    locals: { 'quickfix/fix44/NewOrderSingle', 'quickfix/field/SettlType' }
    stack: { 'quickfix/fix44/NewOrderSingle', 'quickfix/field/SettlType' }
  Bytecode:
    0x0000000: 2a2b b600 3057 2bb0   

SettlType はFIXのバージョンによってQFIX/Jのフィールド種別が異なっているようだ。
FIX4.4ではCharField、FIX5.0ではStringFieldで定義されている。
デフォルトでは、coreに定義されているSettlTypeはStringFieldを拡張している。

VerifyErrorはJDK7以降でclassファイルの検証方式が変更になったことによるものらしい。
既存プロジェクトをJDK8へ移行したら、java.lang.VerifyErrorが出た

とりあえずの解決法はフィールドのそろえればよい。↓のQAにも同様の回答があった。
[Quickfixj-users] Using multiple versions of FIX with Quickfix


□ ビルド
ソースをダウンロードして再ビルドする。
しかし、そのままビルドしたらテストが通らない。。。

原因を探すのが面倒なので、テストスキップでビルド
mvn install -DskipTests=true

全体を一度ビルドした後で、messageの定義を変更して再ビルドする。
使用したいバージョンの定義ファイルを編集する。FIX4.4の場合は以下
quickfixj-messages-fix44\src\main\resources\FIX44.modified.xml
このあたりを変更する
前)   
    ↓
後)  
メッセージだけビルドして終了

2015年1月30日金曜日

[Java] リモートJMX接続

リモートJMX接続ではまったのでメモ

・問題
CentOSでJMXのリモート接続設定を行ったにもかかわらず、リモート接続できない。
ただし、ファイヤーウォールをオフにしたところ接続できた。

・原因と解決策
ファイヤーウォールをオフにして接続して、Mission Controlから接続したところ、見覚えないポートで接続がされている。
調べたところ、JMX接続する際のRMIレジストリポートに加えて、通信用のRMIサーバーポートがあるらしい(デフォルトではランダム?)
-Dcom.sun.management.jmxremote.rmi.port=[port]
で設定したところうまくいきました。
最終的に設定したオプションは以下の通り(SSLは今後)
-Dcom.sun.management.jmxremote.port=[port]
-Dcom.sun.management.jmxremote.rmi.port=[port]
-Dcom.sun.management.jmxremote.access.file=[filepath]
-Dcom.sun.management.jmxremote.password.file=[filepath]
-Dcom.sun.management.jmxremote.ssl=false

↓はテスト用に
-Dcom.sun.management.jmxremote.authenticate=false

↓はなしでも動いた
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.local.only=false

・参考サイト
Oracle:JMXテクノロジを使用するモニタリングと管理 ← ここにわかりやすく書いておいてくれれば・・・
http://docs.oracle.com/javase/jp/8/technotes/guides/management/agent.html

Has anyone ever got a remote JMX JConsole to work?
http://stackoverflow.com/questions/151238/has-anyone-ever-got-a-remote-jmx-jconsole-to-work

JMXでのリモート接続でハマったことAdd Star
http://d.hatena.ne.jp/Kazuhira/20141112/1415782056

2014年10月1日水曜日

[Java] QuickFIX/J 1.6.0

リリース前ですが、ちょっと覗いてみました。
Maven & Github になったようです。

□ JIRA
http://www.quickfixj.org/jira/browse/QFJ

□ Release Notes
http://www.quickfixj.org/jira/secure/ReleaseNote.jspa?projectId=10000&version=10150

- Bug
1.5.3のBug-fixがたくさん

- Improvement
気になる改善点
[QFJ-664] - Upgrade MINA from 1.1.8 to 2.0.7
[QFJ-736] - performance improvement: Modify the code to use StringBuilder instead of StringBuffer in calculateString method of FieldMap
[QFJ-740] - Replace StringBuffer with StringBuilder
[QFJ-777] - Determine session's IP address

□ Builds
ビルド済みはこちらに
http://www.quickfixj.org/jira/browse/QFJ/?selectedTab=com.atlassian.jira.plugin.ext.bamboo:bamboo-project-tabpanel

2014年9月26日金曜日

[Java] FIXのtimestampの取り扱い

FIXのtimestamp(UTC, String) をLoacalDateTime(JST)に変換したい。いろいろぐぐったが適当なものが見つからず。

FIXのtimestampの例
  SendingTime(UTC) : 52=20140925-18:09:34.422

以下はアイディア
(1) LocalDateTimeに変換し、9時間プラスする。
(2) LocalDateTime(UTC)に変換 ⇒ Instantに変換 ⇒ ZonedDateTIme(JST)に変換 ⇒ LocalDateTime(JST)に変換
(3) もっと良いやり方が。。。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd-HH:mm:ss.SSS");
String sampleTime = "20140925-18:09:34.444";

// UTC
LocalDateTime localDateTimeUtc = LocalDateTime.parse(sampleTime, formatter);

// (1) LocalDateTimeに変換し、9時間プラスする。
LocalDateTime localDateTimeJst = localDateTimeUtc.plusHours(9);

// (2) LocalDateTime(UTC)に変換 ⇒ Instantに変換 ⇒ ZonedDateTIme(JST)に変換 ⇒ LocalDateTime(JST)に変換
Instant instant = localDateTimeUtc.toInstant(ZoneOffset.UTC);
ZonedDateTime zonedDateTimeJst = ZonedDateTime.ofInstant(instant, ZoneId.of("Asia/Tokyo"));
LocalDateTime localDateTimeJst2 = zonedDateTimeJst.toLocalDateTime();

DateTimeAPIで参考になりそうなサイト
・Programming Studio Date and Time API 徹底攻略(5) - Date/Time その2
・JavaのAPI

2014年8月2日土曜日

[Java] ArrayとArrayListの速度比較

小さめのサイズでArrayとArrayListの速度比較を行ってみました。

[前提]
 ・サイズは 10-100 程度
 ・リストの容量と中身の大きさはほぼ同じ
 ・用途は、更新頻度が高いイベントの配布先の管理に使う


[結果]
Arrayのforとforeachはほぼ同じ。
ArrayListでも通常のforループで回すと余り変わらない 。若干ArrayListが遅いか。
foreach、streamは遅い。foreachで2倍程度。

[Array - for]
Start : 1406987147093, End : 1406987147102, Took : 9
[Array - foreach]
Start : 1406987147122, End : 1406987147131, Took : 9
[ArrayList - for]
Start : 1406987147132, End : 1406987147142, Took : 10
[ArrayList - foreach]
Start : 1406987147142, End : 1406987147174, Took : 32
[ArrayList - stream]
Start : 1406987147174, End : 1406987147229, Took : 55


※初期容量を非常に大きくした場合
 ⇒foreachが大きく影響を受ける。
[Array - for]
Start : 1406987109799, End : 1406987109809, Took : 10
[Array - foreach]
Start : 1406987109826, End : 1406987109835, Took : 9
[ArrayList - for]
Start : 1406987109835, End : 1406987109845, Took : 10
[ArrayList - foreach]
Start : 1406987109845, End : 1406987110117, Took : 272
[ArrayList - stream]
Start : 1406987110118, End : 1406987110526, Took : 408

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ListAndArray {

    private final int SIZE = 20;
    private final int OUTER_COUNT = 100000;
    
    private ExecutorService executer = Executors.newFixedThreadPool(SIZE);
    
    public static void main(String[] args) {
        ListAndArray instance = new ListAndArray();
        instance.calcListVsArray();
    }
    
    public void calcListVsArray() {
        // initialize
        List list = new ArrayList<>(SIZE);
        for (int i = 0; i < SIZE; i++) {
            list.add(new EventListenerSample());
        }
        EventListenerSample[] array  = list.toArray(new EventListenerSample[list.size()]);

        long startTime;
        long endTime;
        long miliExecTime;
       
        // calc
        System.out.println("[Array - for]");
        startTime = System.currentTimeMillis();
        for (int outer = 0; outer < OUTER_COUNT; outer++) {
            for (int i = 0; i < SIZE; i++) {
                array[i].getLocalDateTime();
            }
        }
        endTime = System.currentTimeMillis();
        miliExecTime = endTime - startTime;
        System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime);
        
        
        System.out.println("[Array - foreach]");
        startTime = System.currentTimeMillis();
        for (int outer = 0; outer < OUTER_COUNT; outer++) {
            for (EventListenerSample eventListenerSample : array) {
                eventListenerSample.getLocalDateTime();
            }
        }
        endTime = System.currentTimeMillis();
        miliExecTime = endTime - startTime;
        System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime);
        
        
        System.out.println("[ArrayList - for]");
        startTime = System.currentTimeMillis();
        for (int outer = 0; outer < OUTER_COUNT; outer++) {
            for (int i = 0; i < SIZE; i++) {
                list.get(i).getLocalDateTime();
            }
        }
        endTime = System.currentTimeMillis();
        miliExecTime = endTime - startTime;
        System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime);
        
        

        System.out.println("[ArrayList - foreach]");
        startTime = System.currentTimeMillis();
        for (int outer = 0; outer < OUTER_COUNT; outer++) {
            for (EventListenerSample eventListenerSample : list) {
                eventListenerSample.getLocalDateTime();
            }
        }
        endTime = System.currentTimeMillis();
        miliExecTime = endTime - startTime;
        System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime);

        
        System.out.println("[ArrayList - stream]");
        startTime = System.currentTimeMillis();
        for (int outer = 0; outer < OUTER_COUNT; outer++) {
            list.stream().forEach(e -> e.getLocalDateTime());
        }
        endTime = System.currentTimeMillis();
        miliExecTime = endTime - startTime;
        System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime);
    }

    
    public static class EventListenerSample {
        private Integer integer = Integer.MAX_VALUE - 1;
        private String b = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
        private String c = "ccccccccccccccccccccccccccccccc";
        private LocalDateTime localDateTime = LocalDateTime.now();
        public LocalDateTime getLocalDateTime() {
            return localDateTime;
        }
    }
}