JVM Native API плагин - для запуска в 1С плагинов написанных на Java

29.11.19

Разработка - Разработка внешних компонент

Запускаем виртуальную машину Java в 1С. Собрана внешняя компонента которая позволяет запускать виртуальную машину java в среде 1С. Позволяет как передавать параметры в java - так и получать уведомление через externalevent. Предпосылкой создания являлся тот факт, что есть много готового функционала которого не хватает в 1С. Язык сpp - довольно сложен для быстрой разработки, и теперь возможно использовать готовые сборки java классов (так называемые jar-файлы) для использования в 1С.

Скачать файлы

Наименование Файл Версия Размер
Демо Native api компонента для использования в 1С плагинов написанных на java (Демо режим с ограниченной функциональностью)
.zip 35,68Mb
20
.zip 0.0.7 35,68Mb 20 Скачать
bouncy castle provider
.zip 2,13Mb
12
.zip 2,13Mb 12 Скачать
Native API компонента для использования в 1С плагинов, написанных на Java - без привязки к сертификатам
.zip 225,71Kb
18
.zip 1.2.0 225,71Kb 18 Скачать

Собрана только под Windows и Linux 32-bit и 64-bit!

Компонента позволяет запускать виртуальную машину Java в 1С, загружать необходимые jar – библиотеки, а так же выполнять методы.

GITHUB репозиторий: JVM-plugin

В примере собранный jar-файл с двумя классами:

  1. первый пример вычисляет факториал и выводит в лог строку;
  2. второй пример вычисляет расстояние Левенштейна для двух строк;
  3. загрузка файла - по имени файла возвращает двоичные данные;
  4. "скриншот" - возвращает скриншот экрана в виде двоичных данных.

Также запускались различные библиотеки, эмуляторы и прочее. Проверялась работа в асинхронном режиме.

Ограничения:

  •  Виртуальная машина запускается один раз и может быть запущена только в одном экземпляре;

  • После завершения работы виртуальная машина не может быть повторно запущенна;

  •  Разрядность виртуальной машины должна соответствовать разрядности 1С;

  •  Добавлять jar-файлы после запуска JVM нельзя;

  •  Обновить java классы после запуска JVM нельзя;

  • Возможны проблемы с повторным запуском javafx - приложений.

Для работы необходима установленная JDK 8

  1. Первый параметр JAVA_HOME путь к JDK (32-bit или 64-bit в зависимости от клиента 1С);
  2. Второй так называемый CLASSPATH - путь к jar библиотекам.
  3. Для корректной работы необходимо установить переменную среды: JAVA_HOME

В архиве приложена конфигурация и собранный(подписанный) jar-файл.

Пример работы с компонентой:

Работа в клиент-серверном варианте в СКД:

Написание плагина для Kafka (Simple Consumer)

 

Kafka producer + consumer - параллельно.

 

ВК Java v8 Dev kafka JVM Native api

См. также

Медиадисплей. Рекламный информационный монитор для покупателя.

Разработка внешних компонент POS терминал Рабочее место Розничная торговля Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Управленческий учет Платные (руб)

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    52105    34    69    

43

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

2400 руб.

12.05.2020    26244    131    99    

83

Внешняя компонента для подключения 1С к телефонии Asterisk

Разработка внешних компонент Телефония, SIP Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    44976    117    64    

60

