From a7f85521a50c149f33e289581078889e9f54eebb Mon Sep 17 00:00:00 2001 From: Dido Date: Mon, 19 May 2025 18:13:57 +0300 Subject: [PATCH 1/5] fixed time to live in redis. --- .idea/compiler.xml | 10 +---- docker-compose.yml | 3 +- .../warehouse/Config/RedisConfig.java | 13 ++----- .../Controllers/AssignerController.java | 2 +- .../Controllers/StockController.java | 2 +- .../warehouse/Services/AssignerService.java | 1 - .../warehouse/Services/ManagerService.java | 38 +++++++------------ 7 files changed, 23 insertions(+), 46 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index f1e20ad..bfdf789 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -10,16 +10,8 @@ - - - - - - - - - + diff --git a/docker-compose.yml b/docker-compose.yml index e60e27a..61d70ae 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,7 @@ services: image: redislabs/redisinsight:latest container_name: redisinsight ports: - - "8001:8001" + - "5540:5540" environment: - REDIS_HOST=redis - REDIS_PORT=6379 @@ -44,6 +44,7 @@ services: - redis restart: unless-stopped + rabbitmq: image: rabbitmq:management container_name: rabbitmq diff --git a/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java b/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java index 823f1bc..2388fa8 100644 --- a/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java +++ b/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java @@ -12,6 +12,8 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.*; +import java.time.Duration; + @Configuration public class RedisConfig { @@ -20,18 +22,15 @@ public RedisTemplate redisTemplate(RedisConnectionFactory connec RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); - // Configure ObjectMapper ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - // Set the Jackson serializer with JavaTimeModule Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class); serializer.setObjectMapper(mapper); - // Apply to both keys and values template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(serializer); template.setHashKeySerializer(new StringRedisSerializer()); @@ -45,8 +44,6 @@ public RedisTemplate redisTemplate(RedisConnectionFactory connec public RedisCacheConfiguration cacheConfiguration() { ObjectMapper mapper = new ObjectMapper(); mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL); - - // Register JavaTimeModule for LocalDateTime support mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); @@ -54,9 +51,7 @@ public RedisCacheConfiguration cacheConfiguration() { serializer.setObjectMapper(mapper); return RedisCacheConfiguration.defaultCacheConfig() - .serializeValuesWith( - RedisSerializationContext.SerializationPair.fromSerializer(serializer) - ); + .entryTtl(Duration.ofMinutes(1)) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer)); } - } diff --git a/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java b/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java index f5dbfbf..7c744b8 100644 --- a/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java +++ b/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java @@ -15,7 +15,7 @@ @Slf4j @RestController -@RequestMapping("/assign") +@RequestMapping("warehouse/assign") public class AssignerController { @Autowired diff --git a/src/main/java/com/podzilla/warehouse/Controllers/StockController.java b/src/main/java/com/podzilla/warehouse/Controllers/StockController.java index f9945fa..65001db 100644 --- a/src/main/java/com/podzilla/warehouse/Controllers/StockController.java +++ b/src/main/java/com/podzilla/warehouse/Controllers/StockController.java @@ -16,7 +16,7 @@ @Slf4j @RestController -@RequestMapping("/stock") +@RequestMapping("warehouse/stock") public class StockController { @Autowired diff --git a/src/main/java/com/podzilla/warehouse/Services/AssignerService.java b/src/main/java/com/podzilla/warehouse/Services/AssignerService.java index b674c4a..c0dd687 100644 --- a/src/main/java/com/podzilla/warehouse/Services/AssignerService.java +++ b/src/main/java/com/podzilla/warehouse/Services/AssignerService.java @@ -23,7 +23,6 @@ public Optional createAssigner(Assigner assigner) { return Optional.of(assignerRepository.save(assigner)); } - // We cache the page of assigners under a generic key (you could enhance this using pageable as a cache key input) @Cacheable(value = "assignersList") public Page getAllAssigners(Pageable pageable) { return assignerRepository.findAll(pageable); diff --git a/src/main/java/com/podzilla/warehouse/Services/ManagerService.java b/src/main/java/com/podzilla/warehouse/Services/ManagerService.java index c633c49..03a5b61 100644 --- a/src/main/java/com/podzilla/warehouse/Services/ManagerService.java +++ b/src/main/java/com/podzilla/warehouse/Services/ManagerService.java @@ -1,9 +1,5 @@ package com.podzilla.warehouse.Services; -import com.podzilla.mq.EventPublisher; -import com.podzilla.mq.EventsConstants; -import com.podzilla.mq.events.OrderItem; -import com.podzilla.mq.events.OrderPlacedEvent; import com.podzilla.warehouse.Models.Manager; import com.podzilla.warehouse.Repositories.ManagerRepository; import lombok.RequiredArgsConstructor; @@ -12,11 +8,7 @@ import org.springframework.cache.annotation.*; import org.springframework.stereotype.Service; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; @RequiredArgsConstructor @Service @@ -26,49 +18,49 @@ public class ManagerService { @Autowired private ManagerRepository managerRepository; - @CachePut(key = "#result.id") + @CachePut(key = "'manager:id:' + #result.id") public Manager createManager(String name, String email, String department, String phoneNumber) { Manager manager = new Manager(name, email, department, phoneNumber); return managerRepository.save(manager); } - @CachePut(key = "#result.id") + @CachePut(key = "'manager:id:' + #result.id") public Manager createManager(String name, String email, String department) { Manager manager = new Manager(name, email, department); return managerRepository.save(manager); } - @Cacheable(value = "allManagers") + @Cacheable(key = "'all'") public List getAllManagers() { return managerRepository.findAll(); } - @Cacheable(value = "activeManagers") + @Cacheable(key = "'active'") public List getActiveManagers() { return managerRepository.findByIsActiveTrue(); } - @Cacheable(value = "inactiveManagers") + @Cacheable(key = "'inactive'") public List getInactiveManagers() { return managerRepository.findByIsActiveFalse(); } - @Cacheable(key = "#id") + @Cacheable(key = "'manager:id:' + #id") public Optional getManagerById(UUID id) { return managerRepository.findById(id); } - @Cacheable(key = "'email:' + #email") + @Cacheable(key = "'manager:email:' + #email") public Optional getManagerByEmail(String email) { return managerRepository.findByEmail(email); } - @Cacheable(key = "'department:' + #department") + @Cacheable(key = "'manager:department:' + #department") public List getManagersByDepartment(String department) { return managerRepository.findByDepartment(department); } - @CachePut(key = "#id") + @CachePut(key = "'manager:id:' + #id") public Optional updateManager(UUID id, Manager managerDetails) { return managerRepository.findById(id) .map(manager -> { @@ -77,12 +69,11 @@ public Optional updateManager(UUID id, Manager managerDetails) { if (managerDetails.getDepartment() != null) manager.setDepartment(managerDetails.getDepartment()); if (managerDetails.getPhoneNumber() != null) manager.setPhoneNumber(managerDetails.getPhoneNumber()); if (managerDetails.getIsActive() != null) manager.setIsActive(managerDetails.getIsActive()); - return managerRepository.save(manager); }); } - @CachePut(key = "#id") + @CachePut(key = "'manager:id:' + #id") public Optional activateManager(UUID id) { return managerRepository.findById(id) .map(manager -> { @@ -91,7 +82,7 @@ public Optional activateManager(UUID id) { }); } - @CachePut(key = "#id") + @CachePut(key = "'manager:id:' + #id") public Optional deactivateManager(UUID id) { return managerRepository.findById(id) .map(manager -> { @@ -100,7 +91,7 @@ public Optional deactivateManager(UUID id) { }); } - @CacheEvict(key = "#id") + @CacheEvict(key = "'manager:id:' + #id") public boolean deleteManager(UUID id) { if (managerRepository.existsById(id)) { managerRepository.deleteById(id); @@ -109,9 +100,8 @@ public boolean deleteManager(UUID id) { return false; } - // Optional: clear all caches if needed @CacheEvict(allEntries = true) public void clearManagerCache() { - // Used to manually clear all manager-related caches + // Clears all cache entries under 'managers' } } From 336be4e9ba89178e2d96823300f2acbb904d082b Mon Sep 17 00:00:00 2001 From: Dido Date: Mon, 19 May 2025 18:17:48 +0300 Subject: [PATCH 2/5] fixed time to live in redis. --- src/main/java/com/podzilla/warehouse/Config/RedisConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java b/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java index 2388fa8..21c7e50 100644 --- a/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java +++ b/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java @@ -51,7 +51,7 @@ public RedisCacheConfiguration cacheConfiguration() { serializer.setObjectMapper(mapper); return RedisCacheConfiguration.defaultCacheConfig() - .entryTtl(Duration.ofMinutes(1)) + .entryTtl(Duration.ofMinutes(1)) // Set TTL to 1 minute .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer)); } } From 96db693fd8f8d760d6e760093ce97b43e3f6b897 Mon Sep 17 00:00:00 2001 From: Dido Date: Mon, 19 May 2025 18:21:11 +0300 Subject: [PATCH 3/5] fixed time to live in redis. --- .../com/podzilla/warehouse/Services/AssignerService.java | 1 - .../java/com/podzilla/warehouse/Services/ManagerService.java | 2 -- .../com/podzilla/warehouse/Services/PackagerService.java | 1 - .../java/com/podzilla/warehouse/Services/StockService.java | 5 +---- 4 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/com/podzilla/warehouse/Services/AssignerService.java b/src/main/java/com/podzilla/warehouse/Services/AssignerService.java index c0dd687..42abd4a 100644 --- a/src/main/java/com/podzilla/warehouse/Services/AssignerService.java +++ b/src/main/java/com/podzilla/warehouse/Services/AssignerService.java @@ -23,7 +23,6 @@ public Optional createAssigner(Assigner assigner) { return Optional.of(assignerRepository.save(assigner)); } - @Cacheable(value = "assignersList") public Page getAllAssigners(Pageable pageable) { return assignerRepository.findAll(pageable); } diff --git a/src/main/java/com/podzilla/warehouse/Services/ManagerService.java b/src/main/java/com/podzilla/warehouse/Services/ManagerService.java index 03a5b61..bfd3ec0 100644 --- a/src/main/java/com/podzilla/warehouse/Services/ManagerService.java +++ b/src/main/java/com/podzilla/warehouse/Services/ManagerService.java @@ -30,7 +30,6 @@ public Manager createManager(String name, String email, String department) { return managerRepository.save(manager); } - @Cacheable(key = "'all'") public List getAllManagers() { return managerRepository.findAll(); } @@ -55,7 +54,6 @@ public Optional getManagerByEmail(String email) { return managerRepository.findByEmail(email); } - @Cacheable(key = "'manager:department:' + #department") public List getManagersByDepartment(String department) { return managerRepository.findByDepartment(department); } diff --git a/src/main/java/com/podzilla/warehouse/Services/PackagerService.java b/src/main/java/com/podzilla/warehouse/Services/PackagerService.java index 815aafe..adef4ba 100644 --- a/src/main/java/com/podzilla/warehouse/Services/PackagerService.java +++ b/src/main/java/com/podzilla/warehouse/Services/PackagerService.java @@ -28,7 +28,6 @@ public Optional getPackagerById(UUID id) { return packagerRepository.findById(id); } - @Cacheable(value = "allPackagers", key = "#pageable.pageNumber + '-' + #pageable.pageSize") public Page getAllPackagers(Pageable pageable) { return packagerRepository.findAll(pageable); } diff --git a/src/main/java/com/podzilla/warehouse/Services/StockService.java b/src/main/java/com/podzilla/warehouse/Services/StockService.java index e04ca3f..6f1656d 100644 --- a/src/main/java/com/podzilla/warehouse/Services/StockService.java +++ b/src/main/java/com/podzilla/warehouse/Services/StockService.java @@ -47,7 +47,6 @@ public Stock createStock(String name, Integer quantity, Integer threshold, Strin return saved; } - @Cacheable(value = "stocksAll") public List getAllStocks() { return stockRepository.findAll(); } @@ -69,8 +68,6 @@ public List getStocksBelowQuantity(Integer quantity) { return stockRepository.findByQuantityLessThanEqual(quantity); } - @Cacheable("stocksBelowThreshold") - public List getStocksBelowThreshold() { return stockRepository.findByQuantityLessThanOrEqualToThreshold(); } @@ -110,7 +107,7 @@ public Optional updateStock(UUID id, String name, Integer quantity, Integ // return EventFactory.createInventorySnapshotEvent(LocalDateTime.now(), warehouseId, productSnapshots); // } - @CacheEvict(value = {"stockById", "stocksAll", "stocksByName", "stocksBelowQuantity", "stocksBelowThreshold"}, key = "#id", allEntries = true) + @CacheEvict(value = {"stockById", "stocksByName", "stocksBelowQuantity"}, key = "#id", allEntries = true) public boolean deleteStock(UUID id) { if (stockRepository.existsById(id)) { stockRepository.deleteById(id); From f2dd223d11a8e046889995b5be82364210c13a4f Mon Sep 17 00:00:00 2001 From: Dido Date: Mon, 19 May 2025 18:24:10 +0300 Subject: [PATCH 4/5] fixed time to live in redis. --- .../warehouse/Config/RedisConfig.java | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java b/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java index 21c7e50..19f4253 100644 --- a/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java +++ b/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,6 +18,8 @@ @Configuration public class RedisConfig { + private static final long CACHE_TTL_SECONDS = 60 * 60; // 1 hour + @Bean public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate template = new RedisTemplate<>(); @@ -24,7 +27,13 @@ public RedisTemplate redisTemplate(RedisConnectionFactory connec ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + // Use BasicPolymorphicTypeValidator instead of deprecated enableDefaultTyping + mapper.activateDefaultTyping( + BasicPolymorphicTypeValidator.builder() + .allowIfSubType(Object.class) + .build(), + ObjectMapper.DefaultTyping.NON_FINAL + ); mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); @@ -43,7 +52,12 @@ public RedisTemplate redisTemplate(RedisConnectionFactory connec @Bean public RedisCacheConfiguration cacheConfiguration() { ObjectMapper mapper = new ObjectMapper(); - mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL); + mapper.activateDefaultTyping( + BasicPolymorphicTypeValidator.builder() + .allowIfSubType(Object.class) + .build(), + ObjectMapper.DefaultTyping.NON_FINAL + ); mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); @@ -51,7 +65,8 @@ public RedisCacheConfiguration cacheConfiguration() { serializer.setObjectMapper(mapper); return RedisCacheConfiguration.defaultCacheConfig() - .entryTtl(Duration.ofMinutes(1)) // Set TTL to 1 minute - .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer)); + .entryTtl(Duration.ofSeconds(CACHE_TTL_SECONDS)) // TTL set to 1 hour + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer)) + .disableCachingNullValues(); } } From 82f6282811007ab61a34a7c74eef692a60ae47aa Mon Sep 17 00:00:00 2001 From: Dido Date: Mon, 19 May 2025 18:31:30 +0300 Subject: [PATCH 5/5] fixed time to live in redis. --- src/main/java/com/podzilla/warehouse/Services/StockService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/podzilla/warehouse/Services/StockService.java b/src/main/java/com/podzilla/warehouse/Services/StockService.java index 6f1656d..a4b890b 100644 --- a/src/main/java/com/podzilla/warehouse/Services/StockService.java +++ b/src/main/java/com/podzilla/warehouse/Services/StockService.java @@ -62,8 +62,6 @@ public List getStocksByName(String name) { return stockRepository.findByName(name); } - @Cacheable(value = "stocksBelowQuantity", key = "#quantity") - public List getStocksBelowQuantity(Integer quantity) { return stockRepository.findByQuantityLessThanEqual(quantity); }