powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Бобина 4.1.0
95 сообщений из 95, показаны все 4 страниц
Бобина 4.1.0
    #39989925
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую, Уважаемые Господа.

Вышла новая версия Бобины:

- Обновлённый сайт
- Обновлённая документация
- Ещё более лёгкая и компактная настройка

https://github.com/INFINITE-TECHNOLOGY/BOBBIN

Документация

Рекомендую к ознакомлению и опробыванию.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39989944
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras

Вышла новая версия Бобины:


Груви ещё там- значит в игнор.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39989951
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin
dakeiras

Вышла новая версия Бобины:


Груви ещё там- значит в игнор.

С моей стороны аналогично про все проекты на Котлине.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39989953
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin
dakeiras

Вышла новая версия Бобины:


Груви ещё там- значит в игнор.

А слабо себя пересилить и попробовать Бобину 1 раз? Или страшно, что вдруг понравится?:)
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39989970
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79
груви конечно редкостная помойка,которая с трудом поддается здравому смыслу)

фейспалм. Без комментариев.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990010
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
А слабо себя пересилить и попробовать Бобину 1 раз? Или страшно, что вдруг понравится?:)
Я пробовал - ничего хорошего не вышло: брат умер.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990018
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
dakeiras
А слабо себя пересилить и попробовать Бобину 1 раз? Или страшно, что вдруг понравится?:)
Я пробовал - ничего хорошего не вышло: брат умер.

Можете ещё раз попробовать пожалуйста? Все недочёты исправлены.

Вот примеры конфигов:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
destinations:
  - name: io.infinite.bobbin.config.ConsoleDestinationConfig
    levels: [warn, error, info]
  - name: io.infinite.bobbin.config.FileDestinationConfig
    packages: [io.infinite]
    fileName: ("./LOGS/INFINITE/${className}/${level}/${className}_${level}_${date}.log")
  - name: io.infinite.bobbin.config.FileDestinationConfig
    fileName: ("./LOGS/PACKAGES/${className}/${level}/${className}_${level}_${date}.log")
    format: dateTime + '|' + level + '|' + threadName + '|' + className + '|' + message



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
destinations:
  - name: io.infinite.bobbin.config.ConsoleDestinationConfig
    formatThrowable: "%format% + delimiter + throwable"
    levels: [warn, error, info]
  - name: io.infinite.bobbin.config.FileDestinationConfig
    levels: [warn]
    fileName: ("./LOGS/WARNINGS_${date}.log")
  - name: io.infinite.bobbin.config.FileDestinationConfig
    levels: [error]
    fileName: ("./LOGS/ERRORS_${date}.log")
  - name: io.infinite.bobbin.config.FileDestinationConfig
    packages: [org.springframework.web]
    fileName: ("./LOGS/SPRING_WEB/SPRING_WEB_${date}.log")



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
levels: [info, warn, error, debug]
destinations:
  - name: io.infinite.bobbin.config.ConsoleDestinationConfig
    packages: [com.acme.logstash]
    dateTimeFormat: "yyyy-MM-dd'T'HH:mm:ss:SSSZ"
    lineBreak: ",\r\n"
    formatArgs: |-
      """{
        "@timestamp": "$dateTime",
        "@version": "1",
        "message": "$message",
        "logger_name": "$className",
        "thread_name": "$threadName",
        "level": "$level",
        "username": "${args[0]}",
        "URI": "${args[1]}",
        "sessionId": "${args[2]}",
        "transactionId": "${args[3]}",
        "instanceId": "${MDC.get('instanceUUID')}"
      }"""



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
format: dateTime + delimiter + MDC.get("instanceUUID") + delimiter + level + delimiter + threadName + delimiter + className + delimiter + message
destinations:
  - name: io.infinite.bobbin.config.ConsoleDestinationConfig
    formatThrowable: "%format% + delimiter + throwable"
    levels: [warn, error, info]
  - name: io.infinite.bobbin.config.FileDestinationConfig
    levels: [warn]
    fileName: ("./LOGS/WARNINGS_${date}.log")
  - name: io.infinite.bobbin.config.FileDestinationConfig
    levels: [error]
    fileName: ("./LOGS/ERRORS_${date}.log")
  - name: io.infinite.bobbin.config.FileDestinationConfig
    packages: [org.springframework.web]
    fileName: ("./LOGS/SPRING_WEB/SPRING_WEB_${date}.log")
  - name: io.infinite.bobbin.config.FileDestinationConfig
    packages: [io.infinite]
    fileName: ("./LOGS/THREADS/${threadGroupName}/${threadName}/${threadName}_${date}.log")
  - name: io.infinite.bobbin.config.FileDestinationConfig
    packages: [conf.plugins.output]
    fileName: ("./LOGS/PLUGINS/OUTPUT/${className}/${className}_${date}.log")
  - name: io.infinite.bobbin.config.FileDestinationConfig
    packages: [conf.plugins.input]
    fileName: ("./LOGS/PLUGINS/INPUT/${className}/${className}_${date}.log")
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990051
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По code-review. А зачем это так сделано?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
abstract class BobbinEngine {

....

    String getThreadName() {
        return Thread.currentThread().name
    }

    String getThreadGroupName() {
        return Thread.currentThread().getThreadGroup().name
    }
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990052
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
mayton@ryzen-ssd:/storage/git.java/BOBBIN$ gradle build
Starting a Gradle Daemon, 1 incompatible and 1 stopped Daemons could not be reused, use --status for details

FAILURE: Build failed with an exception.

* Where:
Build file '/storage/git.java/BOBBIN/build.gradle' line: 8

* What went wrong:
An exception occurred applying plugin request [id: 'groovy']
> Failed to apply plugin [class 'org.gradle.api.plugins.JavaPlugin']
   > Cannot change attributes of dependency configuration ':compileClasspath' after it has been resolved

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org



Хм... пока вот как-то так.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990053
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот баннер со сборщика. На всякий случай.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
mayton@ryzen-ssd:/storage/git.java/BOBBIN$ gradle --version

------------------------------------------------------------
Gradle 6.5.1
------------------------------------------------------------

Build time:   2020-06-30 06:32:47 UTC
Revision:     66bc713f7169626a7f0134bf452abde51550ea0a

Kotlin:       1.3.72
Groovy:       2.5.11
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          11.0.8 (Ubuntu 11.0.8+10-post-Ubuntu-0ubuntu118.04.1)
OS:           Linux 5.4.0-42-generic amd64
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990059
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
По code-review. А зачем это так сделано?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
abstract class BobbinEngine {

....

    String getThreadName() {
        return Thread.currentThread().name
    }

    String getThreadGroupName() {
        return Thread.currentThread().getThreadGroup().name
    }



Это чтобы можно было использовать филды threadName и threadGroupName в конфиге, например:

Код: sql
1.
format: dateTime + delimiter + level + delimiter + threadName + delimiter + className + delimiter + message



По ошибке сейчас смотрю, спасибо!
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990060
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras, перенеси их куда-нибудь. В ThreadUtils например. Чтоб была какая-то видимость Single-Resp.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990062
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
dakeiras, перенеси их куда-нибудь. В ThreadUtils например. Чтоб была какая-то видимость Single-Resp.

Это класс BobbinEngine, он содержит в себе доп. контекст логгера во время его работы.

Чтобы был доступ к этим полям из конфига (в скриптовом выражении), например MDC там же:

Код: java
1.
2.
3.
    Class<org.slf4j.MDC> getMDC() {//keep full qualified reference for MDC getter shortcut
        return org.slf4j.MDC
    }
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990064
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Вот баннер со сборщика. На всякий случай.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
mayton@ryzen-ssd:/storage/git.java/BOBBIN$ gradle --version

------------------------------------------------------------
Gradle 6.5.1
------------------------------------------------------------

Build time:   2020-06-30 06:32:47 UTC
Revision:     66bc713f7169626a7f0134bf452abde51550ea0a

Kotlin:       1.3.72
Groovy:       2.5.11
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          11.0.8 (Ubuntu 11.0.8+10-post-Ubuntu-0ubuntu118.04.1)
OS:           Linux 5.4.0-42-generic amd64



Поставь плиз такую настройку (картинка ниже). Этот билд файл пока не поддерживает Gradle 6.

(Это на самом деле рекомендуемая настройка, и зря вообще Jet Brains наворотили - Gradle по природе должен через враппер работать)
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990067
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже лучше так (иначе он не скачает даже Gradle 5).

Это уже Gradle наворотил (надо же было додуматься сделать даже Wrapper task не обратно совместимым.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990069
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras, зачем мне среда? Я не хочу в среде собирать.

Я хочу собрать твой проект как делает CI/CD. Или где-то должна быть у тебя инструкция по сборке.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990070
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras


Поставь плиз такую настройку (картинка ниже). Этот билд файл пока не поддерживает Gradle 6.


Вот-вот бобина ворвётся в Энтерпрайз :)
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990071
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
dakeiras, зачем мне среда? Я не хочу в среде собирать.

Я хочу собрать твой проект как делает CI/CD. Или где-то должна быть у тебя инструкция по сборке.

Тогда надо запускать
Код: java
1.
gradlew build
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990073
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник
dakeiras


Поставь плиз такую настройку (картинка ниже). Этот билд файл пока не поддерживает Gradle 6.


Вот-вот бобина ворвётся в Энтерпрайз :)


Поясню для недопонимающих. Это билд Бобины из исходников. Его не нужно делать конечному пользователю.
Т.к. Бобина распространяется через JCenter.

Mayton запустил для изучения просто его. (спасибо ещё раз кстати - обсуждение пошло :))

