Java Mentor – Telegram
Java Mentor
294 subscribers
173 photos
48 videos
1 file
79 links
Download Telegram
🔥 Проблемы изоляции транзакций: как это выглядит в жизни и коде 🚀

Обещал рассказать про сложности, с которыми я столкнулся на работе.
Долго думал, как описать это интересно, понятно и без нарушения NDA. Вот что получилось! 😊

🧠 Представим кофейню:
Клиент делает заказ. Он участник программы лояльности, у него есть баллы.

☕️ Кассир спрашивает:
"Молодой человек, что делаем с баллами? Списываем или копим?"

👤 Клиент отвечает:
"Списываем!"

Кассир нажимает кнопки и говорит:
"Подтвердите списание!"

Клиент достаёт телефон, заходит в Телеграм и видит сообщение от бота:
💬 "Вы уверены, что хотите списать 324 балла?"
Кнопки: 🔘 Да | 🔘 Нет

Клиент нажимает Да, касса печатает чек.

Как это работает на сервере? 🖥
На сервере процесс списания баллов требует подтверждения. Всё начинается с запроса:

1️⃣ В таблице client_ask фиксируется вопрос клиенту и ожидается его ответ.
2️⃣ На основании ID созданной записи отправляется сообщение клиенту в ТГ.
3️⃣ Сервер ждёт, когда в записи появится ответ в колонке response.

Код выглядит примерно так: 👇

@Service
public class MyService {

@Autowired
private ClientAskRepository clientAskRepository;

@Autowired
private TgMessageService messageService;

@Transactional
public void askClient() {
ClientAsk clientAsk = new ClientAsk(1L, null);
clientAskRepository.save(clientAsk);

// Отправка запроса на подтверждение
messageService.sendClientAsk(clientAsk);

while (clientAsk.getResponse() == null) {
// Ждём ответа
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}

clientAsk = clientAskRepository.findById(clientAsk.getId()).orElse(null);
}
}

@Transactional
public void saveClientResponse(Long id, String response) {
clientAskRepository.findById(id).ifPresent(clientAsk -> {
clientAsk.setResponse(response);
clientAskRepository.save(clientAsk);
});
}
}


🤯 Где начинаются проблемы?
Метод askClient создаёт запись и отправляет запрос в ТГ бот. Он ждёт, пока response обновится.

Метод saveClientResponse должен записывать ответ, но...

🚨 Ошибка!
Данные, созданные транзакцией askClient, недоступны для других транзакций, пока они не закоммичены.

Причина: уровень изоляции транзакций по умолчанию — READ_COMMITTED.
Транзакция видит только закоммиченные изменения.

🔧 Как мы решили проблему?
Мы выбрали простой, но спорный метод:
👉 saveClientResponse создаёт новую запись, а askClient ждёт появления новой записи вместо обновления существующей.

Да, это костыль, но он работает. 😅

🛠 Какие ещё есть варианты?
1️⃣ Событийно-ориентированная архитектура:
Можно отправлять события вместо прямого обновления БД.

2️⃣ Выделить создание записи в отдельный сервис:
Это откроет новую транзакцию, которая завершится, и данные станут видимыми.

3️⃣ Изменить уровень изоляции:
Попробовать READ_UNCOMMITTED. Но, увы, в нашем случае это не помогло.

А как бы вы решили такую задачу? Делитесь мыслями в комментариях! ✍️
👍732🔥1
Короче написал полотно текста, выдал всю боль, натер мазоли на пальцах и в мозгу, попросил чат gpt расставить смайлики для поста в телегу, он взял и тупо перехерачил весь текст, оставив от моих интеллектуальных потугов процентов 20…

Вышло вроде хорошо, но как то бездушно, искусственно.

Но я че, я лентяй, и так сойдет. Не самому же эти смайлики расставлять 😅

PS речь про предыдущий пост
🔥7😁4👾1
Всем привет!

Позавчера еще все было так логично, а вчера закончились праздники... 🎄

Но как-бы то ни было новый год наступил, поэтому всех с прошедшими праздниками, и давайте вливаться в работу 💻

Постараюсь в новом году радовать вас большим количеством полезного и не очень контента 😎

А начну с маленького подарка всем виндоводам и любителям халявы.

Наткнулся тут недавно на скриптик, который сбрасывает триалку в IDEA Ultimate 🤩

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

Но зато триальный период сбросился и месяц можно спокойно юзать. Гипотетически процедуру можно повторять сколь угодно много раз. 🫰

Используйте на свое усмотрения, все плюсы и минусы я перечислил)

Всем добра и сил сделать оливье еще один раз)

