powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Бобина 4.1.0
25 сообщений из 95, страница 3 из 4
Бобина 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
25 сообщений из 95, страница 3 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Бобина 4.1.0
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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