Этот билд работает с конкретной привязкой к версии Gradle (как и все Gradle проекты). В этом случае к Gradle 5.x.

Сама Бобина не привязана к средствам сборки (maven, gradle любых версий) - поддерживаются любые pom сборщики.

Вот тут инструкция по использованию самой Бобины:

https://github.com/INFINITE-TECHNOLOGY/BOBBIN/wiki/3---Usage
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990077
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
mayton
dakeiras, зачем мне среда? Я не хочу в среде собирать.

Я хочу собрать твой проект как делает CI/CD. Или где-то должна быть у тебя инструкция по сборке.

Тогда надо запускать
Код: java
1.
gradlew build


Так ты должен этот враппер подложить. Это - твоя задача.

Вот есть у меня проект apache calcite. Не мой. Просто скачал для изучения. В нем разрабочики услужливо подложили его. Видишь как?
Как в луччших домах Европы. И ты постарайся.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
mayton@ryzen-ssd:/storage/git.java/calcite$ ls gradle* -lF
-rw-r--r-- 1 mayton mayton 4451 Aug 15 17:09 gradle.properties
-rwxr-xr-x 1 mayton mayton 5764 Aug 15 17:09 gradlew*
-rw-r--r-- 1 mayton mayton 3056 Aug 15 17:09 gradlew.bat

gradle:
total 0
drwxr-xr-x 1 mayton mayton 86 Aug 15 17:09 wrapper/



 mayton@ryzen-ssd:/storage/git.java/calcite$ ./gradlew
Downloading https://services.gradle.org/distributions/gradle-6.3-all.zip
.............10%..............20%..............30%..............40%..............50%..............60%.............70%..............80%..............90%..............100%
Starting a Gradle Daemon, 3 incompatible and 1 stopped Daemons could not be reused, use --status for details
locking FileBasedConfig[/home/mayton/.config/jgit/config] failed after 5 retries

> Configure project :
Building Apache Calcite 1.25.0-SNAPSHOT

> Task :help

Welcome to Gradle 6.3.

To run a build, run gradlew <task> ...

To see a list of available tasks, run gradlew tasks

To see a list of command-line options, run gradlew --help

To see more detail about a task, run gradlew help --task <task>

For troubleshooting, visit https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 2m 59s
1 actionable task: 1 executed
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990078
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras

Этот билд работает с конкретной привязкой к версии Gradle (как и все Gradle проекты). В этом случае к Gradle 5.x.

Стоп-стоп. Подожди. Я работал с gradle на других прокетах с Амазоном. И у нас нигде не было требования
по версии сборщика. У нас была совместимость с диапазоном релизов Gradle и все нормас собиралось.

То что ты говоришь - это какая-то ерунда. Нет нигде жесткой привязки. Есть привязки
к версиям dependencies. Но сборщик - либерален. Для целого диапазона версий.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990079
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
забыл ник
пропущено...

Вот-вот бобина ворвётся в Энтерпрайз :)


Поясню для недопонимающих. Это билд Бобины из исходников. Его не нужно делать конечному пользователю.
Т.к. Бобина распространяется через JCenter.

Вообще ничего не понял. Ты топик создал ЗАЧЕМ?

Чтоб мы попробовали твое изделие. А как его попробовать когда стандартные сценарии сборки не работают?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990080
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
dakeiras
пропущено...


Поясню для недопонимающих. Это билд Бобины из исходников. Его не нужно делать конечному пользователю.
Т.к. Бобина распространяется через JCenter.

Вообще ничего не понял. Ты топик создал ЗАЧЕМ?

Чтоб мы попробовали твое изделие. А как его попробовать когда стандартные сценарии сборки не работают?


да это я не тебе, а сарказирующему человеку выше ответил.


Так то конечно, я только ЗА то чтобы поиграться с кодом проекта :) Хотя это и не проба с точки зрения конечного пользователя (программиста использующего библиотеку у себя в проекте), но тоже здорово!
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990081
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
dakeiras

Этот билд работает с конкретной привязкой к версии Gradle (как и все Gradle проекты). В этом случае к Gradle 5.x.

Стоп-стоп. Подожди. Я работал с gradle на других прокетах с Амазоном. И у нас нигде не было требования
по версии сборщика. У нас была совместимость с диапазоном релизов Gradle и все нормас собиралось.

То что ты говоришь - это какая-то ерунда. Нет нигде жесткой привязки. Есть привязки
к версиям dependencies. Но сборщик - либерален. Для целого диапазона версий.


6й Gradle не обратно совместим. Отсюда и заметна разница.
Но с их точки зрения они рекомендуют использовать Gradle Wrapper и привязываться к конкретной версии Gradle, именно чтобы обходить такие ситуации.

авторUsing the Gradle Wrapper
It is recommended to always execute a build with the Wrapper to ensure a reliable, controlled and standardized execution of the build. Using the Wrapper looks almost exactly like running the build with a Gradle installation. Depending on the operating system you either run gradlew or gradlew.

https://docs.gradle.org/current/userguide/gradle_wrapper.html
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990082
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
Так ты должен этот враппер подложить. Это - твоя задача.



Так он подложен:
https://github.com/INFINITE-TECHNOLOGY/BOBBIN/tree/master/gradle/wrapper


Иначе как бы я CI использовал.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990083
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
mayton@ryzen-ssd:/storage/git.java/calcite$ ls gradle* -lF
-rw-r--r-- 1 mayton mayton 4451 Aug 15 17:09 gradle.properties
-rwxr-xr-x 1 mayton mayton 5764 Aug 15 17:09 gradlew*
-rw-r--r-- 1 mayton mayton 3056 Aug 15 17:09 gradlew.bat

gradle:
total 0
drwxr-xr-x 1 mayton mayton 86 Aug 15 17:09 wrapper/



 mayton@ryzen-ssd:/storage/git.java/calcite$ ./gradlew



Gradle надо запускать из корня проекта, а не из места установки Gradle.

Да и вообще не нужно устанавливать Gradle как пакет в ОС :)
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990088
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras

Gradle надо запускать из корня проекта, а не из места установки Gradle.

Это и есть корень проекта. Только не твоего.

Да и вообще не нужно устанавливать Gradle как пакет в ОС :)

Вот это новости! А как его нужно устанавливать? У меня - секретов нет. Я могу показать свой конфиг
пользователя ОС.

А как ты работаешь? Что у тебя? Windows? MacOS? Складывается впечатление что ты только в среде разработки
и собирал. Пойми правильно. Ты должен тут в топике показать сокрушительное. Неопровержимое. Доказтельство
того что твой софт живой и рабчий. Вот посмотри как Колесников педалит свой Json-builder. Он его вылизывает
как кот яйца. Покрыл тестами. Поклеил стикеры успешных стилевых сканеров и гейтов который определяют
качетсво продукта. Любо-дорого смотреть. Человек ДУМАЕТ о внешнем виде. О дистрибуции.

А у тебя что? Тут писали - тут рыбу завернули. Вот ты мне указал на фолдер gradle/wrapper - а там нет атрибута
executable (!). Это значит что в unix этот файл не выполнимый.

Так как ты его выполнял в CI/CD? Он не может работать в принципе! Или у тебя CI/CD под Windows?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990094
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу релизов gradle. По состоянию на сегодня (15-Aug-2020), стабильной версией
gradle является 6.6 (именно его мне предлагает портал для скачивания).

Зеркало файлового ресурса здесь https://services.gradle.org/distributions/
(когда вы его будете смотреть версия 6.6 уже уйдет вниз и будут новые версии в топе).

По поводу актуальности сборочных конфигов.

Код: java
1.
2.
3.
4.
5.
6.
7.
    compileOnly "org.codehaus.groovy:groovy-all:2.5.4"
    compile "org.slf4j:slf4j-api:1.7.25"
    compile "com.fasterxml.jackson.core:jackson-databind:2.9.8"
    compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.8'
    compile "io.i-t:supplies:2.0.0"
    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9'
    testCompile "org.codehaus.groovy:groovy-all:2.5.4"



Ключевые слова compile, e.t.c. морально устарели с точки зрения актуальных версий сборщиков.
Сейчас - новая система ключевых слов для указания класса зависимостей.

Как только ты настроишь коробочную сборку из консоли - увидешь warnings. С verbose детализацией
увидешь рекомендации на что их заменить.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990098
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь многабукв.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
destinations:
  - name: io.infinite.bobbin.config.ConsoleDestinationConfig
    levels: [warn, error, info]
  - name: io.infinite.bobbin.config.FileDestinationConfig
    packages: [io.infinite]
    fileName: ("./LOGS/INFINITE/${className}/${level}/${className}_${level}_${date}.log")
  - name: io.infinite.bobbin.config.FileDestinationConfig
    fileName: ("./LOGS/PACKAGES/${className}/${level}/${className}_${level}_${date}.log")
    format: dateTime + delimiter + level + delimiter + threadName + delimiter + className + delim



Вот мне лень писать каждый раз io.infinite.bobbin.config. Я-же не пишу java.lang.String. Это - обще-принятый тип.
И у компиллятора Java есть особое поведение при обработке пакета java.lang.*