Внешняя компонента печати PDF (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    35081    104    123    

111

Мастер создания внешних компонент 1С (технология COM) для DELPHI 6/7/8/2005/2006/2007/2008/2010/XE/XE2/XE3

Разработка внешних компонент Платформа 1С v8.3 Платные (руб)

Средство для сверхбыстрой разработки внешних компонент 1С:Предприятия 7.7 и 8 по технологии COM на всех версиях DELPHI, начиная с 6.

2000 руб.

28.03.2013    54000    35    14    

68

QR-код с логотипом компании (обычная и управляемая форма)

Разработка внешних компонент Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Как известно, стремление сделать свою рекламную продукцию запоминающейся и выделяющейся — верный путь к успеху. Сегодня, мы поговорим с вами о том, что можно сделать с обычным черно-белым QR-кодом, чтобы он стал более живым и привлекательным. Если вам не терпится попробовать сделать QR-код с логотипом компании, то эта обработка для вас!

2400 руб.

22.06.2016    30840    4    4    

8

Внешняя компонента 1С и С++. Продолжаем разговор.

Разработка внешних компонент Платформа 1С v8.3 Бесплатно (free)

А давайте запилим 8.3.26 до релиза, или оповещение с сервера...

19.02.2024    4039    starik-2005    28    

52

Внешние компоненты 1С и язык C++

Разработка внешних компонент Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Некоторые практические аспекты создания внешних компонент на языке С++ для платформы 1С 8.3++.

26.01.2024    4779    starik-2005    32    

39
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. blackhole321 1303 20.06.18 21:28 Сейчас в теме
А пример кода 1С:Предприятие (типа пример использования) можно добавить в публикацию?
2. minimajack 80 20.06.18 21:59 Сейчас в теме
(1) Компонента находится в стадии разработки
Если ПодключитьВнешнююКомпоненту(имядлл, "AddInNative",ТипВнешнейКомпоненты.Native ) Тогда
	Сообщить("Подключилась!");
	ОбъектJvm = Новый("AddIn.AddInNative.JVMLauncher");
	ОбъектJvm.javaHome = "d:/Program Files (x86)/Java/jdk1.8.0_172/";
	ОбъектJvm.libraryDir = "d:/";
	ОбъектJvm.AddJar("Runner-0.0.1-SNAPSHOT.jar");
КонецЕсли;
Показать

Далее вызываем метод и передаем имя java-класса который будет исполнять работу.
ОбъектJvm.LaunchInJVM("Compare");
ОбъектJvm.LaunchInJVM("Runner");
3. blackhole321 1303 20.06.18 22:21 Сейчас в теме
(2)Спасибо! А параметры?
4. minimajack 80 20.06.18 22:54 Сейчас в теме
(3) Само апи пока не закончено. То есть передавать параметры можно - но в демо примере такого нет.
Разница между 1С и java слишком большая и скорее всего придется подготовить некоторый набор вариантов вызова:
LaunchInJVM - без параметра
LaunchInJVM_S с одним параметром типа строка
LaunchInJVM_SS с двумя параметрами типа строка
5. OLEG4120 162 21.06.18 09:00 Сейчас в теме
7. minimajack 80 21.06.18 10:48 Сейчас в теме
(5) возможность использования многочисленных java библиотек
6. fishca 1254 21.06.18 09:14 Сейчас в теме
Под линухами взлетает?
8. minimajack 80 21.06.18 10:50 Сейчас в теме
(6) пока должным образом не проверял - сейчас апи наладить бы
12. minimajack 80 22.06.18 07:51 Сейчас в теме
(6) Потестил чуть больше - взлетает, по крайней мере виртуальную машину удалось завести (на 32-битах). Думаю проблем особых не будет.
Остальной код надо портировать и проверять
9. minimajack 80 21.06.18 14:21 Сейчас в теме
Обновил пример.
Поправил api - на текущий момент возможно вызывать передавая до 2-х параметров. Эти функции синхронные - то есть 1С ожидает завершения выполнения методов.

ОбъектВК.LaunchInJVM(<ИмяКласса>); - без параметров
ОбъектВК.LaunchInJVMP(<ИмяКласса>,<Параметр>); - с 1-м
ОбъектВК.LaunchInJVMPP(<ИмяКласса>,<Параметр1>,<Параметр2>); - с 2-мя

Типы параметров: строки, числа, булево. На основании типов параметров ищется метод в java ну и вызывается собственно.

Кейсы самые разные: что то вычислять (работает JIT-компилятор, поэтому шустро), создавать дополнительные окна (работает swing, awt) с информацией, чаты, да что угодно в общем то.
10. Infactum 315 21.06.18 15:57 Сейчас в теме
(9) Можно просто XML с параметрами передать. Будет один метод.
11. minimajack 80 21.06.18 16:13 Сейчас в теме
(10) иногда все же удобней хотя бы 2...например передать бинарные данные и строку, все же лучше чем конвертировать в xml, а потом распаковывать в java
13. minimajack 80 22.06.18 13:48 Сейчас в теме
Добавлены функции возвращающие байтики:
CallFInJVMB - без параметров
CallFInJVMBP - с одним параметром
CallFInJVMBPP - с двумя параметрами

Для примера:
CallFInJVMB - ОбъектВК.CallFInJVMB("ScreenShot"); получение скриншота экрана
CallFInJVMBP - ОбъектВК.CallFInJVMBP("GetFile", ПутьКФайлу); чтение файла

Вот такое в java - 2 строки и никакой возни с cpp
 
        Path path = Paths.get( file );
        return Files.readAllBytes( path );
    

Скриншот уложился в 5 строк
        Robot robot = new Robot();
        BufferedImage screenShot = robot.createScreenCapture( new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() ) );
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        ImageIO.write( screenShot, "JPG", buffer );
        return buffer.toByteArray();
    

p.s. Вот и преимущества java - работает из коробки, никаких плюсов (которые с++) и кроссплатформенно
p.s.s. Архив обновлен
14. minimajack 80 22.06.18 16:56 Сейчас в теме
Как повернуть PDF на 90 градусов
tPdf = ПолучитьИмяВременногоФайла("pdf");
		byteData = ОбъектВК.CallFInJVMBP("PDFRotator", ПутьКПДФ); 
		byteData.Записать(tPdf);
		ЗапуститьПриложение(tPdf);


В файлы добавлен bouncy castle provider - который надо распаковать в JAVA_HOME\jre\lib\ext\
Можно скачать самостоятельно
 bcmail-jdk15on-1.47.jar
bcpkix-jdk15on-1.47.jar
bcprov-jdk15on-1.47.jar


Java код
    PdfReader reader = new PdfReader( fileName );
        int n = reader.getNumberOfPages();
        int rot;
        PdfDictionary pageDict;
        for ( int i = 1; i <= n; i++ )
        {
            rot = reader.getPageRotation( i );
            pageDict = reader.getPageN( i );
            pageDict.put( PdfName.ROTATE, new PdfNumber( rot + 90 ) );
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfStamper stamper = new PdfStamper( reader, baos );
        stamper.close();
        reader.close();
        return baos.toByteArray();
Показать
15. virtex3 20 23.06.18 07:31 Сейчас в теме
а как на счет варианта, чтобы компонента работала на linux сервере где и запущен сервер 1С, чтобы пользователи не заморачивались с жавой?
16. minimajack 80 23.06.18 09:31 Сейчас в теме
(15) Под линукс ещё не портировал - да и на сервере не тестил.
Java это не только утилити возможности...
Визуализация полезна: для производства или склада можно отображать 3d модель по нажатию кнопки, отображать графики показателей(оборудования или ещё чего)...
Тот же пдф-повернуть? Зачем кидать на сервер(с сервера) сотни мегабайт, если локально за секунды получим результат?
В общем случае - не важно...есть инструмент, а как им работать каждый решает сам для себя
17. so-quest 140 27.06.18 07:49 Сейчас в теме
Наглый вопрос - Открытый репозиторий у компоненты есть?
19. minimajack 80 27.06.18 09:18 Сейчас в теме
18. Voffka 27.06.18 08:30 Сейчас в теме
20. minimajack 80 27.06.18 13:00 Сейчас в теме
Обновил примеры:
Можно открывать 3d модели(формат obj), вращать, приближать-удалять
21. minimajack 80 27.06.18 14:24 Сейчас в теме
Для всех стесняющихся - добавлено видео
o.nikolaev; +1 Ответить
22. minimajack 80 01.08.18 09:38 Сейчас в теме
Добавлен возврат строк из вызовов, архив обновлен.
Для примера используется распознавание ШК из картинки и возврат ШК в виде строки.
Строка64 = Base64Строка(Новый ДвоичныеДанные(ПутьКИзображениюШК));
Сообщить(ОбъектВК.CallFInJVMP("CodeScanner", Строка64, ""));

в java
   public static String mainInt(String param) throws IOException, NotFoundException
    {
        ByteBufferInputStream is = new ByteBufferInputStream( ByteBuffer.wrap( Base64.decode( param ) ) );
        BufferedImage bufferedImage = ImageIO.read(is);
        LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

        Result result = new MultiFormatReader().decode(bitmap);
        return result.getText();

    }
Показать
o.nikolaev; +1 Ответить
23. haverlon 12 11.12.18 15:09 Сейчас в теме
Вещь интересная, под Linux бы пользовалась спросом)))
24. minimajack 80 11.12.18 15:54 Сейчас в теме
(23) сомневаюсь...доля windows юзеров значительно больше - а спроса нет
25. Evil Beaver 8107 01.01.19 12:24 Сейчас в теме
Правильно ли я понял, что это аналог .NET Bridge для 1С от Elisy, только под Яву?
26. minimajack 80 01.01.19 19:45 Сейчас в теме
Это не полноценный мост...
Изначально позиционируется как замена внешних компонент на c++.
Концепция с созданием классов как в .NET bridge - но в 1с - мне не нравится.
А так написал полноценный код на java -> потестил -> упаковал и все запускается и в 32 и 64 битном режиме без танцев с бубнами.
27. minimajack 80 11.01.19 14:06 Сейчас в теме
Добавлено видео по работе с СКД в клиент-северном варианте.

Использовалась стандартная консоль СКД (разрешен вызов функций из общих модулей) на управляемых формах:
В вычисляемые поля добавлено ВызватьJavaКлиент("CompareDouble", Числа,&Поиск) - что приводит к вызову java функции с передачей параметров и возвратом результатов.

Получаем вычисляемое поле с расстоянием Левенштейна в консоле СКД

p.s. для 12000 строк, вызов функции происходил 36000 раз за 6,38 сек. на сервере

28. minimajack 80 16.01.19 15:50 Сейчас в теме
В публикацию добавлен пример написания простейшего плагина для чтения из Apache Kafka.
o.nikolaev; +1 Ответить
29. minimajack 80 17.01.19 16:10 Сейчас в теме
Архив обновлен, вместе с получателем добавлен демо-издатель Kafka.
Прежде чем тыкать в Кафку, необходимо запустить зукипер и кафка-сервер, иначе будете ждать подключения...