🔽🔽🔽Скрипт в комментах ⬇️⬇️⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍5🔥2
🔥 Итоги месяца работы с учеником 🔥

Месяц назад я начал работать с Владом, начинающим Java-разработчиком. За этот месяц мы проделали большой путь, и его прогресс просто впечатляет! 👇

Еще до работы со мной Влад самостоятельно написал телеграм-бот "Анонимка" — бот для анонимного общения с рандомными собеседниками.

💻 Кодовая база включает:
3 микросервиса, 2 библиотеки и интеграцию с Kafka.

Для начинающего разработчика это действительно крутой результат! 👏Поэтому Press F to pay respects 🫡

Что мы сделали за месяц:

▫️Провели 4 мок-собеседования по Java Core, Spring, SQL и многопоточности. Влад уверенно отвечает на вопросы, и прогресс заметен с каждым разом.

▫️Внедрили Liquibase для миграций БД

▫️Настроили Nexus и Docker для публикации библиотек и сборки docker-образов, т.е. провели докеризацию его проекта.

▫️Развернули приложение на реальном сервере — теперь всё готово к использованию! 🚀

🧪 Как вы можете помочь?

Я приглашаю вас потестировать "Анонимку". Это отличный шанс проверить его в реальном использовании и оставить свои отзывы.
Ссылка на бот 👉🏻 https://news.1rj.ru/str/anonimka_ru_chatbot.

📈 Что дальше?

Влад планирует развивать своего бота, добавляя такие функции, как выбор пола и возраста собеседника, а также готовится к активному поиску работы в IT-компаниях. 💼

Давайте поддержим Влада на его пути в IT! 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥126👍2
💡 Как поднять свой VPN

Обещал рассказать, как настроить свой VPN. 🔧

Раньше не задумывался всерьёз о том, чтобы поднять свой VPN, потому что казалось, что это слишком сложно. 🤯

А оказалось всё довольно просто! 🤦‍♂️

👉 Делал по этому гайду:
📜 Как сделать свой VPN: установка и настройка Amnezia

Работает везде:
💻 PC
📱 Android
🍏 iOS

Процедура состоит из 3 шагов:
1️⃣ Аренда VPS
Арендовал сервер на pq.hosting. Оплатить можно любым способом! 💳

2️⃣ Установка Amnezia VPN
Приложение автоматически устанавливает нужное ПО на сервер. Просто вводите логин и пароль от SSH 🔑

3️⃣ Подключение мобильных устройств
С ПК делитесь подключением через QR-код 📷
На телефоне сканируете этот код – и готово!

Единственный гемор 🚩
Приложения Amnezia VPN нет в российском AppStore. Поэтому пришлось создавать зарубежный Apple ID 🌍

🤔 В чем плюсы?

Работает быстрее и стабильнее, чем платные VPN 🚀
Полный контроль над подключением 🛡
В отличие от платного VPN - свой не отвалится 🔒👌

Если заинтересовало, читайте гайд! 🔗
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥73👍3
Не зря купил себе гантели со сменными блинами.

Однозначно стал сильнее подпирать столешницу 😂
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣11🏆5
🤔 Что сложнее, пройти собес или в попасть на собес?


Мне вот кажется, пройти собес гораздо проще, чем стабильно получать приглашения 💼


Для прохождения собеседования нужно изучить теорию. Да, ее много. Но тут все хотя бы понятно. Есть объем работы X и за время Y можно все перелопатить 🤓🦾📚


А с приглашением на собесы все сложнее. Есть резюме X и оно дает в среднем 0 приглашений на собесы в месяц. И что с этим делать?.. 😵‍💫🤯😩

Яйцо или курица? 🤔

Что поднимает привлекательность резюме в глазах работодателей? Опыт работы. Где его взять? На работе. Как на нее попасть? Нужен опыт работы. 🫨

Как выйти из этого порочного круга?


Пет-проекты 🚀

Не устану повторять, что хороший пет-проект закрывает эти вопросы 😌

А бонусом дает
🦸‍♂️ Развитие практических скиллов
🦸‍♂️ Навык проектирования кода
🦸‍♂️ Изучения актуальных библиотек
🦸‍♂️ И, наверное, силу земли 🥒


Если вы придумаете проект, который решает какую-то бизнес задачу, и сделаете его для друга за банан - формально вы фрилансер 💲.

Поэтому в своей работе наставником я и делаю упор именно на создание пет-проектов 😎.

И поэтому в курсе, который я запускал в прошлом году, ребята разрабатывали проект для условной кофейни с системой лояльности ☕️.

Это самый универсальный вариант проекта. Замените кофейню на салон красоты или шиномонтажку, кодовая база останется прежней🔝.


В феврале стартует второй поток курса по разработке пет-проектов на Spring Boot 🚀