И вы в корпоративной сети когда пингуете хост mayton - фактически имеете в виду суффикс mayton.corporate.com

Хочу писать так. Домен - по умолчанию известен.
Код: java
1.
2.
3.
destinations:
  - name: ConsoleDestinationConfig
    levels: [warn, error, info]
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990099
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто и есть корень проекта. Только не твоего.

А нужно из корня собираемого проекта. Это - общепринятые правила.

Выше я привёл ссылку на офиц. документацию Gradle. Перечитай мои сообщения внимательно пожалуйста.

авторВот это новости! А как его нужно устанавливать? У меня - секретов нет. Я могу показать свой конфиг
пользователя ОС.

Никак. Gradle не рекоммендуется устанавливать. Так говорят сами разработчики:

авторYou can install the Gradle build tool on Linux, macOS, or Windows. This document covers installing using a package manager like SDKMAN! or Homebrew, as well as manual installation.

Use of the Gradle Wrapper is the recommended way to upgrade Gradle.
авторThe recommended way to execute any Gradle build is with the help of the Gradle Wrapper (in short just “Wrapper”). The Wrapper is a script that invokes a declared version of Gradle, downloading it beforehand if necessary. As a result, developers can get up and running with a Gradle project quickly without having to follow manual installation processes saving your company time and money.
https://docs.gradle.org/current/userguide/installation.html
https://docs.gradle.org/current/userguide/gradle_wrapper.html#sec:upgrading_wrapper

авторА как ты работаешь? Что у тебя? Windows? MacOS? Складывается впечатление что ты только в среде разработки
и собирал.
Чередую винду, мак и линукс (Arch, Manjaro).

Код: java
1.
Так как ты его выполнял в CI/CD? Он не может работать в принципе! Или у тебя CI/CD под Windows?


CI - Travis. Вообще, в проекте всё видно - надо только приглядется - .travis.yml

Ты должен тут в топике показать сокрушительное. Неопровержимое. Доказтельство
того что твой софт живой и рабчий.

авторА у тебя что? Тут писали - тут рыбу завернули. Вот ты мне указал на фолдер gradle/wrapper - а там нет атрибута
executable (!). Это значит что в unix этот файл не выполнимый.

gradle-wrapper.jar (именно это подразумевается под Gradle Wrapper) не должен быть исполняемым файлом.
gradlew - должен (он такой флаг имеет в корне проекта ). Ещё раз повторю - иначе бы не работало CI.

Код: java
1.
2.
3.
4.
Пойми правильно. Ты должен тут в топике показать сокрушительное. Неопровержимое. Доказтельство
того что твой софт живой и рабчий. Вот посмотри как Колесников педалит свой Json-builder. Он его вылизывает
как кот яйца. Покрыл тестами. Поклеил стикеры успешных стилевых сканеров и гейтов который определяют
качетсво продукта. Любо-дорого смотреть. Человек ДУМАЕТ о внешнем виде. О дистрибуции.


Скажу так, я сторонник минимализма во всём. Очень качественного минимализма.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990101
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВот мне лень писать каждый раз io.infinite.bobbin.config. Я-же не пишу java.lang.String. Это - обще-принятый тип.
И у компиллятора Java есть особое поведение при обработке пакета java.lang.*

И вы в корпоративной сети когда пингуете хост mayton - фактически имеете в виду суффикс mayton.corporate.com

Хочу писать так. Домен - по умолчанию известен.

Это я исправлю. Спасибо.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990104
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(разводя руками)

Коллеги. Кто уже смог собрать эту бобину?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990105
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
(разводя руками)

Коллеги. Кто уже смог собрать эту бобину?


Брат, просто запусти ./gradlew build из корня проекта. Всё заработает.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990108
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79
dakeiras
пропущено...

фейспалм. Без комментариев.

так же как и твоя бабина на груви== рвотный рефлекс

Да нормас. Еще бенчмарка не было. А это в логгерах важно. Чтоб они не блокировали основную линию
бизнес кода, некоторые из них делают с кольцевыми буферами. Ну и в файловые writers добавляют
разные опции асинхронности.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990112
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Zzz79
пропущено...

так же как и твоя бабина на груви== рвотный рефлекс

Да нормас. Еще бенчмарка не было. А это в логгерах важно. Чтоб они не блокировали основную линию
бизнес кода, некоторые из них делают с кольцевыми буферами. Ну и в файловые writers добавляют
разные опции асинхронности.

Благодарю за поддержку!
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990113
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton

Да нормас. Еще бенчмарка не было. А это в логгерах важно. Чтоб они не блокировали основную линию
бизнес кода, некоторые из них делают с кольцевыми буферами. Ну и в файловые writers добавляют
разные опции асинхронности.
что там бенчмаркить-то? там в коде на каждую запись тупо flush вызывается, так что от производительности ожидать чего-то совсем не стоит. Еще за каким-то хреном используется FileWriter, который вместо байт пишет символы (ну а если с системной кодировкой не повезло, то в логах будет мусор )
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990114
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
mayton

Да нормас. Еще бенчмарка не было. А это в логгерах важно. Чтоб они не блокировали основную линию
бизнес кода, некоторые из них делают с кольцевыми буферами. Ну и в файловые writers добавляют
разные опции асинхронности.
что там бенчмаркить-то? там в коде на каждую запись тупо flush вызывается, так что от производительности ожидать чего-то совсем не стоит. Еще за каким-то хреном используется FileWriter, который вместо байт пишет символы (ну а если с системной кодировкой не повезло, то в логах будет мусор )

Вот я и говорю. Нужно взять LogBack и этого Робина-Бобина. И просто дать миллион простых евентов.
Смешанного уровня. От error до trace (заодно проверим как работает фильтрация). И просто посмотреть
как пробежал алгоритм.

Я-бы взялся бенчмаркать. Но мне пока есть чем заняться по другому проекту.

Может Стасян потестит?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990115
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Нужно взять LogBack и этого Робина-Бобина.
Зачем? Я выбираю какой какую именно реализацию slf4j использовать исходя из потребностей, причем критериев может быть больше десятка, а у ТС все крутится вокруг единственной идеи что логи нужно делить по потокам/пользователям (через MDC)/еще как - идея какая-то совершенно бессмысленная - проще все сгружать в хранилище и там уже вертеть как хочется, а не разбирать тысячи файлов. При этом еще и реализация откровенно хромает:

dakeiras

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
levels: [info, warn, error, debug]
destinations:
  - name: io.infinite.bobbin.config.ConsoleDestinationConfig
    packages: [com.acme.logstash]
    dateTimeFormat: "yyyy-MM-dd'T'HH:mm:ss:SSSZ"
    lineBreak: ",\r\n"
    formatArgs: |-
      """{
        "@timestamp": "$dateTime",
        "@version": "1",
        "message": "$message",
        "logger_name": "$className",
        "thread_name": "$threadName",
        "level": "$level",
        "username": "${args[0]}",
        "URI": "${args[1]}",
        "sessionId": "${args[2]}",
        "transactionId": "${args[3]}",
        "instanceId": "${MDC.get('instanceUUID')}"
      }"""



ну вот где здесь хоть какие-то гарантии что на выходе будет валидный JSON, если мы просто берем и интерполируем строку?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990116
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
что там бенчмаркить-то? там в коде на каждую запись тупо flush вызывается, так что от производительности ожидать чего-то совсем не стоит.


подскажите пожалуйста, как должно быть?

авторЕще за каким-то хреном используется FileWriter, который вместо байт пишет символы (ну а если с системной кодировкой не повезло, то в логах будет мусор )
да, это поправлю. Спасибо!
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990117
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов, он решал какую-то продуктовую задачу. Он писал про это. Родил монстра.

По сути это не логгер. А фреймворк наподобие музыкального центра. Тут тебе
и радио. И кассетник. И винил.

Я думаю что мы просто не в состоянии оценить труды дайкериса потому-что не понимаем
ценности и назначения этого бутерброда. Мы не знаем куда его скотчем можно примотать.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990119
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
подскажите пожалуйста, как должно быть?
Ну вы логбэк/логстэш хаите а посмотрите как там реализовано (начиная от банального задания immediateFlush у аппендеров, заканчивая отдельными IO-потоками)
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990121
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Log4j2 можно посмотреть в композиции с Disruptor. Это тот самый кольцевой буфер
про который я говорил.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990124
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
dakeiras
подскажите пожалуйста, как должно быть?
Ну вы логбэк/логстэш хаите а посмотрите как там реализовано (начиная от банального задания immediateFlush у аппендеров, заканчивая отдельными IO-потоками)

Logstash не хаял я! Это отличная вещь.

Ок, посмотрю. (Отдельные потоки - сразу нет.)

авторну вот где здесь хоть какие-то гарантии что на выходе будет валидный JSON, если мы просто берем и интерполируем строку?
Можно Gson использовать для записи JSON если данные могут поломать JSON. Этот пример больше для примера сделан (GSON можно оттуда же по аналогии вызывать в поле format).
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990125
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторАндрей Панфилов, он решал какую-то продуктовую задачу. Он писал про это. Родил монстра.

По сути это не логгер. А фреймворк наподобие музыкального центра. Тут тебе
и радио. И кассетник. И винил.