По нажатию на "Send to Kafka" - будет отправлено 10 000 пронумерованых сообщений на сервере (асинхронно). При ожиданиях между отправкой более 10 секунд издатель отправляет сообщение "Producer closed" и закрывается

По нажатию на "Load from Kafka" - будет получено либо 500 сообщений с начала партиции (если пустое поле данных), либо произойдет ожидание 5 секунд для получения данных.

Оба и издатель и подписчик обмениваются данными через топик "testTopic"
Перформанс:
1С + java - 3696 сообщений/сек
Вызов без 1С на java - 36554 сообщений/сек
Прикрепленные файлы:
o.nikolaev; +1 Ответить
39. o.nikolaev 211 17.11.19 14:42 Сейчас в теме
(29) На видео у вас в обработке еще нет команды Send to Kafka. Но в cf-ке в публикации уже есть. В файловом варианте, чтобы добиться выполнения команды send to немножко исправил текст команды:
&НаКлиенте
Процедура SendToKafka(Команда)
	//SendToKafkaНаСервере();
	Для нумератор=1 По 20000 Цикл
		ОбъектВК.CallFInJVMPP("KafkaExampleProducer",Строка(нумератор),Строка(нумератор), 1);
	КонецЦикла;
КонецПроцедуры
Показать


Подскажите, не по этому (https://dzone.com/articles/running-apache-kafka-on-windows-os) примеру все настраивали? :)
40. o.nikolaev 211 17.11.19 14:45 Сейчас в теме
(29) Все отлично работает. Спасибо!
Прикрепленные файлы:
30. minimajack 80 18.01.19 16:43 Сейчас в теме
Путем нехитрых манипуляций удалось ускорить издателя до 8-10 тысяч сообщений в секунду.
p.s. Архив обновлен
p.p.s. К сожалению количество сообщений пришлось увеличивать до 20 тысяч что бы замерить скорость...так что жать кнопку "Load from Kafka" придется в два раза больше
31. o.nikolaev 211 29.10.19 11:03 Сейчас в теме
Очень круто. А какой-то полноценный стабильный релиз, который в проде можно использовать, есть?
32. minimajack 80 31.10.19 22:30 Сейчас в теме
(31) в проде не использовал, но сомневаюсь что могут быть какие то серьезные проблемы.
Планировал выложить в опенсорс, но надо причесать исходники. А на это надо найти время.
33. o.nikolaev 211 31.10.19 23:03 Сейчас в теме
(32) А может ну его - причесывание - и выложить как есть :) ? Уж очень завораживающая вещь получилась. Просто думаю нашлись бы люди которые занялись и причесыванием и развитием.
34. minimajack 80 01.11.19 22:41 Сейчас в теме
(33) я не первый раз выкладываю...что то энтузиастов не находилось.
По факту мне надо убрать код проверки сертификата для паблика.
35. o.nikolaev 211 16.11.19 21:47 Сейчас в теме
(34) Так. Нет времени объяснять :) Что я могу сделать чтобы вы выложили исходники в public ? :)
36. o.nikolaev 211 16.11.19 23:36 Сейчас в теме
Не получается воспроизвести примеры. Выдается сообщение "JVMLauncher : Cannot find class.". Можете подсказать что не так делаю?
37. o.nikolaev 211 17.11.19 00:03 Сейчас в теме
(36) Отвечаю сам же. Подключил папку subst-ом как диск d:\ и положил в нее Runner-0.0.1-SNAPSHOT.jar
После этого пример заработал :)
38. minimajack 80 17.11.19 09:54 Сейчас в теме
Все верно. jar файлы загружаются из classpass(library dir)
Исходники надо очистить от сертификата. Если все срочно - напишите в личку, соберу индивидуально
41. o.nikolaev 211 17.11.19 14:54 Сейчас в теме
Ну и исходники Runner-0.0.1-SNAPSHOT.jar было бы бесценно скачать за SM вместе с выложенным примером. :) Подхватить-то удается конечно, но жалуется что Source not found :)
Прикрепленные файлы:
42. o.nikolaev 211 17.11.19 15:01 Сейчас в теме
Глупый вопрос - а зачем подписывать jar файлы?
43. minimajack 80 17.11.19 16:46 Сейчас в теме
(42) затем, что демокомпонента проверяет подпись и не дает выполнить неподписанный код.
Практически все исходники есть тут в качестве комментариев. Да и в любой ide можно глянуть...ничего там нет секретного)
44. o.nikolaev 211 17.11.19 20:51 Сейчас в теме
Еще вопрос - а предполагается развитие API? Чтобы все-таки можно было вызывать public методы java согласно их сигнатур? Еще вопрос: если, например в пакете в классе есть метод который возвращает значение типа другого класса, то можно ли помещать такое значение в переменную кода 1С и затем передавать в качестве параметра другому методу java-класса? Понимаю что можно это обойти создав, например void метод-обертку, который будет выполнять эту же операцию в самом java классе, но все-таки. Есть какие-то планы на этот счет?
45. minimajack 80 17.11.19 22:55 Сейчас в теме
Не вижу никакого смысла в вызове...ни скорости ни удобства.
Апи планируется править, но точно не в эту сторону.
Более рационально использовать как дополнение к native api - когда весь код заранее можно протестировать, а в 1с уже полноценно использовать
46. minimajack 80 18.11.19 09:15 Сейчас в теме
Добрался до компа...
Просто создавая объекты java, вызывая методы мы теряем во всем.