Формат:

🔣 Длительность: 3 месяца.
🔣 Уроки: раз в неделю.
🔣 Онлайн созвоны: раз в две недели.

Что получите на выходе?
Каждый участник создаст приложение для кофейни:

Веб-интерфейс для сотрудников.
Telegram-бот для клиентов.
Деплой на реальном сервере

Кодовая база универсальна – её можно адаптировать под любой бизнес: салон красоты, шиномонтаж, цветочный магазин.

Бонусы:

Бонусом каждый участник получит

❤️ Набор теории по Java Core, Spring и Hibernate для подготовки к собесам.
❤️ Доступ в закрытый чат с моими выпускниками, где большинство уже трудоустроены

Хочешь участвовать?

Чуть позже расскажу больше о формате и стеке технологий.
А пока ставь "+" в комментах и я расскажу как попасть на курс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍63
Скрытая фича Spring Boot: Автогенерация Banner

Привет, народ!
Попробую порадовать вас серией постов со скрытыми (и не очень) фичами Spring-Boot.

И начнем мы с фичи, внедрив которую, именно ты станешь самым стильным разрабом на районе и больше никто не вспомнит про сына маминой подруги 😎

Погнали 💨

Надоела скучная надпись SPRING-BOOT при старте приложения?
А знал ли ты, что баннер - это место для твоей рекламы? 😏

Как изменить баннер?

Просто добавь файл banner.txt в папку src/main/resources/ и напиши в нем любой ASCII-текст.

Автоматическая генерация баннера

Если не хочешь писать ASCII-арт вручную, используй генератор: Spring Boot Banner Generator.

Поддержка переменных

В banner.txt можно использовать переменные, которые будут подставляться при запуске приложения. Например:

Application: ${application.version}
Spring Boot: ${spring-boot.version}


Эти переменные берутся из application.properties или application.yml, а также системных свойств Spring Boot.

Некоторые полезные переменные:

${spring-boot.version} – версия Spring Boot
${application.version} – версия приложения (если указана в pom.xml или build.gradle)
${java.version} – версия Java
${user.name} – имя текущего пользователя системы

Куда выводятся переменные?

Все переменные, указанные в banner.txt, выводятся в консоль при старте приложения, перед логами Spring Boot. Это позволяет сразу увидеть информацию о версии приложения, среде выполнения и других параметрах.

Альтернативные форматы

Можно использовать изображения (banner.jpg, banner.png) или даже файлы .gif, а Spring Boot сам преобразует их в ASCII.

Вариант с картинками у меня не заработал 🗿.
Но в инете пишут, что такое точно можно провернуть 😅.
Если у тебя получится, закинь решение в комментах и можешь выкидывать на помойку гайды по пикапу, потому-что отныне все телочки будут... так всё, посты моя мама читает, (мама привет), поэтому немного сбавим пыл 😂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥104😁3👍2
Что выведется на консоль?

Потыкайте в опрос ниже 👇

Ставь лайк, если нужен разбор этой темы ☺️
👍121
Всем привет!

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

Все это в амбициозных планах, которые разбиваются о мою ленивую жопу 🍑

Можно было бы списать все на большую загруженность, сбитый режим, нехватку времени, магнитные бури и на Венеру не в том доме, но... есть подозрение, что виновник торжества где-то внутри, а не снаружи 🗿.

Поэтому, пока что, вместо сочного видоса или моего бородатого лица в кружопеле, я подготовил для вас маленькую статейку на тему того,

Почему 0.1 + 0.2 != 0.3 в Java?

Судя по распределению голосов выше - победил Трамп почитать ее было бы полезно всем, кто тыкнул не в false 😅
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍6🔥4🤣2👎1
Иногда мне пишут: Анзор, интеграция поломалась.

Тут несколько вариантов:
1. Интеграция просто выключена
2. Интеграция поломалась
3. Увольняться

Увы, пока что вариант 3 неприемлем, так что разбираемся с тем, включена ли интеграция или выключена.

Стоит сказать, что данная интеграция запрашивает данные из внешнего сервиса и сохраняет в нашу базу.

Запрашивает прямо селектом из внешней базы.

И как-то раз, мы всю базу внешнему сервису и положили.

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


Ну так вот, первый переключатель находится в таблице системных настроек. В нем простой true/false. Чтобы можно было включать и выключать в рантайме.

А второй - в application.yml

Тоже true/false пропертя.

Над сервисом, который отвечает за логику интеграции стоит @ConditionalOnProperty и сервис интеграции зависит от этой самой проперти.


А теперь загадка:
Как посмотреть с каким значением этой проперти сервис задеплоили на прод?

Приложуха крутится в докере, к нему есть доступ.

Актуатора нет(

Накидывайте варианты, и позже расскажу как я выучил команду docker cp ⭐️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥43😨1
Всем привет!

Пропал на какое-то время. Буду исправляться.

Сейчас в разработке обучающий видос по ACID и Transactional 🔥

Одна из любимых тем на собесах 🤌

Хочу максимально упростить освоение этой приблуды 🤓

Расскажу про уровни изоляции транзакций.

Разберем транзакции в Spring
различные варианты propagation аннотации Transactional.

Выложу ориентировочно завтра, так что до встречи на ютубе 🤝
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥174👍3
This media is not supported in your browser
VIEW IN TELEGRAM
👍96👌2
Так, ребят, всем привет!

Я короче понял, что постов про Java делать не хочу.

1. Есть дофига каналов, где это итак делается. Например вот
2. Вся эта инфа итак есть в инете в больших объемах. И как-то изгаляться, чтобы написать как-то иначе о том, что уже 1000 раз обсосали - ну такое себе.

Несмотря на это я хочу приносить пользу, поэтому:

1. У нас есть чат, где вы можете задать вообще любой около-джавный вопрос - и получить ответ (более менее адекватный)
2. Мне понравилось делать видосы на ютюб. Вот там буду рассказывать и показывать что-то полезное (возможно)

А что тут?

Здесь хочу писать о себе, делиться мыслями, страхами, успехами и неудачами. Короче обычные, человечные, эмоциональные посты.

А то, чесслово, уже устал оправдываться перед собой за то, что посты не пишу про фишки джавы и тонкости спринга. Не хочу)
🔥14👍82
Я, в общем-то, неплохой прогер. Но когда дело касается железа, я вообще нуб-нубяра.

Мне всегда было влом разбираться в железе, в том, какие видюхи топ, и что такое DDR3-4-5. А что у процов есть поколения — я вообще понял недавно.

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

Когда я закончил универ, я купил себе комп за 50к. Б/у. Он был хороший. До тех пор, пока я не решил его почистить. После моей чистки сгорело всё: материнка, видюха, проц, звуковая карта, оперативка. 🔥💀

И я заменил это всё чем-то, что влезло в корпус и в мой бюджет:

🖥 Материнка
ASUSTeK COMPUTER INC. B85M-E Rev X.0x microATX

⚙️ Проц
Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz, 4 cores

🧠 16 ГБ ОЗУ DDR3

⚡️ БП
Corsair VS 650W

🎮 Видюха
Radeon RX 570 Series

Как говорится: «Я его слепила из того, что было, ну а то, что было, то и полюбила».

Любовь эта длилась долго. Даже не любовь. Такой пресный брак, без радостей супружеской жизни. 😅

Я мог программировать — и хорошо. Ну а потом я устроился в Dins, и там мне дали ноут мечты:

💻 ThinkPad T14, i7 и 32 ГБ оперативки.

Так я и жил, пока не начал заниматься монтажом. И тут мои девайсы стали давиться объёмами возложенных на них задач. 🎬

Установка «я не могу купить себе новый комп, потому что это очень дорого» мешала наслаждаться процессом.

Я всё время искал какие-то обходные пути. Открыл для себя сервисы облачного гейминга, где можно арендовать мощное железо и работать условно через RDP.

Юзал два таких сервиса:
🎮 Warplay, Gatoga.

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

Но я арендую квартиру, и инет тут не быстрый. Так что приходилось мириться с фризами и обрывами соединения. 📶😩

Терпелка у меня не резиновая, и в какой-то момент лопнула.

Стал смотреть варианты и грустить. Нужно было 200–300к на нормальный комп. Выше я писал, что я нубяра в железе, поэтому вообще не понимал, как собрать что-то адекватное, но подешевле.

Потом открыл Озон и увидел, что там прям топовый комп продают за 100+ 😳.

Я, конечно, не стал там ничего брать и попросил помощи у брата, который шарит за железо.

И он помог мне собрать комплектующие, суммарно на 131к.

💰 Жёну успокоил факт, что я потрачу на 170к меньше, чем мог, да и я сам остался довольным 😎.

Погамал в игрушки, монтаж летает 🚀.

Хочется в это всё впихнуть полезную мысль, которую я для себя открыл.

Часто мы думаем, что не можем что-то сделать. Если поменять угол восприятия и задаться вопросом: «А как я могу это сделать?», то, скорее всего, окажется, что невозможность рассеется, и вы увидите разные варианты обретения желаемого.

Всем пис, обретайте желаемое! И если интересно подробнее про новый комп узнать — напишите в комментах! 😃
❤‍🔥8👍8🔥7