Я думаю что мы просто не в состоянии оценить труды дайкериса потому-что не понимаем
ценности и назначения этого бутерброда. Мы не знаем куда его скотчем можно примотать.

Наверное путаете с каким-то другим проектом. Это логгер и изначально создавался именно как логгер.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990127
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Log4j2 можно посмотреть в композиции с Disruptor. Это тот самый кольцевой буфер
про который я говорил.

Так если он блокирует что-то, зачем его использовать?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990129
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов,

посмотрел Logback.

Он делает тоже самое абсолютно:


Код: java
1.
2.
3.
4.
            this.outputStream.write(byteArray);
            if (immediateFlush) {
                this.outputStream.flush();
            }



https://github.com/qos-ch/logback/blob/ed3ec5be6830bd786705875cc8f6ab9c4937d6e9/logback-core/src/main/java/ch/qos/logback/core/OutputStreamAppender.java#L198-L202
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990131
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
    public ResilientFileOutputStream(File file, boolean append, long bufferSize) throws FileNotFoundException {
        this.file = file;
        fos = new FileOutputStream(file, append);
        this.os = new BufferedOutputStream(fos, (int) bufferSize);
        this.presumedClean = true;
    }



https://github.com/qos-ch/logback/blob/a0318b3bc117a8ad2a6bead88706364134bdd450/logback-core/src/main/java/ch/qos/logback/core/recovery/ResilientFileOutputStream.java#L24-L29

Я когда-то давно смотрел всё это. И тестировал разные комбинации.
С чего Вы взяли что там какая-то магия и супер оптимизация? Все бы знали о таких способах давно наверное)

Так что - какие ваши доказательства? (голосом Шварца)
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990150
Фотография Герой дня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zzz79
груви конечно редкостная помойка,которая с трудом поддается здравому смыслу)


груви удобен для многих вещей, тестирования, например в Spock Framework
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990154
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
mayton
Log4j2 можно посмотреть в композиции с Disruptor. Это тот самый кольцевой буфер
про который я говорил.

Так если он блокирует что-то, зачем его использовать?

Я не говорил что он блокирует.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990160
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
dakeiras
пропущено...

Так если он блокирует что-то, зачем его использовать?

Я не говорил что он блокирует.

А, сорри. Неверно прочитал. Оки, посмотрю. Спасибо!
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990161
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras, вот тут еще почитай.

https://logging.apache.org/log4j/2.x/manual/async.html
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990169
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
dakeiras, вот тут еще почитай.

https://logging.apache.org/log4j/2.x/manual/async.html

ok, спасибо!
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39990900
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
Alexey Tomin
пропущено...


Груви ещё там- значит в игнор.

С моей стороны аналогично про все проекты на Котлине.


Я ж не продвигаю тут библиотеки на котлине. Пусть они удобные, но в java лишние


dakeiras
Alexey Tomin
пропущено...


Груви ещё там- значит в игнор.

А слабо себя пересилить и попробовать Бобину 1 раз? Или страшно, что вдруг понравится?:)


Зачем? Груви я не использую и не буду. Мне одного проекта хватило, в котором груви использовался в одном модуле. Я даже не лазил туда особо, но проблемы лезли оттуда во все стороны.
На всякий случай- java-код тех же авторов проблем не создавал
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991079
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗачем? Груви я не использую и не буду. Мне одного проекта хватило, в котором груви использовался в одном модуле. Я даже не лазил туда особо, но проблемы лезли оттуда во все стороны.
На всякий случай- java-код тех же авторов проблем не создавал
Независимо от контекста, у тут есть проблема с аналитическим ходом мыслей в данном конкретном случае.
Вы делаете вывод о ВСЕХ проектах на основе ОДНОГО проекта с ОДНИМ модулем, написанным ОДНИМ программистом.

Это вызвано обычно предвзъятостью к предмету:)
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991085
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
авторЗачем? Груви я не использую и не буду. Мне одного проекта хватило, в котором груви использовался в одном модуле. Я даже не лазил туда особо, но проблемы лезли оттуда во все стороны.
На всякий случай- java-код тех же авторов проблем не создавал

Независимо от контекста, у тут есть проблема с аналитическим ходом мыслей в данном конкретном случае.
Вы делаете вывод о ВСЕХ проектах на основе ОДНОГО проекта с ОДНИМ модулем, написанным ОДНИМ программистом.

Это вызвано обычно предвзъятостью к предмету:)

Я сам пробовал груви. Динамический язык программирования кажется мне плохой идеей.
Вы предлагаете ради небольшой библиотеки (пишется за недельку с многопоточностью) тащить многомегабайтный jar? Зачем?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991086
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin
dakeiras
пропущено...

Независимо от контекста, у тут есть проблема с аналитическим ходом мыслей в данном конкретном случае.
Вы делаете вывод о ВСЕХ проектах на основе ОДНОГО проекта с ОДНИМ модулем, написанным ОДНИМ программистом.

Это вызвано обычно предвзъятостью к предмету:)


Я сам пробовал груви. Динамический язык программирования кажется мне плохой идеей.
Вы предлагаете ради небольшой библиотеки (пишется за недельку с многопоточностью) тащить многомегабайтный jar? Зачем?

из-за компиляции в класс на основе конфига при запуске приложения. Это даёт большой прирост производительности по сравнению с JSR223 (любой релизацией его).

Насчёт динамического языка - Груви поддерживает статическую компиляцию и гибридную (на уровне класса).
Я использую статическую по умолчанию, и там где надо - явно включаю динамическую через аннотацию метода.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991093
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Беспокойство коллег я вижу вот в чем. Java - это ассемблер для JVM. И ее типы данных. И прочие сущности
такие как class/enum/interface компилируются в сущности JVM в соотношении 1:1. Тоесть если ты кодер
на Java - то у тебя есть 100% контроль над выходом. Ты всегда знаешь во что будет собран исходник.

В груви у нас такой уверенности нет.

По поводу типизации. Она - не родная в груви. Насколько я понимаю исторически груви создавался скриптовым
языком для служебных целей. Как-то написание конфигов. Сценариев билда. Или модульных тестов.

Типизация с помощью @TypeCheck. Насколько она глубока. Так-же как в С++? Haskell? Цена вопроса - подстраховаться
от падения в релизе когда код уже собран но при этом компиллятор не уверен (не владеет на 100% информацией)
о том что down casting отработает именно так как ожидалось.

А падение в релизе - это падение нашей репутации. И как следствие уровня доверия заказчика. И потеря денег.
Тоесть беспокойство коллег - это не чистая теория на тему где красивее код. А это вполне себе материальный
интерес. Мы заинтересованы чтобы ошибок ClassCastException у нас не было и не было бы других подобных
ошибок связанных с диапазоном (Range) целого например или с тонкими различиями между int и double.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991099
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Беспокойство коллег я вижу вот в чем. Java - это ассемблер для JVM. И ее типы данных. И прочие сущности
такие как class/enum/interface компилируются в сущности JVM в соотношении 1:1. Тоесть если ты кодер
на Java - то у тебя есть 100% контроль над выходом. Ты всегда знаешь во что будет собран исходник.

В груви у нас такой уверенности нет.

По поводу типизации. Она - не родная в груви. Насколько я понимаю исторически груви создавался скриптовым
языком для служебных целей. Как-то написание конфигов. Сценариев билда. Или модульных тестов.

Типизация с помощью @TypeCheck. Насколько она глубока. Так-же как в С++? Haskell? Цена вопроса - подстраховаться
от падения в релизе когда код уже собран но при этом компиллятор не уверен (не владеет на 100% информацией)
о том что down casting отработает именно так как ожидалось.

А падение в релизе - это падение нашей репутации. И как следствие уровня доверия заказчика. И потеря денег.
Тоесть беспокойство коллег - это не чистая теория на тему где красивее код. А это вполне себе материальный
интерес. Мы заинтересованы чтобы ошибок ClassCastException у нас не было и не было бы других подобных
ошибок связанных с диапазоном (Range) целого например или с тонкими различиями между int и double.


класс на Груви:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
package io.infinite.pigeon.threads

import groovy.transform.ToString
import groovy.util.logging.Slf4j
import io.infinite.blackbox.BlackBox
import io.infinite.blackbox.BlackBoxLevel
import io.infinite.pigeon.conf.OutputQueue
import io.infinite.pigeon.springdatarest.entities.OutputMessage
import io.infinite.pigeon.other.MessageStatusSets
import io.infinite.pigeon.springdatarest.services.PigeonService
import org.springframework.context.annotation.Scope
import org.springframework.stereotype.Component

import javax.annotation.PostConstruct
import java.time.Duration
import java.time.Instant

@BlackBox(level = BlackBoxLevel.METHOD)
@Slf4j
@ToString(includeNames = true, includeFields = true, includeSuper = true)
@Component
@Scope("prototype")
class OutputThreadRetry extends OutputThread {

    OutputThreadRetry(OutputQueue outputQueue) {
        super(outputQueue)
        senderThreadRobin.clear()
        name = name + "_RETRY"
    }

    @Override
    @PostConstruct
    void initSenderThreads() {
        (1..outputQueue.retryThreadCount).each { threadCounter ->
            SenderThread senderThread = applicationContext.getBean(SenderThread.class, outputQueue, "_RETRY_" + threadCounter)
            senderThreadRobin.add(senderThread)
            senderThread.start()
        }
    }