По сути вы хотите тот же Elisy.Net Bridge только на java.
плюсы:
- не надо собирать jar файлы
- можно писать код типа на java
минусы:
- в 99% случаев все равно потребуются какие то библиотеки, и одно дело когда мы собираем так называемый UberJar - со всем вместе( а там и включаем свои классы), другое что нам придется прописывать все jar файлы ручками и следить за их версиями...
- не возможно полноценное тестирование перед заливкой в 1С - юнит тесты и прочее проще организовать в java, а там и гит и все остальное из коробки.
- сами себе режем производительность: interop вызовы не бесплатны, чем реже прыгать java -> 1C -> java и т.п. тем выше скорость решения
- теряем в функциональности java - многие конструкции станут недоступны: try-with-resources, multicatch, case и т.п. это как вернутся в каменный век :)
48. o.nikolaev 211 18.11.19 22:18 Сейчас в теме
(46) :) Да, ступил. Это я уже потом и сам сообразил. Не столь развернуто правда :)
47. minimajack 80 18.11.19 10:20 Сейчас в теме
https://gist.github.com/MinimaJack/8573b375a1f5121a06e5b03c53c6f6aa
KafkaExampleProducer.java
предпосылки:
1. демо пример
2. получить максимум производительности за минимально затраченное время на разработку

Когда происходит вызов 1С, никакой отправки на самом деле не происходит, вместо этого:
при каждом вызове проверяется java-поток на наличие, и если его нет происходит запуск
при каждом вызове в очередь сообщений кладется сообщение

Java-поток берет на себя обязательства по отправке сообщений, опустошает очередь отсылая сообщения, при отсутствии 10 сек сообщений отключается

p.s. код написан на коленке, скорее всего с ошибками, не безопасен, но работает очень шустро. По идее подобный код можно использовать для логирования событий, когда незначительную часть сообщений можно потерять.
p.p.s На деле довольно таки стабильно отсылал сообщения. В прод не рекомендовал бы...но в свое время не выложил текст.
49. o.nikolaev 211 18.11.19 22:20 Сейчас в теме
(47) У меня ситуация такая что есть уже готовый профессиональный и отлаженный блок на Java для взаимодействия с Kafka и встала задача дотянуться до него из 1С-ки. Будем пробовать окучить сие с помощью компоненты.
50. minimajack 80 29.11.19 14:50 Сейчас в теме
Исходники доступны всем желающим

https://github.com/MinimaJack/JVM-plugin
yukon; dvsidelnikov; Labotamy; +3 Ответить
51. minimajack 80 03.12.19 16:30 Сейчас в теме
Существующий пример Kafka-получателя имел существенный недостаток.
При каждом получении данных происходило подключение и отключение к кафке, что вызывало дополнительные задержки связанные как с сетевым взаимодействием так и с ребалансировкой группы получателей.
Решение такое же простое как и с отправителем -> запускаем поток который будет закрывать получателя после продолжительного интервала.
Записал видео где два 1С клиента успешно общаются...
https://www.youtube.com/watch?v=jMl66aurQeI

Скорость конечно не супер, но 80001 сообщение со скоростью 2600 сообщений/сек доставлено(в видио есть вывод статистики по отправителю).

Проверил в асинхронном режиме...вполне себе удобно.
		оповещение = Новый ОписаниеОповещения("ЗавершитьПолучениеВсехДанных", ЭтотОбъект, "", "ЗавершитьПолучениеДанныхОшибка", ЭтотОбъект);
		ОбъектВК.НачатьВызовCallFInJVMPP(оповещение, "kafka.Consumer", 5, ПустаяСтрока(KafkaData), "");

Да, и теперь классы можно адекватно раскладывать по пакетам...kafka.Consumer, kafka.Producer, kafka.ProducerMetrics
o.nikolaev; +1 Ответить
52. o.nikolaev 211 06.12.19 06:12 Сейчас в теме
(51) А Kafka разве сама (сам) не отслеживает активность consumer-ов? Т.е. там если не хочешь влететь в ребалансировку надо непрерывно опрашивать. Ну дык на то она и "потоковая работа с данными" как я понимаю.
53. minimajack 80 06.12.19 09:42 Сейчас в теме
(52) JVM - живет столько сколько живет процесс rphost

Kafka выкинет только если heartbeat - перестанет поступать...а что ему не поступать если Consumer так и останется запущенным и будет отправлять heartbeat.

