Java Portal | Программирование
12.4K subscribers
1.11K photos
91 videos
36 files
978 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
На реальном собеседовании по Java задать вот такой простой вопрос — не лучший способ проверить, насколько кандидат реально разбирается в теме. Поэтому часто добавляют сценарий, чтобы оценить глубину понимания.

Как заставить три потока — T1, T2 и T3 — выполняться строго по очереди, один за другим?

Сценарий:

Ты разрабатываешь пайплайн обработки данных, который состоит из трёх этапов:

Скачивание данных с удалённого источника,

Обработка скачанных данных,

Сохранение результатов в базу данных.

Каждый этап должен выполняться в отдельном потоке, но строго последовательно: второй этап начинается только после завершения первого, а третий — только после второго. Как реализовать это, чтобы гарантировать порядок выполнения?

Подсказка:

Метод Thread.join() позволяет одному потоку дождаться завершения другого. Когда поток вызывает t.join(), он приостанавливает своё выполнение и ждёт, пока поток t не завершится.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3
Как @Component в Spring управляет зависимостями

В статье объясняется, что аннотация @Component помечает класс как bean, Spring сканирует такие классы и создаёт экземпляры для автосвязывания. @Component — основа для @Service, @Repository и @Controller, важная деталь DI в Spring.

Подробности: http://www.java67.com/2023/04/what-is-component-annotation-in-spring.html

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: используй spring-boot-starter-mail для отправки писем.

Этот стартер включает все необходимые зависимости и настройки, делая процесс отправки писем простым и понятным.

// Добавь зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

// Настрой параметры почты в application.properties (или application.yml):
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=my_email@gmail.com
spring.mail.password=my_password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

// Используй JavaMailSender в коде:
...
@Autowired
private JavaMailSender mailSender;

public void sendEmail(String to, String subject, String text) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(to);
message.setSubject(subject);
message.setText(text);
message.setFrom("your_email@gmail.com");

mailSender.send(message);
}
...


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
213👍3🔥2
PocketBase — лёгкий open-source бэкенд в одном файле для быстрого создания приложений с базой данных, аутентификацией, хранением файлов и панелью администратора. Идеален для прототипов и небольших проектов.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥2
Совет по продвинутому использованию Spring

Используйте Spring SSEEvent для плавных реальных обновлений в ваших приложениях.

