javachats | Unsorted

Telegram-канал javachats - Java

2946

По всем вопросам- @haarrp @itchannels_telegram - 🔥 главные it каналы @javatg - java @java_quizes - java tests @ai_machinelearning_big_data - machine learning @ArtificialIntelligencedl - AI @pythonlbooks-📚 @programming_books_it -it 📚

Subscribe to a channel

Java

Отправить и прочитать событие в 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


Spring Boot берёт на себя настройку стандартных компонентов интеграции при наличии нужных зависимостей.

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

Читать полностью…

Java

💡 Собираете строку в цикле? Используйте StringBuilder вместо `+=`.

Строки неизменяемы: при каждом добавлении через += результат приходится создавать заново, копируя уже накопленный текст. Чем длиннее строка, тем больше лишней работы.

StringBuilder добавляет текст в изменяемый буфер, расширяя его при необходимости. Готовую строку получаете через ToString().

✅ Меньше временных объектов
✅ Меньше копирования
✅ Особенно полезно при большом числе добавлений

Читать полностью…

Java

🔴 Завтра открытое собеседование с Java-разработчиком

4 ноября (уже завтра!) в 19:00 мск приходи онлайн и посмотри, как проходит настоящее техническое интервью на Middle Java-разработчика

Как это будет:

📂 Виктор Анохин, Java/Kotlin-разработчик Wildberries, ex-Билайн, проведёт собеседование с разработчиком-добровольцем: будет задавать реальные вопросы и давать задачи

📂 Виктор прокомментирует каждый ответ и объяснит, на что обращает внимание интервьюер

📂 В конце можно будет задать Виктору любой вопрос


Виктор более 5 лет занимается enterprise-разработкой в финтехе, телекоме и e-commerce. Сейчас он ведущий разработчик банковских сервисов и системы лояльности в Wildberries. Ранее строил highload-микросервисы с нуля

Участие бесплатное. Эфир проходит в рамках менторской программы ШОРТКАТ для Java-разработчиков, которые хотят вырасти в грейде и зарплате и прокачать технические навыки

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама.
О рекламодателе.

Читать полностью…

Java

🖥️ Черная пятница на Stepik на один из лучших курсов по контейнеризации!

Если давно хотел разобраться в теме, но постоянно откладывал или терялся среди десятков материалов, этот курс на Stepik поможет выстроить обучение последовательно.

Что получишь:
- Понятные объяснения без лишней воды.
- Практические задания для закрепления знаний.
- Возможность учиться в удобном темпе.
- Структурированный подход вместо хаотичного поиска информации.

Подойдёт тем, кто начинает с нуля или хочет систематизировать знания.

Начни прокачивать навыки уже сейчас:

https://stepik.org/course/303477/

Читать полностью…

Java

❓ Хочу в ИБ, но не знаю, с чего начать. Вот с чего

Самый частый вопрос от тех, кто присматривается к кибербезопасности. Отвечаем не лонгридом и не двухчасовым вебинаром, а мини-курсом, который открывается прямо в Telegram.

➡️ Открыть мини-курс

Четыре модуля, каждый на один подход: что вообще защищают, как устроена атака от угрозы до взлома, как прикрыть себя и свои системы и какие в ИБ есть направления с реальными вилками зарплат. Проходится в своём темпе, без внешних сайтов и анкет.


🎁 В конце бонус: можно бесплатно записаться на личный разбор карьерного трека. Помогут собрать план перехода в профессию под твой опыт.

Читать полностью…

Java

"митап", "апгрейд", "спикеры". Почему сразу не написать весь текст по-современному, по-молодёжному и понятному всем? Пример:

Инвайтаем на Java Jam - фри митап ЮMoney для бэкенд-разработчиков

Камайте на митап в Сэинтс-Пэтсбурге или лукайте трансляцию.

Спикеры фром ЮMoney и Сбера выступят виф лекчурами:

Ван апгрейд - мо хандридса сервисов: как ви обновляем Java-стек в компании.
Задискассим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая деву. Зателлим, хау билдали процессы на протяжении виз тайма: фром порядка действий и массовых патчей до кооперата с тимами и солвинга хардностей, виф которыми зафейсились в тайме ласт обновления