например:
у нас 2 rphost-а(2 сервера или 2 процесса):
на rphost#1 запустилось регламентное задание, запустился consumer#1, стал лидером - получил сообщения и ждет еще вызова из 1С...но в 1С регламентное задание завершилось. Неважно по какой причине...получены все сообщения или только определенный batch(1000 сообщений и хватит). JVM - продолжает работать, consumer#1 все так же сидит в лидерах и ждет от 1С приказов.

на rphost#2 запускается регламентное задание, запустился consumer#2 ( другой процесс, другая JVM) и ждет пока станет лидером...и тут вопрос в kafke - когда и вообще сделает ли она ребалансировку consumer-ов так, что бы consumer#2 стал лидером и начал получать сообщения для регламентного задания на rphost#2.


Решения два:
1. со стороны 1C - закрывать consumer при завершении регламентного задания.
минусы:
если регламентное задание отрабатывает маленькими пачками и часто, будут переподключения к кафке и создания новых consumer-ов
плюсы
железно подключаемся одним consumer-ом
2. со стороны java - закрывать consumer в другом потоке по истечении какого то интервала со времени последнего вызова.
минусы:
надо подбирать интервал согласно скорости обработки, если он будет меньше скорости обработки - consumer-ы переподключатся.
Например 1С обрабатывает пачку за 10 секунд - можно поставить интервал в java 15 секунд(с последнего вызова). Если 1С затупит - старый закроется , создастся новый Consumer - совершенно без дополнительных телодвижений.
плюсы
если регламентное задание запускается чаще интервала, consumer будет переиспользоваться.
54. kickout 20 10.12.19 09:04 Сейчас в теме
Скачал либы, начал тестить, и есть несколько моментов. (64 разрядка)
Небольшой итог по тому в чем удалось разобраться и чего тут не описано.
1) в классе в яве который подключаем должен быть публичный статик метод(функция) mainInt()
2) не удалось запустить не подписанный jar файл
3)при попытке передать параметры говорит что "много фактических параметров"
4) подписать jar файл пока не удалось

Что пробовал делать я
1) Создал хелоу ворлд свой на яве, вывел в отдельный класс, пишет что класс не найден.
2) с прилоденным архивом пока тоже не получилось пораьотать, выходит ошибка но уже говорит "mainInt" т.е. класс находит, наверно дело в подписи jar файла

Что делаю не так и какие еще есть нюансы использования dll?
Качал последний архив, самый свежий.
55. minimajack 80 10.12.19 10:51 Сейчас в теме
LaunchInJVM* - вызов процедур, первый параметр имя класса

LaunchInJVM - без параметров                   => void mainInt()                                =>  VK.LaunchInJVM   ( ИМЯ_КЛАССА)
LaunchInJVMP - процедура с одним параметром    => void mainInt(int param)                       =>  VK.LaunchInJVMP  ( ИМЯ_КЛАССА, Параметр1)
LaunchInJVMPP - процедура с 2-мя параметрами   => void mainInt(int param, int param2)           =>  VK.LaunchInJVMPP ( ИМЯ_КЛАССА, Параметр1, Параметр2)


CallFInJVM* - вызов функций, первый параметр имя класса, от типа последнего параметра зависит возвращаемое значение:
VK.CallFInJVM("JavaClass", 1) =>
public static int mainInt()    {
    }

VK.CallFInJVMP("JavaClass", 1, "") =>
public static String mainInt(int param)    {
    }

VK.CallFInJVMPP("JavaClass", 1,0.5, "") =>
public static String mainInt(int param, float param2)    {
    }

CallFInJVM    - функция без параметров         => int mainInt()                                 =>  VK.CallFInJVM      ( ИМЯ_КЛАССА, 1)
CallFInJVMP   - функция с одним параметров     => int mainInt(int param)                        =>  VK.CallFInJVMP     ( ИМЯ_КЛАССА, Параметр1, 1)
CallFInJVMPP  - функция с 2-мя параметрами     => int mainInt(int param,int param2)             =>  VK.CallFInJVMPP    ( ИМЯ_КЛАССА, Параметр1, Параметр2, 1)
CallFInJVMPPP - функция с 3-мя параметрами     => int mainInt(int param,int param2,int param3)  =>  VK.CallFInJVMPPP   ( ИМЯ_КЛАССА, Параметр1, Параметр2, Параметр3, 1)


ОбъектВК.CallFInJVMPP("CompareDouble",Строка1,Строка2,0.01)

	ОбъектВК = JVM_ПовтИсп.ВернутьКомпонентJava();
	ОбъектВК.libraryDir = "блабла"; // путь к Jar-ам по умолчанию d:/
	ОбъектВК.AddJar("Runner-0.0.1-SNAPSHOT.jar"); // используемый jar 


Код 1С:
ОбъектВК.LaunchInJVMP("factorial.Get", Число); 

Код Java:

public class Get
{