    @BlackBox(level = BlackBoxLevel.ERROR, suppressExceptions = true)
    void dbScanRetry() {
        Date lastSendTime = (Instant.now() - Duration.ofSeconds(outputQueue.resendIntervalSeconds)).toDate()
        Integer countToRetry = outputMessageRepository.markForRetry(
                outputQueue.name,
                MessageStatusSets.OUTPUT_RETRY_MESSAGE_STATUSES.value(),
                outputQueue.maxRetryCount,
                lastSendTime,
                PigeonService.staticUUID
        )
        if (countToRetry > 0) {
            LinkedHashSet<OutputMessage> outputMessages = outputMessageRepository.selectForRetry(
                    outputQueue.name,
                    MessageStatusSets.OUTPUT_RETRY_MESSAGE_STATUSES.value(),
                    outputQueue.maxRetryCount,
                    lastSendTime,
                    PigeonService.staticUUID
            )
            outputMessages.each { outputMessage ->
                senderEnqueue(outputMessage)
            }
        }
    }

    @Override
    @BlackBox(level = BlackBoxLevel.METHOD)
    void run() {
        while (true) {
            dbScanRetry()
            sleep(outputQueue.pollPeriodMillisecondsRetry)
        }
    }

}



его декомпилированный класс на Яве:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package io.infinite.pigeon.threads;

import groovy.lang.Closure;
import groovy.lang.IntRange;
import groovy.transform.Generated;
import groovy.transform.ToString;
import io.infinite.blackbox.BlackBox;
import io.infinite.blackbox.BlackBoxLevel;
import io.infinite.blackbox.BlackBoxRuntime;
import io.infinite.blackbox.MethodMetaData;
import io.infinite.pigeon.conf.OutputQueue;
import io.infinite.pigeon.other.MessageStatusSets;
import io.infinite.pigeon.other.RoundRobin;
import io.infinite.pigeon.springdatarest.entities.OutputMessage;
import io.infinite.pigeon.springdatarest.services.PigeonService;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.apache.groovy.datetime.extensions.DateTimeExtensions;
import org.codehaus.groovy.runtime.DefaultGroovyMethods;
import org.codehaus.groovy.runtime.GeneratedClosure;
import org.codehaus.groovy.runtime.InvokerHelper;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.StringGroovyMethods;
import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@BlackBox(
    level = BlackBoxLevel.METHOD
)
@ToString(
    includeNames = true,
    includeSuper = true,
    includeFields = true
)
@Component
@Scope("prototype")
public class OutputThreadRetry extends OutputThread {
    public static final transient Logger automaticLog;
    public static final transient BlackBoxRuntime blackBoxRuntime;
    private static final transient Logger log;

    public OutputThreadRetry(OutputQueue outputQueue) {
        super(outputQueue);
        Object resultPlaceHolder = null;
        ScriptBytecodeAdapter.invokeMethodN(OutputThreadRetry.class, blackBoxRuntime, (String)"methodBegin", new Object[]{new MethodMetaData("io.infinite.pigeon.threads.OutputThreadRetry", "<init>", 25, 29, 5, 6), ScriptBytecodeAdapter.createMap(new Object[]{"outputQueue", outputQueue})});

        Object var10000;
        try {
            ((RoundRobin)((OutputThreadRetry)this).getSenderThreadRobin()).clear();
            var10000 = null;
            String var3 = StringGroovyMethods.plus(((OutputThreadRetry)this).getName(), "_RETRY");
            ScriptBytecodeAdapter.setGroovyObjectProperty(var3, OutputThreadRetry.class, this, (String)"name");
        } catch (Exception var8) {
            ScriptBytecodeAdapter.invokeMethodN(OutputThreadRetry.class, blackBoxRuntime, (String)"methodException", new Object[]{new MethodMetaData("io.infinite.pigeon.threads.OutputThreadRetry", "<init>", 25, 29, 5, 6), ScriptBytecodeAdapter.createMap(new Object[]{"outputQueue", outputQueue}), var8});
            throw (Throwable)var8;
        } finally {
            blackBoxRuntime.methodEnd(new MethodMetaData("io.infinite.pigeon.threads.OutputThreadRetry", "<init>", 25, 29, 5, 6));
            var10000 = null;
        }

    }

    @PostConstruct
    public void initSenderThreads() {
        Object resultPlaceHolder = null;
        blackBoxRuntime.methodBegin(new MethodMetaData("io.infinite.pigeon.threads.OutputThreadRetry", "initSenderThreads", 31, 39, 5, 6), (Map)null);
        Object var10000 = null;

        try {
            final class _initSenderThreads_closure1 extends Closure implements GeneratedClosure {
                public _initSenderThreads_closure1(Object _outerInstance, Object _thisObject) {
                    super(_outerInstance, _thisObject);
                }

                public Object doCall(Object threadCounter) {
                    SenderThread senderThread = (SenderThread)ScriptBytecodeAdapter.castToType(((OutputThreadRetry)((OutputThread)ScriptBytecodeAdapter.castToType(((_initSenderThreads_closure1)this).getThisObject(), OutputThread.class))).getApplicationContext().getBean(SenderThread.class, new Object[]{((OutputThreadRetry)((OutputThread)ScriptBytecodeAdapter.castToType(((_initSenderThreads_closure1)this).getThisObject(), OutputThread.class))).getOutputQueue(), StringGroovyMethods.plus("_RETRY_", threadCounter)}), SenderThread.class);
                    ((RoundRobin)((OutputThreadRetry)((OutputThread)ScriptBytecodeAdapter.castToType(((_initSenderThreads_closure1)this).getThisObject(), OutputThread.class))).getSenderThreadRobin()).add(senderThread);
                    ((SenderThread)senderThread).start();
                    return null;
                }

                public Object call(Object args) {
                    return this.doCall(args);
                }

                public Object call() {
                    return this.doCall((Object)null);
                }
            }

            DefaultGroovyMethods.each(new IntRange(true, 1, ((OutputThreadRetry)this).getOutputQueue().getRetryThreadCount()), new _initSenderThreads_closure1(this, this));
        } catch (Exception var6) {
            blackBoxRuntime.methodException(new MethodMetaData("io.infinite.pigeon.threads.OutputThreadRetry", "initSenderThreads", 31, 39, 5, 6), (Map)null, var6);
            var10000 = null;
            throw (Throwable)var6;
        } finally {
            blackBoxRuntime.methodEnd(new MethodMetaData("io.infinite.pigeon.threads.OutputThreadRetry", "initSenderThreads", 31, 39, 5, 6));
            var10000 = null;
        }

    }

    @BlackBox(
        suppressExceptions = true,
        level = BlackBoxLevel.ERROR
    )
    public void dbScanRetry() {
        try {
            try {
                Date lastSendTime = DateTimeExtensions.toDate(Instant.now().minus(Duration.ofSeconds(DefaultTypeTransformation.longUnbox(((OutputThreadRetry)this).getOutputQueue().getResendIntervalSeconds()))));
                Integer countToRetry = ((OutputThreadRetry)this).getOutputMessageRepository().markForRetry(((OutputThreadRetry)this).getOutputQueue().getName(), MessageStatusSets.OUTPUT_RETRY_MESSAGE_STATUSES.value(), ((OutputThreadRetry)this).getOutputQueue().getMaxRetryCount(), lastSendTime, PigeonService.getStaticUUID());
                if (ScriptBytecodeAdapter.compareGreaterThan(countToRetry, 0)) {
                    LinkedHashSet outputMessages = ((OutputThreadRetry)this).getOutputMessageRepository().selectForRetry(((OutputThreadRetry)this).getOutputQueue().getName(), MessageStatusSets.OUTPUT_RETRY_MESSAGE_STATUSES.value(), ((OutputThreadRetry)this).getOutputQueue().getMaxRetryCount(), lastSendTime, PigeonService.getStaticUUID());

                    final class _dbScanRetry_closure2 extends Closure implements GeneratedClosure {
                        public _dbScanRetry_closure2(Object _outerInstance, Object _thisObject) {
                            super(_outerInstance, _thisObject);
                        }

                        public Object doCall(Object outputMessage) {
                            ((OutputThreadRetry)((OutputThread)ScriptBytecodeAdapter.castToType(((_dbScanRetry_closure2)this).getThisObject(), OutputThread.class))).senderEnqueue((OutputMessage)ScriptBytecodeAdapter.castToType(outputMessage, OutputMessage.class));
                            return null;
                        }

                        public Object call(Object args) {
                            return this.doCall(args);
                        }

                        public Object call() {
                            return this.doCall((Object)null);
                        }
                    }

                    DefaultGroovyMethods.each(outputMessages, new _dbScanRetry_closure2(this, this));
                }
            } catch (Exception var8) {
                ScriptBytecodeAdapter.invokeMethodN(OutputThreadRetry.class, blackBoxRuntime, (String)"methodException", new Object[]{new MethodMetaData("io.infinite.pigeon.threads.OutputThreadRetry", "dbScanRetry", 41, 63, 5, 6), null, var8});
            }

        } finally {
            ;
        }
    }

