TelegramBots долго останавливает сессию

Использую в работе библиотеку TelegramBots, но есть проблема, что боты останавливаются очень долго. Останавливаю ботов последовательно одного за другим и в результате весь процесс занимает около часа.

В списке задач TelegramBots нашёл две задачи с описанием похожей проблемы:

BotSession.stop() takes a long time

stop method never exits

Я долго отлаживал саму библиотеку, но легкого решения проблемы не нашёл. О проблема заключается в том, что ReaderThread внутри библиотеки использует блокировку на объект DefaultBotSession. Но при остановке бота мы вызываем синхронизированный метод stop у DefaultBotSession, что приводит к тому, что мы несколько десятков секунд ждём, пока ReaderThread освободит блокировку, и мы сможем её взять.

В качестве решения проблемы на текущий момент можно лишь останавливать ботов параллельно в несколько потоков. Тогда придётся ждать не час, а пару минут в худшем случае.


Что бесит программиста

Нашёл вот такое интересное видео:

Что бесит программиста | Анастасия Лукьяненко

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


ResultSet getLong, getInt, getShort, getByte, getDouble, getFloat, getBoolean и SQL NULL

При работе с JDBC мы часто используем методы getLong, getDouble, getFloat, getShort, getByte, getBoolean для получения значения из ResultSet. Они замечательно работают для колонок с ограничениями NOT NULL, но они возвращают 0 для случаев, когда такого ограничения нет, и в реальности значение равно SQL NULL. Как же нам распознать подобные ситуации? Нам нужно использовать метод wasNull() сразу же после чтения этого значения.

Пример:

Я до этого обычно делал getObject, а потом сравнивал с null. Сегодня только узнал, что можно по-другому.


Java 11 HttpClient multipart/form-data

В этой статье (хотя на статью она не особо тянет, просто заметка, скорее всего) мы научимся отправлять HTTP POST запрос с ContentType: multipart/form-data с помощью встроенного в Java 11 HttpClient.

Тут надо сразу признать, что в самом HttpClient, который вошёл в Java 11, нет особой поддержки multipart/form-data (или я не нашёл?), поэтому большую часть тела запроса приходится формировать вручную.

Читать далее Java 11 HttpClient multipart/form-data

Arctic Code Vault Contributor

На GitHub у моего профиля, оказывается, в этом году появился новый значок Arctic Code Vault Contributor. Это всё благодаря моему вкладу в Crayon Syntax Highlighter, Cassandra Maven Plugin и мой собственный плагин urvanov-richtext-addfmt, которые попали в особое «холодное» (которое специально создано для долгого хранения) хранилище GitHub, если я правильно понял. Указал в своём резюме, что у меня есть такой значок. Надеюсь, что он мне поможет при поиске следующего места работы.

Arctic Code Vault COntributor
Arctic Code Vault Contributor


Ноутбук для Java-программиста в 2020 году

Я уже писал подобные статью в 2017 году, а потом ещё одну в 2018 году.

Требования к ноутбуку почти такие же: 16 ГБ ОЗУ (но можно уже и на 32 ГБ замахиваться, если деньги есть), 512 ГБ на диске SSD (это самый минимум, лучше побольше, конечно).

Читать далее Ноутбук для Java-программиста в 2020 году

Сказания Колючих Гор. Часть 1.

Я сижу в комнате на третьем этаже принадлежащей мне таверны(так-то таверна двухэтажная, но одна сторона, построенная самой последней, имеет три этажа), на столе стопка чистой новой писчей бумаги лучшего качества и целая гора записей, что я делал в течении жизни. Настала пора хоть как-то это структурировать и создать отдельный фолиант. Возможно, я просто закажу переписчикам сделать копию или же даже опубликую получившийся опус. Когда закончу хотя бы пару глав, будет понятно, достойна ли эта писанина публикации.

Решение о том, что нужно начать писать это, пришло мне, когда я ездил в горы выяснить, почему поставки льда для моих таверн были задержаны уже три раза. Это очень неприятно, ведь сохранность продукции и репутация таверны и хозяина (то есть меня) зависит от этого льда.

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

— Эй ты, рыжая борода, я узнал тебя!

У меня борода не рыжая, а седая и редкая, но я обернулся.

Тот, с рыжей бородой, отодвинул стул.

— Я узнал тебя, рыжая борода! – громогласно заявил огромный детина в шляпе с пером. – Это ты меня тогда в Колючих Горах ударил топором по голове, да так, что шлем мой раскололся на две половины! До сих пор голова побаливает и искры из глаз сыплются, когда много выпью!

Читать далее Сказания Колючих Гор. Часть 1.