Enfernuz / JavaTrans2Quik

Java-wrapper for Trans2Quik.dll ("QUIK", Trading Platform by ARQA)
16 stars 10 forks source link

Не находит DLL #2

Closed abishai closed 7 years ago

abishai commented 7 years ago

Собрал проект, но он не находит библиотеку (в самом проекте ничего не менял).

c:\Software\Sync>java -jar quiksockets.jar
[main] INFO ru.abinet.quiksockets.QuikSockets - Registered terminal #TEST, path
C:\Software\QUIK_OPEN
[main] INFO ru.abinet.quiksockets.QuikSockets - Listening 10.0.1.13 port 2000
[Thread-0] INFO ru.abinet.quiksockets.QuikSockets - Received transaction for #nu
ll, order #null
[Thread-0] INFO ru.abinet.quiksockets.QuikSockets - Unable to load library 'TRAN
S2QUIK': Can't obtain InputStream for win32-x86-64/TRANS2QUIK.dll
java.lang.UnsatisfiedLinkError: Unable to load library 'TRANS2QUIK': Can't obtai
n InputStream for win32-x86-64/TRANS2QUIK.dll
        at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:271)
        at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
        at com.sun.jna.Library$Handler.<init>(Library.java:147)
        at com.sun.jna.Native.loadLibrary(Native.java:412)
        at org.jtrans2quik.loader.Trans2QuikLibraryLoader.<clinit>(Trans2QuikLib
raryLoader.java:26)

Честно говоря, я таких штук с явой никогда не проделывал. Так как библиотека 32 разрядная, должен ли я ее запускать строго 32-разрядной ява-машиной? Смущает win32-x86-64/TRANS2QUIK.dll - либа лежит прямо в корне. Ее переложить надо?

Enfernuz commented 7 years ago

Так как библиотека 32 разрядная, должен ли я ее запускать строго 32-разрядной ява-машиной?

Да, JRE должна быть 32-битной, т.к. TRANS2QUIK.dll собрана под 32-битную архитектуру, и загрузить её из 64-битной JRE не представляется возможным. Подробнее: https://stackoverflow.com/questions/13448761/running-32-bit-dll-on-64-bit-machine-in-java

Смущает win32-x86-64/TRANS2QUIK.dll - либа лежит прямо в корне. Ее переложить надо?

Судя по документации для com.sun.jna.Native ( http://javadox.com/net.java.dev.jna/jna/3.4.0/com/sun/jna/Native.html -- для версии 3.4.0, но вряд ли в 4.1.0 сделано по-другому), поиск библиотеки с заданным именем будет происходит по разным предопределённым местам, и в случае, если там библиотеки нет, будет поиск по classpath. Собственно, в classpath библиотека и лежит (если, конечно, при запуске java не установлен какой-то другой classpath).

abishai commented 7 years ago

Ага, спасибо. Поставил 32-разрядную яву и переложил в папку в которой он ищет. Заработало. Не поделитесь впечатлениями от работы? Как лучше работать - держать библиотеку слинкованной или при каждой транзакции подключаться и отключаться? Ну и надеюсь, синхронные функции рабочие, мне интереснее сразу получать результат.

Enfernuz commented 7 years ago

Подключаться/отключаться при каждой транзакции точно не стоит. Достаточно один раз загрузить библиотеку и начать работать. При перезапуске приложения ничего не ломается, т.е. можно повторно грузить библиотеку и общаться с терминалом. А вот одновременный доступ из двух приложений вроде бы был невозможен, но точно уже не помню -- проверьте, если интересно :)

В целом, у меня сценарий был таков: получаю обёртку библиотеки (т.е. по сути загружаю .dll), соединяюсь с её помощью с терминалом и шлю транзакции (TRANS2QUIK_SEND_SYNC_TRANSACTION работало прекрасно), пока не надоест.

abishai commented 7 years ago

Мне говорили что невозможен. Собственно, я и пишу сервис, который через сокет бы получал данные откуда угодно :) Будет интереснее проверить, может ли либа работать с несколькими терминалами. Ну, т.е. держать несколько хендлов и в зависимости от того, какая заявка пришла посылать транзакцию в тот или другой терминал.

Enfernuz commented 7 years ago

Собственно, я и пишу сервис, который через сокет бы получал данные откуда угодно :)

Только учтите, что это библиотека для транзакций. Т.е. маркет-дату с помощью неё не получить.

abishai commented 7 years ago

То что получает дату я уже второй год пишу :) И практически в конце пути я обнаружил что не существует метода нормально записать файл из юникса (для которого я и разрабатываю) в винду (это я про файловый обмен). Начал смотреть API и наткнулся на эту библиотеку. Боялся что надо будет С# изучать, да и винду, которая у меня только в виртуалках.

Enfernuz commented 7 years ago

Я ленно-неспешно (очень) разрабатываю сервер на Lua, который будет крутиться на стороне терминала. Связь с сервером будет через ZeroMQ, и сервер этот по сути будет гейтом к qlua API. Соответственно, можно будет соединиться с терминалом в Вашей виртуалке посредством TCP. Ну, я так понимаю, Вы нечто подобное и задумали (общение с терминалом через сеть).

abishai commented 7 years ago

Ага. Но у меня подход чуть другой (интересно, чей лучше). Терминал льет тики в постгрес, а потом через постгресовую шину нотификаций шлет его ИД торговой системе. Приняв тик, из них нарезаются бары, аналитика и стартуют сами торгующие роботы. Все это написано на яве и работает асинхронно-многопоточно и даже переживает ресет. Файлы со сделками я хотел просто выкладывать через самбу, но столкнулся с низкой производительностью. Поэтому, пишу сетевое взаимодействие. Вот, почти написал уже :) Хорошо что Арка такие ленивые, код файлового обмена на 99% годится, так как в АПИ шлется та же строка.