    @BlackBox(
        level = BlackBoxLevel.METHOD
    )
    public void run() {
        Object resultPlaceHolder = null;
        ScriptBytecodeAdapter.invokeMethodN(OutputThreadRetry.class, blackBoxRuntime, (String)"methodBegin", new Object[]{new MethodMetaData("io.infinite.pigeon.threads.OutputThreadRetry", "run", 65, 72, 5, 6), null});

        try {
            while(true) {
                this.dbScanRetry();
                Object var10000 = null;
                Thread.sleep(((OutputThreadRetry)this).getOutputQueue().getPollPeriodMillisecondsRetry());
                var10000 = null;
            }
        } catch (Exception var6) {
            ScriptBytecodeAdapter.invokeMethodN(OutputThreadRetry.class, blackBoxRuntime, (String)"methodException", new Object[]{new MethodMetaData("io.infinite.pigeon.threads.OutputThreadRetry", "run", 65, 72, 5, 6), null, var6});
            throw (Throwable)var6;
        } finally {
            ScriptBytecodeAdapter.invokeMethodN(OutputThreadRetry.class, blackBoxRuntime, (String)"methodEnd", new Object[]{new MethodMetaData("io.infinite.pigeon.threads.OutputThreadRetry", "run", 65, 72, 5, 6)});
        }
    }

    @Generated
    public String toString() {
        StringBuilder _result = new StringBuilder();
        Boolean $toStringFirst = Boolean.TRUE;
        _result.append("io.infinite.pigeon.threads.OutputThreadRetry(");
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var3 = Boolean.FALSE;
            $toStringFirst = var3;
        } else {
            _result.append(", ");
        }

        _result.append("state:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).getState()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var4 = Boolean.FALSE;
            $toStringFirst = var4;
        } else {
            _result.append(", ");
        }

        _result.append("stackTrace:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).getStackTrace()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var5 = Boolean.FALSE;
            $toStringFirst = var5;
        } else {
            _result.append(", ");
        }

        _result.append("interrupted:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).isInterrupted()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var6 = Boolean.FALSE;
            $toStringFirst = var6;
        } else {
            _result.append(", ");
        }

        _result.append("daemon:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).isDaemon()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var7 = Boolean.FALSE;
            $toStringFirst = var7;
        } else {
            _result.append(", ");
        }

        _result.append("uncaughtExceptionHandler:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).getUncaughtExceptionHandler()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var8 = Boolean.FALSE;
            $toStringFirst = var8;
        } else {
            _result.append(", ");
        }

        _result.append("priority:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).getPriority()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var9 = Boolean.FALSE;
            $toStringFirst = var9;
        } else {
            _result.append(", ");
        }

        _result.append("threadGroup:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).getThreadGroup()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var10 = Boolean.FALSE;
            $toStringFirst = var10;
        } else {
            _result.append(", ");
        }

        _result.append("contextClassLoader:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).getContextClassLoader()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var11 = Boolean.FALSE;
            $toStringFirst = var11;
        } else {
            _result.append(", ");
        }

        _result.append("alive:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).isAlive()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var12 = Boolean.FALSE;
            $toStringFirst = var12;
        } else {
            _result.append(", ");
        }

        _result.append("name:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).getName()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var13 = Boolean.FALSE;
            $toStringFirst = var13;
        } else {
            _result.append(", ");
        }

        _result.append("id:");
        _result.append(InvokerHelper.toString(((OutputThreadRetry)this).getId()));
        if ($toStringFirst == null ? false : $toStringFirst) {
            Boolean var14 = Boolean.FALSE;
        } else {
            _result.append(", ");
        }

        _result.append("super:");
        _result.append(InvokerHelper.toString(super.toString()));
        _result.append(")");
        return _result.toString();
    }

    static {
        Logger var0 = LoggerFactory.getLogger("io.infinite.pigeon.threads.OutputThreadRetry");
        automaticLog = var0;
        Object var1 = ScriptBytecodeAdapter.invokeMethodN(OutputThreadRetry.class, new BlackBoxRuntime(), (String)"getInstance", new Object[]{automaticLog});
        blackBoxRuntime = (BlackBoxRuntime)ScriptBytecodeAdapter.castToType(var1, BlackBoxRuntime.class);
        Logger var2 = LoggerFactory.getLogger("io.infinite.pigeon.threads.OutputThreadRetry");
        log = var2;
    }
}



Отличий нет.
(доп. код логирования добавлен BlackBox - это мой проект).

Аналогично для enum и прочего.

При статической компиляции Груви делает Ява код 1 в 1.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991101
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насчёт ClassCastException - тут нужно быть внимательным даже при статической компиляции. Даже в Яве чистой.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991104
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поверьте мне, как CTO я очень слежу чтобы стек был на хорошей платформе в долгосрочной перспективе.
У Груви одна проблема сейчас - мало мейнтейнеров. Это риск, но не ретроспективный.

Вопроса Groovy или Kotlin или Java нет.

Вопрос JVM или Node.js.
Node.js на голову выше JVM сейчас. Даже я бы сказал на порядок. Поэтому если будем переходить с Груви - то на Node.js (но это не раньше чем лет через 5).
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991117
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты "как CTO" иногда заметаешь такую интересную пургу.

Node вообще не может конкурировать с Java на back-end по многим причинам. Их сферы применения
слишком отличаются.

Декомпилляция класса конечно интересна но ты и сюда умудрился запихнуть свою бобину.
И что мы здесь ожидаем увидеть? Давай так. Мы не делаем никаких экспериментов
пока не поставим задачу. Безсмысленная и безпощадная декомпилляция всякого разного
нам не нужна.

Лучше напиши рафинированный groovy-код но который имеет использование атомарных
и объектных типов и их кастинги в разные стороны. Матрицу кастингов. И мы на ее посмотрим.

И я (яж не упёртый) соглашусь с тем что Groovy генерит надёжный код. Моё видие Груви
было сформировано лет 9 назад.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991164
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Ты "как CTO" иногда заметаешь такую интересную пургу.

Node вообще не может конкурировать с Java на back-end по многим причинам. Их сферы применения
слишком отличаются.

Декомпилляция класса конечно интересна но ты и сюда умудрился запихнуть свою бобину.
И что мы здесь ожидаем увидеть? Давай так. Мы не делаем никаких экспериментов
пока не поставим задачу. Безсмысленная и безпощадная декомпилляция всякого разного
нам не нужна.

Лучше напиши рафинированный groovy-код но который имеет использование атомарных
и объектных типов и их кастинги в разные стороны. Матрицу кастингов. И мы на ее посмотрим.

И я (яж не упёртый) соглашусь с тем что Groovy генерит надёжный код. Моё видие Груви
было сформировано лет 9 назад.


вот без доп. AST трансформаций (без @BlackBox, @ToString и @Slf4j):

Groovy:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
package io.infinite.pigeon.threads


import io.infinite.pigeon.conf.OutputQueue
import io.infinite.pigeon.other.MessageStatusSets
import io.infinite.pigeon.springdatarest.entities.OutputMessage
import io.infinite.pigeon.springdatarest.services.PigeonService
import org.springframework.context.annotation.Scope
import org.springframework.stereotype.Component

import javax.annotation.PostConstruct
import java.time.Duration
import java.time.Instant

@Component
@Scope("prototype")
class OutputThreadRetry extends OutputThread {

    OutputThreadRetry(OutputQueue outputQueue) {
        super(outputQueue)
        senderThreadRobin.clear()
        name = name + "_RETRY"
    }

    @Override
    @PostConstruct
    void initSenderThreads() {
        (1..outputQueue.retryThreadCount).each { threadCounter ->
            SenderThread senderThread = applicationContext.getBean(SenderThread.class, outputQueue, "_RETRY_" + threadCounter)
            senderThreadRobin.add(senderThread)
            senderThread.start()
        }
    }

    void dbScanRetry() {
        Date lastSendTime = (Instant.now() - Duration.ofSeconds(outputQueue.resendIntervalSeconds)).toDate()
        Integer countToRetry = outputMessageRepository.markForRetry(
                outputQueue.name,
                MessageStatusSets.OUTPUT_RETRY_MESSAGE_STATUSES.value(),
                outputQueue.maxRetryCount,
                lastSendTime,
                PigeonService.staticUUID
        )
        if (countToRetry > 0) {
            LinkedHashSet<OutputMessage> outputMessages = outputMessageRepository.selectForRetry(
                    outputQueue.name,
                    MessageStatusSets.OUTPUT_RETRY_MESSAGE_STATUSES.value(),
                    outputQueue.maxRetryCount,
                    lastSendTime,
                    PigeonService.staticUUID
            )
            outputMessages.each { outputMessage ->
                senderEnqueue(outputMessage)
            }
        }
    }

    @Override
    void run() {
        while (true) {
            dbScanRetry()
            sleep(outputQueue.pollPeriodMillisecondsRetry)
        }
    }

}



Java:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package io.infinite.pigeon.threads;