    private native void log( String info );

    public static void mainInt(int number)
    {

        Get r = new Get();
        r.log( new String( "Привет из джава! Object hash is " + r.hashCode() ) );

        BigInteger result = null;
        for ( int i = 0; i < 1; i++ )
        {
            result = BigInteger.valueOf( 1 );

            for ( long factor = 2; factor <= number; factor++ )
            {
                result = result.multiply( BigInteger.valueOf( factor ) );
            }
        }

        r.log(result.toString());
    }

}
Показать
Прикрепленные файлы:
native.zip
jvmcf.cf
Runner-0.0.1-SNAPSHOT.jar
56. kickout 20 10.12.19 11:10 Сейчас в теме
(55)
LaunchInJVMP

Во... чуть стало понятнее, как вызывать с параметрами и без, но у меня теперь вот такая штука выходит
Так я подключаюсь.
&НаКлиенте
Процедура test(Команда)
	имядлл = "C:\testNativeJVM\JVMLauncher64.dll";
	Если ПодключитьВнешнююКомпоненту(имядлл, "AddInNative",ТипВнешнейКомпоненты.Native ) Тогда
		Сообщить("Подключилась!");
		ОбъектJvm = Новый("AddIn.AddInNative.JVMLauncher");
		ОбъектJvm.javaHome = "C:\Program Files\Java\jdk1.8.0_162\";
		ОбъектJvm.libraryDir = "C:\testNativeJVM\";
		ОбъектJvm.AddJar("1cjvm.jar");
		ОбъектJvm.LaunchInJVMP("Testc",456);
	КонецЕсли
КонецПроцедуры
Показать

57. kickout 20 10.12.19 11:24 Сейчас в теме
(56)
Всё получилось, была путаница с методами, теперь вроде всё понял.
Будем дальше тестить и что то изобретать))))
Спасибо, за пояснения.
Было бы классно если бы в публикацию добавили про вызов процедур и функций явы через 1с, а то путаница идет.
И последний вопрос, как много можно передавать параметров?
Поддерживаются только примитивные типы? (про массив и структуры пока можно мечтать или даже мечтание не поможет?))))
58. minimajack 80 10.12.19 11:58 Сейчас в теме
(57)
В функцию можно до 4-х параметров, в процедуру можно до 2-х...
Возможно увеличить если будет необходимость
Ни массивы, ни структуры - сама 1С не даст отправить...точно работают строки, числа (int ,float, double)
Возможен только возврат массива байт в Бинарные данные:
CallFInJVMB  - byte[] mainInt()  
CallFInJVMBP - byte[] mainInt(param)  


Все остальное только через сериализацию ЗначениеВСтрокуВнутр...
59. kickout 20 10.12.19 12:14 Сейчас в теме
(58)
Дополню одной идеей, не знаю насколько это профитно,но...
Как мне кажется удобнее будет переделать вызов класса и метода примерно вот так (Runner.getAll, , )
т.е. пишется класс, а потом через точку метод который необходимо вызвать, чтобы не привязываться исключительно к mainInt
ну или как то по другому реализовать, но суть в том чтобы можно было явно указать метод который необходимо выполнить, ну и через запятую параметры для метода.
вдруг в классе будет 2 и более метода которые можно выполнить, а то получается одна точка входа, а тут уже появляется выбор...
да и городить тогда классы под каждый метод не надо будет.
60. minimajack 80 10.12.19 13:08 Сейчас в теме
(59) идея нормальная...
Возможно реализовать альтернативным апи: ClassFunctionCall, ClassFunctionCallP,ClassFunctionCallPP
По сути надо стандартизировать апи, а то сейчас есть разброс в именовании...

Проще отправлять прямиком предложения в репо: https://github.com/MinimaJack/JVM-plugin/issues
61. minimajack 80 11.12.19 16:54 Сейчас в теме
(59) Добавлено
Вызовы эквивалентны
		ОбъектВК.CallFInJVM("time.utils.Current", '00010101'));
		ОбъектВК.ClassFunctionCall("time.utils.Current.mainInt", '00010101'));


time.utils - package
Current - class
mainInt - имя метода

Тип Даты работает и в параметрах и в возвращаемом результате, с учетом адекватности на вхождение в unixtime интервал.
Прикрепленные файлы:
native.zip
62. kickout 20 12.12.19 10:02 Сейчас в теме
(61)
Огонь,а есть аналогичное для процедуры?
63. minimajack 80 27.01.20 10:46 Сейчас в теме
(62) Добавил
ОбъектВК.LaunchInJVMPP("graphics.ViewObjModel",~,~);
ОбъектВК.ClassProcedureCallPP("graphics.ViewObjModel.mainInt",~,~);

Добавлена поддержка запуска на 11+ java
64. Simplyare 14.04.20 23:51 Сейчас в теме
Не работают функции "Расстояние Левинштейна" и "Повернуть PDF".
При попытке повернуть pdf вываливается ошибка:

{Обработка.ТестированиеJVM.Форма.УправляемаяФорма.Форма(98)}: Ошибка при вызове метода контекста (CallFInJVMBP)
byteData = ОбъектВК.CallFInJVMBP("PDFRotator", ПутьКПДФ);
по причине:
Ошибка внешней компоненты

С чем может быть связано?
Другие функции работают корректно.
65. minimajack 80 16.04.20 06:42 Сейчас в теме
PDFRotator - для него надо обязательно добавить bouncy castle provider. В 14 сообщении описание.
bcmail-jdk15on-1.47.jar
bcpkix-jdk15on-1.47.jar
bcprov-jdk15on-1.47.jar
66. Vix 28 25.04.20 17:06 Сейчас в теме
Интересная идея, плюсую однозначно. Есть желание вот написать плагин который будет фотографировать и изображение сохранять в файл, интересно получится или нет такое сделать через это решение?
67. minimajack 80 28.04.20 01:11 Сейчас в теме
Это же только для десктопа. Возможно использовать вебкамеру, но сам не использовал
https://github.com/sarxos/webcam-capture
68. Ruler 83 07.08.20 16:20 Сейчас в теме
1. Добрый день, подскажите есть ли у вас планы написать немного документации? Хотя бы простое описание api, пошаговый пример простейшего плагина? Видео здорово, но в дополнение к тексту как демонстрация, что инструкция или гайд рабочие. Я к сожалению видимо слишком туп, и у меня не получилось сделать свой плагин...
3.Поясните, чем опасно
"Виртуальная машина запускается один раз и может быть запущена только в одном экземпляре;" -
- это относиться к одному сеансу 1С, одному сеансу пользователя или к чему?

Думаю, что у многих есть интерес, но натыкаясь на отсутствие документации, неочевидность шагов по созданию плагинов, желание тратить время пропадает...
69. minimajack 80 14.08.20 14:49 Сейчас в теме
(68) извиняюсь...пропустил коммент

1. Постараюсь в свободное время, по крайней мере выложу на гит пример компоненты
3. Если виртуальная машина запускается на один "процесс операционной системы", неважно это клиент или сервер...

Ок, постараюсь исправить эти моменты
70. comol 5051 22.09.20 12:53 Сейчас в теме
Просто отмечуь здесь что бэээ.... Для чего нужно - ХЗ:
1) Клиентские истории - используйте JS внутри WebKit - не надо этого всего... и 3D можно нарисовать через WebGL и просто порисовать через canvas и svg animation можно. И ничего подключать не надо

2) Серверные - ну тут вообще компонента это странная история - поднимаем микросервис на чём угодно и общаемся с ним через http интерфейс

Ну если уж очень хочется серверную компоненту и у вас там "C:\Program files"... юзайте .net - там ничего не надо ставить и прописывать. Обёртка уже испытанная временем и на инфостарте валяется давно.
73. Shmell 533 18.01.21 07:06 Сейчас в теме
(70)
порисовать через canvas и svg animation можно. И ничего подключать не надо

2) Серверные - ну тут вообще компонента это странная история - поднимаем микросервис на чём угодно и общаемся с ним через http интерфейс

Ну если уж очень хочется серверную компоненту и у вас там "C:\Program files"... юзайте .net - там ничего не надо ставить и прописывать. Обёртка уже испытанная време


Допустим, для кейсов с kafka использование restproxy или поднятие отдельного http сервиса - не очень производительное, но вполне рабочее решение, покрывающее большинство потребностей бизнеса. Но все таки для передачи множества сообщений решение (over 1 k/sec) предложенное minimajack вполне так...
71. minimajack 80 22.09.20 14:58 Сейчас в теме
(70) Если у вас стойкое отвращение JVM и вы не знаете для чего и зачем это нужно - можете проходить мимо.
72. comol 5051 22.09.20 17:01 Сейчас в теме
(71) мысль верная последовательность не та. Я очень хорошо знаю что такое JVM, поэтому у меня к нему стойкое отвращение.... И поэтому не могу пройти мимо когда ее куда то пихают не понимая зачем
74. nicxxx 254 16.01.22 19:19 Сейчас в теме
(24) Прошло 3 года. Доля юзеров под Linux не могла не вырасти :)
Или, например, мой кейс - тестовая и девелоп среда на Ubuntu, прод - на Windows.
75. minimajack 80 26.06.22 20:45 Сейчас в теме
Свободное время нынче дорого :-)

Прикрепил файл архивом компоненты: win, lin x32,64

К сожалению на линуксе не все примеры работают...времени на разбор полетов нет =)
попытка снятия скриншота приводит к зависанию и 3д графика не работает по другим причинам...
http сервис, факториал, расстояние левенштейна, GUI , распознование ШК работают
Прикрепленные файлы:
native.zip
Оставьте свое сообщение