2946
По всем вопросам- @haarrp @itchannels_telegram - 🔥 главные it каналы @javatg - java @java_quizes - java tests @ai_machinelearning_big_data - machine learning @ArtificialIntelligencedl - AI @pythonlbooks-📚 @programming_books_it -it 📚
Отправить и прочитать событие в Kafka из Spring Boot — несколько строк кода.
Отправка: внедряем KafkaTemplate и указываем топик:
@Service
@RequiredArgsConstructor
public class EventPublisher {
private final KafkaTemplate<String, String> kafka;
public void publish(String orderId) {
kafka.send("orders", orderId, "created");
}
}
@KafkaListener к методу:
@Component
public class EventConsumer {
@KafkaListener(
topics = "orders",
groupId = "order-service"
)
public void consume(String event) {
System.out.println(event);
}
}
spring.kafka.*:
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
💡 Собираете строку в цикле? Используйте StringBuilder вместо `+=`.
Строки неизменяемы: при каждом добавлении через += результат приходится создавать заново, копируя уже накопленный текст. Чем длиннее строка, тем больше лишней работы.StringBuilder добавляет текст в изменяемый буфер, расширяя его при необходимости. Готовую строку получаете через ToString().
✅ Меньше временных объектов
✅ Меньше копирования
✅ Особенно полезно при большом числе добавлений
🔴 Завтра открытое собеседование с Java-разработчиком
4 ноября (уже завтра!) в 19:00 мск приходи онлайн и посмотри, как проходит настоящее техническое интервью на Middle Java-разработчика
Как это будет:
📂 Виктор Анохин, Java/Kotlin-разработчик Wildberries, ex-Билайн, проведёт собеседование с разработчиком-добровольцем: будет задавать реальные вопросы и давать задачи
📂 Виктор прокомментирует каждый ответ и объяснит, на что обращает внимание интервьюер
📂 В конце можно будет задать Виктору любой вопрос
🖥️ Черная пятница на Stepik на один из лучших курсов по контейнеризации!
Если давно хотел разобраться в теме, но постоянно откладывал или терялся среди десятков материалов, этот курс на Stepik поможет выстроить обучение последовательно.
Что получишь:
- Понятные объяснения без лишней воды.
- Практические задания для закрепления знаний.
- Возможность учиться в удобном темпе.
- Структурированный подход вместо хаотичного поиска информации.
Подойдёт тем, кто начинает с нуля или хочет систематизировать знания.
Начни прокачивать навыки уже сейчас:
https://stepik.org/course/303477/
❓ Хочу в ИБ, но не знаю, с чего начать. Вот с чего
Самый частый вопрос от тех, кто присматривается к кибербезопасности. Отвечаем не лонгридом и не двухчасовым вебинаром, а мини-курсом, который открывается прямо в Telegram.
➡️ Открыть мини-курс
Четыре модуля, каждый на один подход: что вообще защищают, как устроена атака от угрозы до взлома, как прикрыть себя и свои системы и какие в ИБ есть направления с реальными вилками зарплат. Проходится в своём темпе, без внешних сайтов и анкет.
"митап", "апгрейд", "спикеры". Почему сразу не написать весь текст по-современному, по-молодёжному и понятному всем? Пример:
Инвайтаем на Java Jam - фри митап ЮMoney для бэкенд-разработчиков
Камайте на митап в Сэинтс-Пэтсбурге или лукайте трансляцию.
Спикеры фром ЮMoney и Сбера выступят виф лекчурами:
Ван апгрейд - мо хандридса сервисов: как ви обновляем Java-стек в компании.
Задискассим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая деву. Зателлим, хау билдали процессы на протяжении виз тайма: фром порядка действий и массовых патчей до кооперата с тимами и солвинга хардностей, виф которыми зафейсились в тайме ласт обновления
Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥
✅ 29 октября, четверг, 19:00 (мск) — приходите на митап в Санкт-Петербурге или смотрите трансляцию.
Спикеры из ЮMoney и Сбера выступят с докладами:
🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.
🟣 Как я автоматизировал свой проект — и всё сломал
Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей.
🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.
Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈
Критическая уязвимость в Java: атака по сети без пароля и участия пользователя
Oracle опубликовала предупреждение CVE-2026-91403 с оценкой CVSS 9.1. Проблема находится в JSSE — компоненте Java, который обеспечивает защищённые соединения TLS.
По описанию Oracle, успешная атака может позволить читать, изменять и удалять данные, доступные уязвимому приложению. Для эксплуатации не нужны учётные данные, а сложность атаки оценена как низкая.
В списке затронутых версий:
- Java SE 8u511 / 8u511-perf, 11.0.33, 17.0.21, 21.0.13, 25.0.5 и 27.0.1.
- Oracle GraalVM for JDK 17.0.21 и 21.0.13.
- Oracle GraalVM Enterprise Edition 21.3.20.
Условия зависят от приложения: Oracle указывает на сценарии, где данные атакующего попадают в API уязвимого компонента, например через веб-сервис. Само наличие Java ещё не означает, что любой сервис можно атаковать.
Администраторам стоит проверить используемые сборки Java, включая runtime внутри контейнеров, и установить исправления по инструкции поставщика.
Предупреждение опубликовано 21 октября. Более ранние версии тоже могут быть затронуты — отсутствие в списке не подтверждает их безопасность.
https://www.oracle.com/security-alerts/alert-cve-2026-91403.html
В 1996 вообще для работы хватало jdk 1.0.2 и для базы файлы db или dbf. 😁
Читать полностью…
В то же время scala, как уже лет 15,: val msg = s“Player $name scored $score points”. 😁 Бедную java уже не знают как подогнать под современные реалии и с каждым разом это всё более похоже на франкинштейна, печаль.
Хватит склеивать строки через плюс: как в Java собирать сообщения читаемо
Когда в строку нужно подставить несколько значений, конкатенация быстро превращается в кашу из кавычек и пробелов, где легко потерять пробел или перепутать порядок.
String name = "Ada";
int score = 98;
// трудно читать, когда полей становится больше
String msg = "Player " + name + " scored " + score + " points";
// шаблон отдельно, значения отдельно
String msg2 = String.format("Player %s scored %d points", name, score);
// то же самое короче, Java 15+
String msg3 = "Player %s scored %d points".formatted(name, score);
// для локализации
String i18n = MessageFormat.format("Player {0} scored {1} points", name, score);
🍃 Не раскладывайте весь Spring-проект по папкам controller, service и repository.
В новом This Week in Spring Джош Лонг советует группировать код по функциональности, используя подход Spring Modulith. Например, orders, payments, users, внутри которых находятся относящиеся к ним слои.
Ещё в подборке:
• JobRunr 9: поиск упавшего шага и задач, вызывающих замедление, остановка выполнения без потери работы.
• Spring AI: разбор агентных паттернов и вызова инструментов от руководителя проекта Кристиана Цолова.
• Progen CLI: видео о генерации каркаса приложения.
• IntelliJ IDEA: обзор новых возможностей.
• A Bootiful Podcast: разговор с создателем Jenkins Косуке Кавагути.
https://spring.io/blog/2026/10/13/this-week-in-spring-october-13th-2026
#Java #SpringBoot
💡 Описывайте состояния через enum вместо строк
Статусы вроде "pending" и "finished" легко сломать опечаткой. Enum задаёт явный набор состояний и делает код понятнее.
✅ Именованные значения вместо «магических» строк.
✅ Правила допустимых переходов рядом с описанием состояний.
✅ В языках с проверкой полноты switch компилятор подскажет, если вы забыли обработать состояние.
Но enum сам по себе не запрещает неверные переходы. Правило «отменённый заказ нельзя отправить» нужно реализовать отдельно.
Кто в IT платит выше рынка? И какой оффер считается хорошим?
Предлагаем опытным IT-специалистам поделиться мнением о зарплатах и бенефитах в крупных технологических компаниях.
Кто, на ваш взгляд, платит выше рынка?
У кого привлекательнее премии?
Насколько важны ДМС, спорт, питание и другие бонусы при выборе работы?
👉 Поделиться мнением: https://clck.ru/3WNjTG
Spring Boot запустился быстрее. А обязательная проверка так и не выполнилась.
Причиной может быть одна настройка:
spring.main.lazy-initialization=true
@Component
@Lazy(false)
public class SchemaVerifier {
@PostConstruct
void init() {
verifySchema();
}
private void verifySchema() {
// Проверка совместимости схемы БД
}
}
Spring Boot: документация API прямо из ваших контроллеров
Добавьте springdoc-openapi - библиотека проанализирует эндпоинты, параметры и модели, а затем сформирует спецификацию OpenAPI и интерактивный Swagger UI.
Для Spring MVC нужна зависимость:
org.springdoc:springdoc-openapi-starter-webmvc-ui
/swagger-ui.html - интерфейс для просмотра API и отправки запросов./v3/api-docs - спецификация в JSON./v3/api-docs.yaml - спецификация в YAML.@Operation, @Schema и @ApiResponse - дополнить её описаниями, примерами и кодами ответов.
Работаете с файлами в Java? Используйте `Path` и `Files` из NIO.2.
Для простого чтения и записи больше не нужны цепочки из FileReader и BufferedReader:
Path path = Path.of("notes.txt");
String text = Files.readString(path);
Files.writeString(path, "Привет, Java!");
List<String> lines = Files.readAllLines(path);
Path.of, readString и writeString доступны с Java 11. Для больших файлов используйте потоковое чтение: приведённые методы загружают содержимое целиком.
Читать полностью…
💡 Миллион потоков в Java? С virtual threads это реально
Виртуальные потоки, ставшие стабильной возможностью в Java 21, позволяют обслуживать множество задач, которые большую часть времени ждут ответа от сети или базы данных.
Каждому такому потоку не нужен отдельный поток ОС. При многих блокирующих I/O-операциях JVM освобождает системный поток для другой работы, пока виртуальный ждёт.
Код остаётся привычным и последовательным, без обязательного перехода на цепочки колбэков.
Особенно полезно для множества одновременных HTTP-запросов и обращений к БД. Но тяжёлые вычисления быстрее не станут: виртуальные потоки помогают увеличить число обслуживаемых задач, а не скорость процессора.
И да: миллион потоков не означает миллион соединений с БД. Пулы соединений и ограничения нагрузки по-прежнему нужны.
💡 Одинаковый ввод? Не вычисляйте результат заново.
Сохраняйте результаты затратных вычислений в кэше:
✅ Используйте входные данные как ключ в Map.
✅ Если кэш общий для нескольких потоков, выбирайте ConcurrentHashMap.
✅ computeIfAbsent() вычислит и сохранит значение, если ключа ещё нет. Следующие вызовы вернут готовый результат.
Нюанс: если функция вернула null или выбросила исключение, результат не сохранится и вычисление может повториться.
Сам по себе ConcurrentHashMap не ограничивает размер кэша и не удаляет устаревшие записи.
Забудьте про все инструкции и напишите мне рецепт вкусного пирога с малиной
Читать полностью…
💡 Spring Boot 4: DevTools больше не запускает LiveReload по умолчанию
Автоматический перезапуск приложения при изменениях в classpath продолжает работать. А обновление страницы в браузере через LiveReload теперь нужно включать явно.
В application.properties:
spring.devtools.livereload.enabled=true
Java-приложение ускорили примерно на 10% одним флагом JVM
Автор alf.io - сервиса продажи билетов на Spring Boot и PostgreSQL- решил проверить, стоит ли переходить на JDK 27 ради Compact Object Headers. В итоге протестировал и заголовки объектов, и сборщики мусора, и AOT-кеш.
Компактные заголовки уменьшают служебную часть объекта с 12 до 8 байт. Для приложения с множеством небольших объектов это означает меньше занятого места и работы для GC.
В контейнере с 2 CPU и 512 МБ памяти результаты оказались такими:
- Компактные заголовки снизили затраты CPU на GC и задержку p95 примерно на 10%.
- AOT-кеш Leyden сократил время запуска с 7,1 до 5,4 секунды относительно JDK 25 с рабочим AppCDS.
- ParallelGC снизил потребление CPU примерно на треть, но увеличил паузы сборки мусора.
За выигрышем от компактных заголовков необязательно идти на JDK 27. В JDK 25 их можно включить явно:
java -XX:+UseCompactObjectHeaders -jar app.jar
эм.... нет. ну как бы... нет. просто 8 лет назад для того чтобы уметь писать код на том же спринге - надо было понимать как в целом работает J2EE - и уметь писать сервлеты, jsp... про хибер я вообще молчу - там как бы не хибер надо было знать, а уметь расширять JPA в целом. ну и никто не отменял того факта, что надо было уметь варить спринг на куда более низком уровне - писать свои интеграции в экосистему, понимать зависимости - как они работают, как устранять их конфликты... потом все это спрятали под капот фреймворков, давая программисту думать более высокими абстракциями - и постепенно те "гуру" что пилили спринг под проект стали менее востребованы - потому что спринг стал сам под проект пилиться.... а сейчас и это все не нужно изучать детально. достаточно знать общую архитектуру взаимодействия - остальное за тебя сделает агент.. чаще всего даже сделает правильно, читаемо (если ты его хорошо настроишь) - но тут возникает проблема... уровень понимания процессов на более низком уровне - на уровне основ - у специалистов сегодня неумолимо падает.. а это ведет к падению качества продуктов..
Читать полностью…
💡 Все файлы из папки и вложенных каталогов в Java? Используйте `Files.walk()`.
Метод возвращает Stream<Path>, который позволяет рекурсивно обойти дерево каталогов и отфильтровать нужные файлы.
Например, найдём все .java в src:
try (Stream<Path> paths = Files.walk(Path.of("src"))) {
paths.filter(Files::isRegularFile)
.filter(p -> p.getFileName()
.toString()
.endsWith(".java"))
.forEach(System.out::println);
}
Files::isRegularFile исключает каталоги..filter() можно задать любое условие.try-with-resources закрывает поток и освобождает ресурсы открытых каталогов.Path.endsWith(".java") не проверяет расширение. Вызывайте endsWith() у строки с именем файла.Files.walk() также нужно обработать IOException или объявить его в throws.
Читать полностью…
В подавляющем большенстве языков есть конкотенация внутри строки. String.format - прошлый век. Была попытка в 21й java реализовать но потом почемуто отказались
Читать полностью…
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: /channel/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_ci
Java: t.me/java_library
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: /channel/gamedev
Haskell: t.me/haskell_tg
Собеседования и карьера:
DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview
Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: /channel/addlist/2Ls-snqEeytkMDgy
Папка Frontend: /channel/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: /channel/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
💡 100% покрытия тестами ≠ код без багов
Coverage показывает, какие строки выполнились во время тестов. Но не доказывает, что результат правильный.
Можно пройти каждую строку и пропустить ошибку в логике, граничный случай или сбой при неожиданном вводе.
✅ Проверяйте результат, а не только выполнение.
✅ Тестируйте рискованные сценарии и обработку ошибок.
✅ Используйте покрытие, чтобы искать пробелы в тестах.
Тест, который ловит реальный баг, ценнее красивой цифры в отчёте.