import groovy.lang.Closure;
import groovy.lang.IntRange;
import io.infinite.pigeon.conf.OutputQueue;
import io.infinite.pigeon.other.MessageStatusSets;
import io.infinite.pigeon.other.RoundRobin;
import io.infinite.pigeon.springdatarest.entities.OutputMessage;
import io.infinite.pigeon.springdatarest.services.PigeonService;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.util.LinkedHashSet;
import javax.annotation.PostConstruct;
import org.apache.groovy.datetime.extensions.DateTimeExtensions;
import org.codehaus.groovy.runtime.DefaultGroovyMethods;
import org.codehaus.groovy.runtime.GeneratedClosure;
import org.codehaus.groovy.runtime.ScriptBytecodeAdapter;
import org.codehaus.groovy.runtime.StringGroovyMethods;
import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("prototype")
public class OutputThreadRetry extends OutputThread {
    public OutputThreadRetry(OutputQueue outputQueue) {
        super(outputQueue);
        ((RoundRobin)((OutputThreadRetry)this).getSenderThreadRobin()).clear();
        Object var10000 = null;
        String var2 = StringGroovyMethods.plus(((OutputThreadRetry)this).getName(), "_RETRY");
        ScriptBytecodeAdapter.setGroovyObjectProperty(var2, OutputThreadRetry.class, this, (String)"name");
    }

    @PostConstruct
    public void initSenderThreads() {
        final class _initSenderThreads_closure1 extends Closure implements GeneratedClosure {
            public _initSenderThreads_closure1(Object _outerInstance, Object _thisObject) {
                super(_outerInstance, _thisObject);
            }

            public Object doCall(Object threadCounter) {
                SenderThread senderThread = (SenderThread)ScriptBytecodeAdapter.castToType(((OutputThreadRetry)((OutputThread)ScriptBytecodeAdapter.castToType(((_initSenderThreads_closure1)this).getThisObject(), OutputThread.class))).getApplicationContext().getBean(SenderThread.class, new Object[]{((OutputThreadRetry)((OutputThread)ScriptBytecodeAdapter.castToType(((_initSenderThreads_closure1)this).getThisObject(), OutputThread.class))).getOutputQueue(), StringGroovyMethods.plus("_RETRY_", threadCounter)}), SenderThread.class);
                ((RoundRobin)((OutputThreadRetry)((OutputThread)ScriptBytecodeAdapter.castToType(((_initSenderThreads_closure1)this).getThisObject(), OutputThread.class))).getSenderThreadRobin()).add(senderThread);
                ((SenderThread)senderThread).start();
                return null;
            }

            public Object call(Object args) {
                return this.doCall(args);
            }

            public Object call() {
                return this.doCall((Object)null);
            }
        }

        DefaultGroovyMethods.each(new IntRange(true, 1, ((OutputThreadRetry)this).getOutputQueue().getRetryThreadCount()), new _initSenderThreads_closure1(this, this));
    }

    public void dbScanRetry() {
        Date lastSendTime = DateTimeExtensions.toDate(Instant.now().minus(Duration.ofSeconds(DefaultTypeTransformation.longUnbox(((OutputThreadRetry)this).getOutputQueue().getResendIntervalSeconds()))));
        Integer countToRetry = ((OutputThreadRetry)this).getOutputMessageRepository().markForRetry(((OutputThreadRetry)this).getOutputQueue().getName(), MessageStatusSets.OUTPUT_RETRY_MESSAGE_STATUSES.value(), ((OutputThreadRetry)this).getOutputQueue().getMaxRetryCount(), lastSendTime, PigeonService.getStaticUUID());
        if (ScriptBytecodeAdapter.compareGreaterThan(countToRetry, 0)) {
            LinkedHashSet outputMessages = ((OutputThreadRetry)this).getOutputMessageRepository().selectForRetry(((OutputThreadRetry)this).getOutputQueue().getName(), MessageStatusSets.OUTPUT_RETRY_MESSAGE_STATUSES.value(), ((OutputThreadRetry)this).getOutputQueue().getMaxRetryCount(), lastSendTime, PigeonService.getStaticUUID());

            final class _dbScanRetry_closure2 extends Closure implements GeneratedClosure {
                public _dbScanRetry_closure2(Object _outerInstance, Object _thisObject) {
                    super(_outerInstance, _thisObject);
                }

                public Object doCall(Object outputMessage) {
                    ((OutputThreadRetry)((OutputThread)ScriptBytecodeAdapter.castToType(((_dbScanRetry_closure2)this).getThisObject(), OutputThread.class))).senderEnqueue((OutputMessage)ScriptBytecodeAdapter.castToType(outputMessage, OutputMessage.class));
                    return null;
                }

                public Object call(Object args) {
                    return this.doCall(args);
                }

                public Object call() {
                    return this.doCall((Object)null);
                }
            }

            DefaultGroovyMethods.each(outputMessages, new _dbScanRetry_closure2(this, this));
        }

    }

    public void run() {
        while(true) {
            this.dbScanRetry();
            Thread.sleep(((OutputThreadRetry)this).getOutputQueue().getPollPeriodMillisecondsRetry());
        }
    }
}
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991181
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВы предлагаете ради небольшой библиотеки (пишется за недельку с многопоточностью) тащить многомегабайтный jar? Зачем?
8МБ это многомегабайтный?

А что тогда маломегабайтный? Jackson 2МБ занимает.
Тоже предлагаете "не тащить" его?

Тут выше Mayton сказал что у Явы своя ниша по сравнению с Node.js.

Без библиотек "мнохамехабайтных" - я хочу знать - КАКОВА эта ниша тогда?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991192
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас был параллельный топик. И мы обсуждали каменты создателя Node. Он что-то там жаловался плакал.
Как Ельцин. Дескыть я устал я ухожу. Идите все вжопу а я домой.

И там мы коснулись некоторых архитектурных features, которые node не поддерживает. В частности движок
node был одно-процессный и потоки он не умел запускать. Его концепция потоков основана
на асинк-события дисковой и сетевой подсистемы.

К каким последствиям приводит остуствие потоков (Threads) для бизнес-приложений - подумайте сами.
Возможно у Нод-щиков есть свой рецепт. И возможно они потоки эмулируют запуском процессов.
(это по смыслу как будто из Java process builder вы вызвали еще один процес java). Но я думаю
что они должны делать приложения на 100% event driven. И как-то там прорабатывать бизнес
цикл сообщений чтоб гарантировать что процессинг будет короткий и не захватит вычислениями надолго.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991260
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991263
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты не шутил насчет того что с груви на ноду переходить собрался?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991264
dakeiras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А ты не шутил насчет того что с груви на ноду переходить собрался?


я сейчас поработал на Vue.js и просто офигел.
Насколько продуктивно. Сообщества больше на Ноде и экосистемы тоже больше. (чем на Яве).

Ява это умирающая платформа - хоть и довольно медленно.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991302
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras,

только надо учесть что js - это интерпритатор , и обработчик запросов
а java - это приложение - со всеми вытекающими возможностями.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991319
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras,

А ты умеешь эту ноду оптимизировать?
Но тоесть писать код так чтобы он быстро работал в релизе. В java оптимизирующему jit компилятору потратили более 20 лет на все улучшения.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991324
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Но тоесть писать код так чтобы он быстро работал в релизе. В java оптимизирующему jit компилятору потратили более 20 лет на все улучшения.

Нода достаточно шустрая, но это больше за счёт того, что там не успели написать тонну библиотек, ормов и фреймворков сверху. То есть, чтобы работало быстро и не жрало ram на яве надо постараться, когда в ноде можно нашлёпать дефолтный код и он будет сносно работать. С другой стороны производительность простого стрингбилдера на js вгоняет в депрессию.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991325
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dakeiras
Node.js на голову выше JVM сейчас. Даже я бы сказал на порядок.

Чем она на порядок выше?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991330
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
dakeiras
Node.js на голову выше JVM сейчас. Даже я бы сказал на порядок.

Чем она на порядок выше?


Разработчики делятся на тех, кому зашли динамически-типизированные языки, и кому зашли статически-типизированные. А ещё функциональщики. Это как религия.

Если зашла "динамика"- то ruby и js+nodejs это самое то. groovy - палиатив.

Если "статика"- то java/scala/kotlin или c# (С++ и ассемблер не будем поминать). И от groovy тошнит.

Просто dakeiras нашёл своё признание. Ну и хорошо.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991339
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin
нашёл своё признвание
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991345
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
dakeiras
Node.js на голову выше JVM сейчас. Даже я бы сказал на порядок.

Чем она на порядок выше?


там регулярно в репозиторий npm какие-то бэкдоры пихают, где вы еще такое встретите? Или где еще можно два раза подряд собрать одно и то же и получить совершенно разный результат?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991346
Большой Синий Кит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
crutchmaster
пропущено...

Чем она на порядок выше?


там регулярно в репозиторий npm какие-то бэкдоры пихают, где вы еще такое встретите? Или где еще можно два раза подряд собрать одно и то же и получить совершенно разный результат?


Класс. :)
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991348
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
там регулярно в репозиторий npm какие-то бэкдоры пихают, где вы еще такое встретите?

Да с этим всё понятно и всё печально. Брать из npm можно далеко не всё.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991355
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton
Но тоесть писать код так чтобы он быстро работал в релизе. В java оптимизирующему jit компилятору потратили более 20 лет на все улучшения.

Нода достаточно шустрая, но это больше за счёт того, что там не успели написать тонну библиотек, ормов и фреймворков сверху. То есть, чтобы работало быстро и не жрало ram на яве надо постараться, когда в ноде можно нашлёпать дефолтный код и он будет сносно работать. С другой стороны производительность простого стрингбилдера на js вгоняет в депрессию.

