Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg
Show more📈 Analytical overview of Telegram channel Java Portal | Программирование
Channel Java Portal | Программирование (@java_iibrary) in the Russian language segment is an active participant. Currently, the community unites 12 130 subscribers, ranking 10 402 in the Technologies & Applications category and 54 525 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 12 130 subscribers.
According to the latest data from 07 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -138 over the last 30 days and by 2 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 11.37%. Within the first 24 hours after publication, content typically collects 6.26% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 379 views. Within the first day, a publication typically gains 760 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 4.
- Thematic interests: Content is focused on key topics such as boot, string, void, архитектура, resttemplate.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg”
Thanks to the high frequency of updates (latest data received on 08 June, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
@OpenAPIDefinition.
Размести её на главном классе приложения Spring Boot или в отдельном конфигурационном классе.
@SpringBootApplication
@OpenAPIDefinition(
info = @Info(
title = "Product Management API",
version = "v1.0",
description = "Product API Example",
termsOfService = "https://www.example.com/terms",
contact = @Contact(
name = "API Support",
email = "support@example.com",
url = "https://example.com/support"
),
license = @License(
name = "Apache 2.0",
url = "https://www.apache.org/licenses/LICENSE-2.0"
)
)
)
public class ApiApplication {
}❌ RestTemplate (blocking)
@Service
public class ItemService {
private final RestTemplate restTemplate;
public ItemService(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public Item getItem(Long id) {
return restTemplate.getForObject(
"https://api.example.com/items/{id}",
Item.class,
id
);
}
}
✅ WebClient (non-blocking)
@Service
public class ItemService {
private final WebClient webClient;
public ItemService(WebClient webClient) {
this.webClient = webClient;
}
public Mono<Item> getItem(Long id) {
return webClient.get()
.uri("/items/{id}", id)
.retrieve()
.bodyToMono(Item.class);
}
}
👉 Java Portal❌ Вложенные if-else:
public void processOrder(Order order) {
if (order != null) {
if (order.isPaid()) {
if (order.getItems().size() > 0) {
// Обработка заказа
System.out.println("Заказ обработан");
} else {
System.out.println("В заказе нет позиций");
}
} else {
System.out.println("Заказ не оплачен");
}
} else {
System.out.println("Заказ равен null");
}
}
✅ Использование guard clauses (читается проще):
public void processOrder(Order order) {
if (order == null) {
System.out.println("Заказ равен null");
return;
}
if (!order.isPaid()) {
System.out.println("Заказ не оплачен");
return;
}
if (order.getItems().isEmpty()) {
System.out.println("В заказе нет позиций");
return;
}
// Обработка заказа
System.out.println("Заказ обработан");
👉 Java PortalapiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: resize-pod-policy
spec:
mutateExistingOnPolicyUpdate: false
rules:
- name: resize-pod-policy
match:
any:
- resources:
kinds:
- Pod/status
- Pod
preconditions:
all:
- key: "{{request.object.status.containerStatuses[0].ready}}"
operator: Equals
value: true
mutate:
targets:
- apiVersion: v1
kind: Pod.resize
name: "{{request.object.metadata.name}}"
patchStrategicMerge:
spec:
containers:
- (name): sample-app-on-kubernetes
resources:
limits:
cpu: 0.5
- отслеживает момент завершения старта pod’а
- обновляет ресурсы pod’а прямо на месте
- снижает CPU-лимиты после старта
Итог: более быстрый запуск и меньшие затраты
Вот моя статья об этом
👉 Java Portal@CircuitBreaker(name = "inventoryService", fallbackMethod = "inventoryFallback")
public InventoryResponse getInventory(String productId) {
return inventoryClient.getInventory(productId);
}
Конфиг обычно задаётся через application.yml:
- процент ошибок
- sliding window
- waitDurationInOpenState
- permittedNumberOfCallsInHalfOpenState
2. Что делать, когда circuit открыт (fallback)
Тут нет универсального ответа » зависит от бизнеса.
Типовые варианты:
🔹Кэш
Если данные не критичны к свежести:
- Redis
- локальный cache
- stale-данные лучше, чем 503
private InventoryResponse inventoryFallback(String productId, Throwable ex) {
return cacheService.getInventory(productId);
}
🔹Дефолтный ответ
Если можно вернуть «безопасное» значение:
- пустой список
- available = false
- статус UNKNOWN
🔹Очередь
Если запрос важен, но не срочный:
- кладём событие в Kafka / Rabbit
- обрабатываем асинхронно
- отвечаем клиенту 202 Accepted
На практике часто комбинируют:
кэш + деградация функциональности.
3. Глобальная обработка ошибок через @RestControllerAdvice
Чтобы не размазывать try/catch по всему коду, делаем централизованный обработчик.
Пример бизнес-исключения
public class ProductNotFoundException extends RuntimeException {
public ProductNotFoundException(String id) {
super("Product not found: " + id);
}
}
Глобальный handler
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ProductNotFoundException.class)
public ResponseEntity<ErrorResponse> handleProductNotFound(ProductNotFoundException ex) {
ErrorResponse error = new ErrorResponse(
"PRODUCT_NOT_FOUND",
ex.getMessage()
);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
}
}
JSON-ответ
{
"code": "PRODUCT_NOT_FOUND",
"message": "Product not found: 123"
}
Плюсы подхода:
- чистые контроллеры
- единый формат ошибок
- нормальная мапа бизнес-ошибок на HTTP-статусы
Итог
На таком вопросе проверяют не знание аннотаций, а мышление:
- понимаешь ли ты отказоустойчивость
- умеешь ли деградировать сервис
- разделяешь ли бизнес-ошибки и технические фейлы
Это уже разговор не про «Java», а про архитектуру продакшн-сервисов
👉 Java Portalpublic class Book {
private final String title;
private final int price;
public Book(String title, int price) {
this.title = title;
this.price = price;
}
// геттеры, toString, equals и hashCode
}
Вместо этого можно создать record:
public record Book(String title, int price) {}
Смысл ровно тот же, но без бойлерплейта.
👉 Java PortalНи один подход не является универсально лучшим. Всё зависит от системы и контекста.Частая ошибка » Считать, что Saga — это замена ACID-транзакциям. Это не так. Saga меняет сам контракт: - допускаются промежуточные состояния - компенсации проектируются явно - принимается факт, что система может упасть на середине процесса Когда Saga действительно имеет смысл - долгоживущие процессы - несколько сервисов - реальные побочные эффекты: платежи, доставки, резервы - ситуации, где технического rollback не существует Если всё находится в одной базе данных, Saga не нужна. Здесь легко уйти в оверинжиниринг. Ключевая мысль:
Saga не убирает сложность. Она делает её явной.Явная сложность лучше, чем спрятанная за предположениями, которые больше не работают. В распределённых системах сбои — это не исключение, а часть нормального потока. Паттерн Saga не избавляет от всех проблем, но помогает избежать беспорядка. А в продакшене это уже большая разница. ☃️ 👉 Java Portal
<T extends Integer> void test(T t) {
t++;
// t += 1;
IO.println(t);
}
void main() {
test(10);
}
Но если заменить t++ на t += 1, всё ломается.
Ошибка:
Main.java:3: error: incompatible types: int cannot be converted to T
👉 Java PortalHttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_3)
.build(); // создать экземпляр HttpClient с HTTP/3 в качестве предпочтительной версии
URI reqURI = new URI("https://www.google.com/");
HttpRequest req = HttpRequest.newBuilder()
.uri(reqURI)
.build(); // создать экземпляр запроса
final HttpResponse.BodyHandler<String> bodyHandler =
BodyHandlers.ofString(StandardCharsets.UTF_8);
HttpResponse<String> resp = client.send(req, bodyHandler);
// отправить запрос и получить ответ в виде строки
System.out.println(
"status code: " + resp.statusCode() +
" HTTP protocol version: " + resp.version()
); // вывести код ответа и используемую версию HTTP
Подробнее
👉 Java Portal@Autowired
TaskScheduler scheduler;
scheduler.schedule(
() -> System.out.println("Hello!"),
new CronTrigger("0 */5 * * * *") // каждые 5 минут
);
Инжектируемый бин — это ThreadPoolTaskScheduler, встроенная реализация сразу TaskScheduler и ScheduledExecutorService
При необходимости конфигурацию можно кастомизировать:
@Configuration
@EnableScheduling
public class SchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("my-scheduler-");
scheduler.initialize();
return scheduler;
}
}
👉 Java Portal
Available now! Telegram Research 2025 — the year's key insights 