@GetMapping("/events")
public Flux<ServerSentEvent<String>> events() {
return Flux.interval(Duration.ofSeconds(1)) // каждую секунду создаётся новое событие
.map(sequence -> ServerSentEvent.<String>builder()
.id(String.valueOf(sequence)) // задаём ID события
.event("message") // тип события (можно использовать для фильтрации на клиенте)
.data("Event #" + sequence + " @ " + LocalTime.now()) // данные события
.build());
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2
Вся линейка JDK уже доступна! Теперь можно использовать все основные сборки Java 25, включая IBM Semeru на движке OpenJ9 🙌

Читай в их блоге, чтобы узнать, как установить свежий JDK в свою IDE.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
8
Spring Boot tip:

Используй CommandLineRunner, если нужно выполнить код сразу после того, как приложение полностью поднялось и контекст инициализирован.

CommandLineRunner — это интерфейс Spring Boot, который позволяет запускать любую логику при старте приложения.

Удобно для:

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

Пример:

@Component
public class StartupRunner implements CommandLineRunner {

@Override
public void run(String... args) {
System.out.println("App started! Further setup");
}
}


Такой класс автоматически выполнится один раз при запуске Spring Boot.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42
Тебе не нужно дробить приложение на 20 репозиториев и 15 сервисов, чтобы получить модульность.
Это можно спокойно реализовать внутри грамотно спроектированного модульного монолита.

1. Разделяй модули по функциональным доменам.

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

2. Определи чёткие интерфейсы между модулями.

Один модуль не должен знать внутренние классы другого.
Общай их через интерфейсы или внутренние события (например, Spring Events).
Так сохраняется слабое связывание и высокая связность.

3. Избегай циклических зависимостей.

Если модуль A зависит от B, убедись, что B никогда не зависит от A.
Разрывай такие циклы с помощью интерфейсов, dependency injection или событий.

4. Придерживайся принципа внутренних слоёв.

В каждом модуле разделяй внутренние части (entities, repositories, services) и то, что наружу (controllers, DTO, API).

5. Рассмотри использование Spring Modulith (для Java/Kotlin).

Он не заставляет переходить на микросервисы, но даёт инструменты для организации модулей, проверки зависимостей и документирования архитектуры.

6. Опционально: подумай о доменных событиях.

Они помогают масштабировать модульность, не ломая монолит.
И если потом решишь вынести модуль отдельно — половина работы уже сделана.

Модульность зависит не от размера системы, а от чёткости её границ.

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
Совет по Spring Boot:

используй spring-boot-starter-logging (на Logback) для логирования — он уже подключён по умолчанию.

spring-boot-starter-logging уже включён во большинство стартеров, например spring-boot-starter-web, spring-boot-starter-data-jpa и т.д.

Можно настраивать уровни логирования, отредактировав application.yml:

logging:
level:
root: INFO
com.myapp: DEBUG


Чтобы изменить формат логов и политику ротации, создай файл logback-spring.xml в каталоге src/main/resources.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
This media is not supported in your browser
VIEW IN TELEGRAM
ChartDB это опенсорс-инструмент для работы с SQL-базами данных через визуальный интерфейс.

Что умеет:

✓ интерактивная диаграмма со всеми таблицами и связями
✓ можно скачать схему как PNG-картинку
✓ поддерживает MySQL, PostgreSQL, SQLite и другие

app.chartdb.io

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Spring Boot: можно выполнять задачи через фиксированные интервалы без настройки Quartz или внешних планировщиков.

Добавь @EnableScheduling в любой конфигурационный или основной класс приложения:

@SpringBootApplication
@EnableScheduling
public class MainApp { }


Используй @Scheduled для метода:

@Component
public class Scheduler {

@Scheduled(fixedRate = 5000)
public void executeTask() {
...
}
}


@EnableScheduling активирует механизм планирования, а @Scheduled задаёт частоту выполнения метода (fixedRate = 5000 — каждые 5 секунд).

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
У тебя есть 3 сервера. Приходит 100 запросов. Как их распределить? Вот возможные варианты:

Алгоритмы балансировки нагрузки

🔸Round Robin (циклический)

- Запрос 1 —> на сервер A
- Запрос 2 —> на сервер B
- Запрос 3 —> на сервер C
- Запрос 4 —> снова на сервер A
- И так по кругу бесконечно

Когда использовать: все сервера одинаковые, запросы примерно равны по времени обработки. Самый простой вариант.

🔸Weighted Round Robin (взвешенный циклический)

- Сервер A: 4 ядра, вес 4
- Сервер B: 8 ядер, вес 8
- Сервер C: 4 ядра, вес 4
- Из каждых 16 запросов: A получает 4, B — 8, C — 4

Когда использовать: мощности серверов разные, нужно распределять нагрузку пропорционально.

🔸Least Connections (наименьшее количество соединений)

- Сервер A: 50 активных соединений
- Сервер B: 30 активных соединений
- Сервер C: 45 активных соединений
- Следующий запрос уходит на сервер B (у него меньше всего соединений)

Когда использовать: запросы обрабатываются разное время, есть долгоживущие соединения, например WebSocket.

🔸Weighted Least Connections (взвешенный по соединениям)

- Сервер A: 50 соединений, 4 ядра → соотношение 12.5
- Сервер B: 30 соединений, 8 ядер → соотношение 3.75
- Сервер C: 45 соединений, 4 ядра → соотношение 11.25
- Следующий запрос идёт на сервер B (самое низкое соотношение)

Когда использовать: сервера разной мощности, при этом соединения держатся долго.

🔸IP Hash (хеш по IP)

- IP пользователя: 192.168.1.100
- Этот IP хешируется и всегда маршрутизируется на сервер B
- Один и тот же пользователь всегда попадает на один и тот же сервер

Когда использовать: нужна привязка сессии к конкретному серверу, нет общего session storage. Sticky sessions.

🔸Least Response Time (наименьшее время отклика)

- Сервер A: средний отклик 200 мс
- Сервер B: 150 мс
- Сервер C: 300 мс
- Следующий запрос уходит на сервер B (самый быстрый)

Когда использовать: производительность серверов разная, например, для чтения из реплик БД с разным lag.

🔸Random (случайное распределение)

- Просто выбирается случайный сервер
- Ничего отслеживать не нужно
- На больших масштабах работает удивительно неплохо

Когда использовать: простые распределённые системы, stateless-сервисы, когда учёт состояния не оправдан.

В большинстве продакшн-систем хорошо себя показывает вариант Least Connections с весами.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
В Spring Boot аннотация @DataJpaTest используется для изолированного тестирования JPA-репозиториев.

@DataJpaTest поднимает только JPA-слой, не загружая весь контекст приложения.
Тесты выполняются с использованием встроенной базы данных, например H2, а после каждого теста все транзакции автоматически откатываются.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
29 октября(уже сегодня!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью по System Design.

Как это будет:
📂 Дмитрий Дорофеев, TeamLead в американском FitTech Truv Inc, ex-VK, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Дмитрий будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Дмитрию

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

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

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM