diff --git a/src/main/java/com/main/ipks/service/TokenService.java b/src/main/java/com/main/ipks/service/TokenService.java index 945b3dc..cf6e990 100644 --- a/src/main/java/com/main/ipks/service/TokenService.java +++ b/src/main/java/com/main/ipks/service/TokenService.java @@ -8,7 +8,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import com.main.ipks.service.errors.TokenFetchException; - +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; @Service public class TokenService { @@ -20,8 +21,12 @@ public class TokenService { @Value("${cedge.token.url}") private String tokenUrl; - private volatile String cachedToken; - private volatile long tokenExpiryTimeMillis; + // Per-bank cache + private final Map tokenCache = new ConcurrentHashMap<>(); + private final Map expiryCache = new ConcurrentHashMap<>(); + + + private final Object tokenLock = new Object(); private static final long DEFAULT_TOKEN_TTL_MS = 7L * 60 * 60 * 1000; @@ -32,23 +37,32 @@ public class TokenService { public String getToken(String bankId) { long now = System.currentTimeMillis(); - if (cachedToken != null && now < tokenExpiryTimeMillis) { + String cachedToken = tokenCache.get(bankId); + Long expiry = expiryCache.get(bankId); + + if (cachedToken != null && expiry != null && now < expiry) { return cachedToken; } synchronized (tokenLock) { now = System.currentTimeMillis(); - if (cachedToken != null && now < tokenExpiryTimeMillis) { + + cachedToken = tokenCache.get(bankId); + expiry = expiryCache.get(bankId); + + if (cachedToken != null && expiry != null && now < expiry) { return cachedToken; } + String url = tokenUrl + "/" + bankId; + // Only 2 attempts total for (int attempt = 1; attempt <= 2; attempt++) { try { log.info("Fetching new C-EDGE token (attempt {}/2)", attempt); ResponseEntity resp = - restTemplate.getForEntity(tokenUrl + "/" + bankId, TokenResponse.class); + restTemplate.getForEntity(url,TokenResponse.class); TokenResponse body = resp.getBody(); @@ -79,17 +93,19 @@ public class TokenService { throw new TokenFetchException("Token string missing in response"); } - cachedToken = token; - tokenExpiryTimeMillis = System.currentTimeMillis() + DEFAULT_TOKEN_TTL_MS; + // Store per bankId + tokenCache.put(bankId, token); + expiryCache.put(bankId, now + DEFAULT_TOKEN_TTL_MS); - String preview = cachedToken.substring(0, Math.min(12, cachedToken.length())) + "..."; - log.info("Token fetched successfully. Preview={}", preview); - return cachedToken; + + String preview = token.substring(0, Math.min(12, token.length())) + "..."; + log.info("Token fetched successfully for bank {}. Preview={}", bankId, preview); + + return token; } catch (RuntimeException e) { // RestClientException also comes here because it extends RuntimeException - log.warn("Token fetch failed on attempt {}/2: {}", attempt, e.getMessage()); - + log.warn("Token fetch failed for bank {} (attempt {}/2): {}", bankId, attempt, e.getMessage()); if (attempt == 1) { try { Thread.sleep(300); // small delay before retry @@ -101,7 +117,7 @@ public class TokenService { } // second attempt failed -> hard fail - log.error("Token generation failed after 2 attempts", e); + log.error("Token generation failed for bank {} after 2 attempts", bankId, e); if (e instanceof TokenFetchException) { throw e; } @@ -120,8 +136,8 @@ public class TokenService { */ public String refreshToken(String bankId) { synchronized (tokenLock) { - cachedToken = null; - tokenExpiryTimeMillis = 0L; + tokenCache.remove(bankId); + expiryCache.remove(bankId); } return getToken(bankId); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 332bd81..ee5fd4b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -7,16 +7,20 @@ logging.level.com.main.ipks.service=DEBUG # TOKEN -cedge.token.url=https://142.79.251.107:443/BANCEDGEAPI/api/getToken +cedge.token.url=https://nabard.cedgeapiservices.in/BANCEDGEAPI/api/getToken # Api for CIF-Creation -cedge.cif.url=https://142.79.251.107:443/BANCEDGEAPI/api/cifCreation +cedge.cif.url=https://nabard.cedgeapiservices.in/BANCEDGEAPI/api/cifCreation # Api for account creation # API1 -cedge.account.url=https://142.79.251.107:443/BANCEDGEAPI/api/depositsCreateDepositAccount +cedge.account.url=https://nabard.cedgeapiservices.in/BANCEDGEAPI/api/depositsCreateDepositAccount # API2 -cedge.accountOk.url=https://142.79.251.107:443/BANCEDGEAPI/api/createDepositAccountOk \ No newline at end of file +cedge.accountOk.url=https://nabard.cedgeapiservices.in/BANCEDGEAPI/api/createDepositAccountOk + + + +