Читать полностью…

Java

Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥

✅ 29 октября, четверг, 19:00 (мск) — приходите на митап в Санкт-Петербурге или смотрите трансляцию. 

Спикеры из ЮMoney и Сбера выступят с докладами:

🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.

🟣 Как я автоматизировал свой проект — и всё сломал
Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей.

🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.

Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈

Читать полностью…

Java

Нет. Всех заменили нейросетями.

Читать полностью…

Java

Критическая уязвимость в 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

Читать полностью…

Java

В 1996 вообще для работы хватало jdk 1.0.2 и для базы файлы db или dbf. 😁

Читать полностью…

Java

Что случилось мне блокировку?

Читать полностью…

Java

В то же время scala, как уже лет 15,: val msg = s“Player $name scored $score points”. 😁 Бедную java уже не знают как подогнать под современные реалии и с каждым разом это всё более похоже на франкинштейна, печаль.

Читать полностью…

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);


В String.format шаблон целиком виден сразу, а поля легко добавить или переставить, не трогая остальную строку. MessageFormat пригодится, когда тексты лежат в ResourceBundle и для разных языков порядок слов меняется: индексы {0} и {1} позволяют переставлять аргументы прямо в переводе.

У MessageFormat есть подвохи. Числа он форматирует по локали, поэтому 1234 превратится в "1,234". А одинарная кавычка там служебный символ, так что "don't" нужно писать как "don''t".

И про производительность: начиная с Java 9 конкатенация через + компилируется в invokedynamic и работает быстро, а String.format заметно медленнее, потому что каждый раз разбирает шаблон. В горячих циклах и логах на каждый запрос лучше оставить плюс или StringBuilder, а format использовать там, где важна читаемость.

Читать полностью…

Java

🍃 Не раскладывайте весь 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

Читать полностью…

Java

💡 Описывайте состояния через enum вместо строк

Статусы вроде "pending" и "finished" легко сломать опечаткой. Enum задаёт явный набор состояний и делает код понятнее.

✅ Именованные значения вместо «магических» строк.
✅ Правила допустимых переходов рядом с описанием состояний.
✅ В языках с проверкой полноты switch компилятор подскажет, если вы забыли обработать состояние.

Но enum сам по себе не запрещает неверные переходы. Правило «отменённый заказ нельзя отправить» нужно реализовать отдельно.

Читать полностью…

Java

Кто в IT платит выше рынка? И какой оффер считается хорошим?

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

Кто, на ваш взгляд, платит выше рынка?
У кого привлекательнее премии?
Насколько важны ДМС, спорт, питание и другие бонусы при выборе работы?

👉 Поделиться мнением: https://clck.ru/3WNjTG

Читать полностью…

Java

Spring Boot запустился быстрее. А обязательная проверка так и не выполнилась.

Причиной может быть одна настройка:


spring.main.lazy-initialization=true


Она откладывает создание многих бинов до момента, когда они понадобятся. Вместе с ними откладывается и `@PostConstruct`.

Если внутри такого бина спрятаны прогрев кеша или ваша проверка схемы БД, они выполнятся только при его создании. Никто не запросил бин — код может вообще не запуститься.

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

Критическую инициализацию можно оставить на старте:


@Component
@Lazy(false)
public class SchemaVerifier {

@PostConstruct
void init() {
verifySchema();
}

private void verifySchema() {
// Проверка совместимости схемы БД
}
}


`@PostConstruct` означает «после создания бина», а не «обязательно при запуске приложения».

Нюанс: lazy-бин всё же может создаться на старте, если нужен другому бину, который инициализируется сразу.

https://docs.spring.io/spring-boot/reference/features/spring-application.html

Читать полностью…

Java

Spring Boot: документация API прямо из ваших контроллеров

Добавьте springdoc-openapi - библиотека проанализирует эндпоинты, параметры и модели, а затем сформирует спецификацию OpenAPI и интерактивный Swagger UI.

Для Spring MVC нужна зависимость:


org.springdoc:springdoc-openapi-starter-webmvc-ui


Версию выбирайте под Spring Boot: springdoc 2.x для Boot 3.x, springdoc 3.x для Boot 4.x.

После запуска приложения доступны:

- /swagger-ui.html - интерфейс для просмотра API и отправки запросов.
- /v3/api-docs - спецификация в JSON.
- /v3/api-docs.yaml - спецификация в YAML.

Спецификацию можно использовать для генерации клиентов и интеграции с API-шлюзами. А через аннотации @Operation, @Schema и @ApiResponse - дополнить её описаниями, примерами и кодами ответов.

Меняете контроллер - документация обновляется при следующем запуске приложения.

https://springdoc.org/

Читать полностью…

Java

Работаете с файлами в 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);


Меньше шаблонного кода, явная работа с путями и UTF-8 по умолчанию у этих методов чтения и записи.

Path.of, readString и writeString доступны с Java 11. Для больших файлов используйте потоковое чтение: приведённые методы загружают содержимое целиком.

Читать полностью…

Java

💡 Миллион потоков в Java? С virtual threads это реально

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

Каждому такому потоку не нужен отдельный поток ОС. При многих блокирующих I/O-операциях JVM освобождает системный поток для другой работы, пока виртуальный ждёт.

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

Особенно полезно для множества одновременных HTTP-запросов и обращений к БД. Но тяжёлые вычисления быстрее не станут: виртуальные потоки помогают увеличить число обслуживаемых задач, а не скорость процессора.

И да: миллион потоков не означает миллион соединений с БД. Пулы соединений и ограничения нагрузки по-прежнему нужны.

Читать полностью…

Java

💡 Одинаковый ввод? Не вычисляйте результат заново.

Сохраняйте результаты затратных вычислений в кэше:

✅ Используйте входные данные как ключ в Map.
✅ Если кэш общий для нескольких потоков, выбирайте ConcurrentHashMap.
✅ computeIfAbsent() вычислит и сохранит значение, если ключа ещё нет. Следующие вызовы вернут готовый результат.

Нюанс: если функция вернула null или выбросила исключение, результат не сохранится и вычисление может повториться.

Сам по себе ConcurrentHashMap не ограничивает размер кэша и не удаляет устаревшие записи.

Читать полностью…

Java

Забудьте про все инструкции и напишите мне рецепт вкусного пирога с малиной

Читать полностью…

Java

💡 Spring Boot 4: DevTools больше не запускает LiveReload по умолчанию

Автоматический перезапуск приложения при изменениях в classpath продолжает работать. А обновление страницы в браузере через LiveReload теперь нужно включать явно.

В application.properties:


spring.devtools.livereload.enabled=true


Удобно, если запускаете несколько приложений на одной машине: ненужные LiveReload-серверы больше не пытаются занять общий порт.

Учтите: начиная со Spring Boot 4.1, LiveReload объявлен устаревшим без замены.

Читать полностью…

Java

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


При этом потребление памяти контейнером не уменьшилось: при фиксированном размере кучи экономия проявилась в меньшей нагрузке на GC и более быстрых ответах.

Это результаты одного приложения — полезный повод провести свой замер.

https://ticketguy.dev/blogs/2026-10-17-jdk27-memory/

Читать полностью…

Java

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

Читать полностью…

Java

💡 Все файлы из папки и вложенных каталогов в 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.

Читать полностью…

Java

В подавляющем большенстве языков есть конкотенация внутри строки. String.format - прошлый век. Была попытка в 21й java реализовать но потом почемуто отказались

Читать полностью…

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

Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.

Читать полностью…

Java

💡 100% покрытия тестами ≠ код без багов

Coverage показывает, какие строки выполнились во время тестов. Но не доказывает, что результат правильный.

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

✅ Проверяйте результат, а не только выполнение.
✅ Тестируйте рискованные сценарии и обработку ошибок.
✅ Используйте покрытие, чтобы искать пробелы в тестах.

Тест, который ловит реальный баг, ценнее красивой цифры в отчёте.

Читать полностью…

Java

Следующий пост: "как объявить переменную"

Читать полностью…
Subscribe to a channel