С моей точки зрения, языки программирования общего назначения (С++/C#/Java/Python/Ruby) обладают неким
индексом производительности. И он - достаточно стационарен. Тоесть ты берешь 100 разных алгоритмов. Реализуешь
их на этих языках и если за 1.0 принять самый быстрый из них (например С++) то другие языки выстроятся в шеренгу.

И в этой шеренге Node.JS будет занимать некое позорное место по рангу далеко не в первой пятерке.
И этот факт я могу подтвердить. Я гонял бенчмарк на Node и на C-lang

Алгоритмы должны не использовать Network/DiskIO. Тоесть мы меряем чистый перформанс в вакууме.
Для серверов и датацентров существуют другие метрики в флопах . Но нам это не нужно. У нас - проще подход.

Поэтому наш начинаюший junior-шеф-исполнительный-директор дайкерис должен этот факт понимать
и принимать его во внимание при стратегических решениях.

Дай бох его приложения - это просто микро-сервисы которые отбивают ресты и иксемельки. Тогда все будет норм.
Но если речь идет именно о бизнес расчетах или о каких-то нагрузочных вычислениях без диска и без базы - то
эффект от ухода с JVM/Groovy на Node - будет весьма неприятным.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991385
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Тоесть ты берешь 100 разных алгоритмов. Реализуешь

Тут проблема в том, что надо хорошо разбираться во всех этих языках. Так-то у меня нода выигрывает в разы яву по памяти и скорости, но это - ничего не значит:)
mayton
И в этой шеренге Node.JS будет занимать некое позорное место по рангу далеко не в первой пятерке.

Нода будет где-то за явой/c#. Пистон с руби и прочими пхп улетят далеко в помойку.
Пруф, например : https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/nbody.html
В некоторых случаях она тормознее раза в 3, чем натив, в некоторых в 5-7, в случае с nbody - не сильно отстаёт от жабки. Не сказал бы, что нода прям позорная по производительности, хоть, да, такое расхожее мнение есть.
Еще движок Chipmunk на ней переписывали, там тоже была просадка раза в 3. ( https://github.com/josephg/Chipmunk-js)
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991406
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton
Тоесть ты берешь 100 разных алгоритмов. Реализуешь

Тут проблема в том, что надо хорошо разбираться во всех этих языках. Так-то у меня нода выигрывает в разы яву по памяти и скорости, но это - ничего не значит:)
mayton
И в этой шеренге Node.JS будет занимать некое позорное место по рангу далеко не в первой пятерке.

Нода будет где-то за явой/c#. Пистон с руби и прочими пхп улетят далеко в помойку.
Пруф, например : https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/nbody.html
В некоторых случаях она тормознее раза в 3, чем натив, в некоторых в 5-7, в случае с nbody - не сильно отстаёт от жабки. Не сказал бы, что нода прям позорная по производительности, хоть, да, такое расхожее мнение есть.
Еще движок Chipmunk на ней переписывали, там тоже была просадка раза в 3. ( https://github.com/josephg/Chipmunk-js)

Каждый бенчмарк имеет право на сущестоввание.

Но у меня есть претензии к публикации отчота по небесным телам которые летают вокруг Юпитера.
Он - не репрезентативен. Он - просто представляет собой совокупность исходников по ОДНОМУ языку
которые пронумерованы как #1,#2....etc.

Этот отчот просто показывает нам что МНОГО ЛЮДЕЙ использовали ОДИН язык и умудрилсь на нем
по разному закодить одну задачу. Это просто показывает нам другое измерение статистик. Скорее
матрицу чем таблицу. Но делать по ней выводы о языке - сложнее.

Мой подход заключался в другом. Мы брали 1 алгоритм и группой его улучшали на одном языке
добиваясь лучшего результата.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991499
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На рендеринге 3Д-картинки (вычисления с double). Я брал лучшие измерения в классе одного компиллятора.

Lang Elapsed timeRust (rustc 1.39.0, cargo 1.39.0 8.7sClang, Linux 5.3.0-28-generic 9.8sC++ (gcc version 7.4.0, clang version 6.0.0-1ubuntu2) 9.06sJava-11 (OpenJDK 11.0.4 64-Bit, Linux 5.3.0-28) 12sgo1.10.4 linux/amd64 24sNodeJS v8.10.0 1m 30s
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991856
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
NodeJS v8.10.0

А что не 0.12?
Да и руст у вас свежее, чем гсс и го.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991857
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,


mayton
Он - просто представляет собой совокупность исходников по ОДНОМУ языку

Почему по одному?

mayton
Мы брали 1 алгоритм и группой его улучшали на одном языке
добиваясь лучшего результата.

Ну если вы - группа программистов на си/жабке, то понятно, что у вас не получится лучше, чем у задротов питона/руби/жс/пхп.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991872
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton
NodeJS v8.10.0

А что не 0.12?
Да и руст у вас свежее, чем гсс и го.


Так и jdk 11я версия :)
Видимо старый тест.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991885
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я обновлю версии компиляторов.
Если это все ваши замечания по теме.
Но на индекс производительности это обычно не влияет.

По поводу задротов. Welcome. Попробуйте улучшить.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991897
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
По поводу задротов. Welcome. Попробуйте улучшить.

А что попробовать? Где сорцы?
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991902
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Если это все ваши замечания по теме.

Ну и в любом случае, там между v8 и php/питоном/прочими пропасть.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991944
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... обновил NodeJS до v10.19.0. Результаты улучшились. Но есть артефакты.

Впервые я не могу интерпретировать результат. Получаю двух-модовое распределение времени.
Один центр колеблется возле 27 секунд. Другой - возле 40. Это может быть связано с особенностями
STDOUT для процесса Node, но тут надо чье-то мнение кто этой нодой занимается.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
user	0m40.445s
sys	0m2.053s

echo "Finish at : $(date +"%s")"
Finish at : 1598261453

mayton@ryzen-ssd:~/git/CardRaytracerBenchmark/nodejs$ ./run.sh
#!/bin/bash -v
nodejs --version
v10.19.0

echo "Start at : $(date +"%s")"
Start at : 1598261484

time nodejs card-raytracer.js >1.ppm

real	0m26.994s
user	0m27.397s
sys	0m0.836s

echo "Finish at : $(date +"%s")"
Finish at : 1598261511
mayton@ryzen-ssd:~/git/CardRaytracerBenchmark/nodejs$ ./run.sh
#!/bin/bash -v
nodejs --version
v10.19.0

echo "Start at : $(date +"%s")"
Start at : 1598261519

time nodejs card-raytracer.js >1.ppm

real	0m27.010s
user	0m27.476s
sys	0m0.867s

echo "Finish at : $(date +"%s")"
Finish at : 1598261546
mayton@ryzen-ssd:~/git/CardRaytracerBenchmark/nodejs$ ./run.sh
#!/bin/bash -v
nodejs --version
v10.19.0

echo "Start at : $(date +"%s")"
Start at : 1598261553

time nodejs card-raytracer.js >1.ppm

real	0m39.126s
user	0m40.153s
sys	0m1.696s

echo "Finish at : $(date +"%s")"
Finish at : 1598261593

...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991947
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Получаю двух-модовое распределение времени.
Один центр колеблется возле 27 секунд. Другой - возле 40. Это может быть связано с особенностями
STDOUT для процесса Node, но тут надо чье-то мнение кто этой нодой занимается.


Нет, там бэкдор и она биткойны майнит
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991951
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
mayton
Получаю двух-модовое распределение времени.
Один центр колеблется возле 27 секунд. Другой - возле 40. Это может быть связано с особенностями
STDOUT для процесса Node, но тут надо чье-то мнение кто этой нодой занимается.


Нет, там бэкдор и она биткойны майнит

Ну за 40 секунд - много не намайнит. А в состоянии покоя - никаких новых процессов нет.

Но спасибо. Вы мне кстати напомнили что у меня была идея - все тесты завернуть в Docker
для удобства развертывания.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991954
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щас попробую обновить бенчмарк по Python. Последний раз за 10 минут не дождался ответа. Может на Python3
будет транслятор побыстрее.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39991970
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.. в Python-тесте баг и он вообщем формирует неверную картинку.

Отложим пока его
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39992119
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Хм... обновил NodeJS до v10.19.0.

Можно и до 12 обновить.
mayton
Это может быть связано с особенностями
STDOUT для процесса Node

Если она активно пишет в stdout, то, возможно мы занимаемся измерением производительности диска.
mayton
но тут надо чье-то мнение кто этой нодой занимается

Без исходников сложно что-то сказать.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39992120
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Один центр колеблется возле 27 секунд. Другой - возле 40

Ну да, где-то так она и должна работать. Т.е. в 3 - 4 раза медленнее нативного.
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39992121
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--
...
Рейтинг: 0 / 0
Бобина 4.1.0
    #39992143
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
mayton
Хм... обновил NodeJS до v10.19.0.

Можно и до 12 обновить.
mayton
Это может быть связано с особенностями
STDOUT для процесса Node

Если она активно пишет в stdout, то, возможно мы занимаемся измерением производительности диска.
mayton
но тут надо чье-то мнение кто этой нодой занимается

Без исходников сложно что-то сказать.

Родительский топик здесь https://www.sql.ru/forum/1173809-43/tyapnichnyy-benchmark-cpu-part-1

Не будем распыляться. Здесь пускай себе катится Бобина.

Модератора попрошу удалить мои посты с бенчмарком.
...
Рейтинг: 0 / 0
95 сообщений из 95, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Бобина 4.1.0
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]