Commit 2cea6c85 authored by 曾水平's avatar 曾水平

补充本地缓存;数据库连接池配置

parent 6bb1891c
...@@ -48,6 +48,7 @@ dependencies { ...@@ -48,6 +48,7 @@ dependencies {
compile("org.aspectj:aspectjweaver:1.8.11") compile("org.aspectj:aspectjweaver:1.8.11")
//http //http
compile 'cn.com.duiba.credits:duiba-java-sdk:0.0.23' compile 'cn.com.duiba.credits:duiba-java-sdk:0.0.23'
compile('com.github.ben-manes.caffeine:caffeine:3.0.2')
} }
......
...@@ -80,7 +80,7 @@ public class AppController { ...@@ -80,7 +80,7 @@ public class AppController {
Long id = accessTokenUtils.saveAccessToken(jdAppEnum, accessTokenByCode, shopJosResult); Long id = accessTokenUtils.saveAccessToken(jdAppEnum, accessTokenByCode, shopJosResult);
LOGGER.info("login,保存AccessToken成功"); LOGGER.info("login,保存AccessToken成功");
if (id != null && id > 0) { if (id != null && id > 0) {
Long shopId = accessTokenUtils.getAccessToken(shopJosResult.getVenderId(), shopJosResult.getShopId()).getShopId(); Long shopId = accessTokenUtils.getAccessTokenWithCache(shopJosResult.getVenderId(), shopJosResult.getShopId()).getShopId();
LOGGER.info("login,保存AccessToken成功,shopId={}", shopId); LOGGER.info("login,保存AccessToken成功,shopId={}", shopId);
} }
...@@ -118,7 +118,7 @@ public class AppController { ...@@ -118,7 +118,7 @@ public class AppController {
if (user == null) { if (user == null) {
return ResultBuilder.fail("未登录"); return ResultBuilder.fail("未登录");
} }
TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessToken(user.getVenderId(), user.getShopId()); TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessTokenWithCache(user.getVenderId(), user.getShopId());
JdAppEnum jdAppEnum = JdAppEnum.getAppByAppKey(accessToken.getAppKey()); JdAppEnum jdAppEnum = JdAppEnum.getAppByAppKey(accessToken.getAppKey());
Result<ShopJosResult> shopJosResultResult = jdApiUtil.venderShopQuery(jdAppEnum, accessToken.getAccessToken()); Result<ShopJosResult> shopJosResultResult = jdApiUtil.venderShopQuery(jdAppEnum, accessToken.getAccessToken());
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
......
...@@ -104,7 +104,7 @@ public class Open2DuibaController { ...@@ -104,7 +104,7 @@ public class Open2DuibaController {
source = JdTokenSourceEnum.JD.getSource(); source = JdTokenSourceEnum.JD.getSource();
} }
TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessToken(venderId, shopId); TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessTokenWithCache(venderId, shopId);
LOGGER.info("获取accessToken,结果={}", JSON.toJSONString(accessToken)); LOGGER.info("获取accessToken,结果={}", JSON.toJSONString(accessToken));
JdAppEnum appByAppKey = JdAppEnum.getAppByAppKey(accessToken.getAppKey()); JdAppEnum appByAppKey = JdAppEnum.getAppByAppKey(accessToken.getAppKey());
...@@ -185,7 +185,7 @@ public class Open2DuibaController { ...@@ -185,7 +185,7 @@ public class Open2DuibaController {
uid = uid.replaceAll(" ", "+"); uid = uid.replaceAll(" ", "+");
signVerify("是否关注店铺"); signVerify("是否关注店铺");
TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessToken(venderId, shopId); TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessTokenWithCache(venderId, shopId);
JdAppEnum appEnum = JdAppEnum.getAppByAppKey(accessToken.getAppKey()); JdAppEnum appEnum = JdAppEnum.getAppByAppKey(accessToken.getAppKey());
String pin = convert2Pin(appEnum, accessToken.getAccessToken(), uid); String pin = convert2Pin(appEnum, accessToken.getAccessToken(), uid);
Result<Boolean> follow = jdApiUtil.isFollowByPinAndVid(appEnum, pin, shopId); Result<Boolean> follow = jdApiUtil.isFollowByPinAndVid(appEnum, pin, shopId);
...@@ -208,7 +208,7 @@ public class Open2DuibaController { ...@@ -208,7 +208,7 @@ public class Open2DuibaController {
uid = uid.replaceAll(" ", "+"); uid = uid.replaceAll(" ", "+");
signVerify("关注店铺"); signVerify("关注店铺");
TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessToken(venderId, shopId); TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessTokenWithCache(venderId, shopId);
JdAppEnum appEnum = JdAppEnum.getAppByAppKey(accessToken.getAppKey()); JdAppEnum appEnum = JdAppEnum.getAppByAppKey(accessToken.getAppKey());
String pin = convert2Pin(appEnum, accessToken.getAccessToken(), uid); String pin = convert2Pin(appEnum, accessToken.getAccessToken(), uid);
Result<Boolean> follow = jdApiUtil.followByPinAndVid(appEnum, pin, shopId, accessToken.getAccessToken()); Result<Boolean> follow = jdApiUtil.followByPinAndVid(appEnum, pin, shopId, accessToken.getAccessToken());
...@@ -270,7 +270,7 @@ public class Open2DuibaController { ...@@ -270,7 +270,7 @@ public class Open2DuibaController {
uid = uid.replaceAll(" ", "+"); uid = uid.replaceAll(" ", "+");
signVerify("是否是会员"); signVerify("是否是会员");
TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessToken(venderId, shopId); TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessTokenWithCache(venderId, shopId);
JdAppEnum appEnum = JdAppEnum.getAppByAppKey(accessToken.getAppKey()); JdAppEnum appEnum = JdAppEnum.getAppByAppKey(accessToken.getAppKey());
String pin = convert2Pin(appEnum, accessToken.getAccessToken(), uid); String pin = convert2Pin(appEnum, accessToken.getAccessToken(), uid);
Result<EssentialCustomerInfo> result = jdApiUtil.getCustomer(appEnum, accessToken.getAccessToken(), pin); Result<EssentialCustomerInfo> result = jdApiUtil.getCustomer(appEnum, accessToken.getAccessToken(), pin);
...@@ -299,7 +299,7 @@ public class Open2DuibaController { ...@@ -299,7 +299,7 @@ public class Open2DuibaController {
uid = uid.replaceAll(" ", "+"); uid = uid.replaceAll(" ", "+");
signVerify("发放优惠券"); signVerify("发放优惠券");
TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessToken(venderId, shopId); TbShopAccessTokenDto accessToken = accessTokenUtils.getAccessTokenWithCache(venderId, shopId);
JdAppEnum appEnum = JdAppEnum.getAppByAppKey(accessToken.getAppKey()); JdAppEnum appEnum = JdAppEnum.getAppByAppKey(accessToken.getAppKey());
String pin = convert2Pin(appEnum, accessToken.getAccessToken(), uid); String pin = convert2Pin(appEnum, accessToken.getAccessToken(), uid);
......
...@@ -11,14 +11,21 @@ import cn.com.duiba.jdactivity.service.TbShopAccessTokenService; ...@@ -11,14 +11,21 @@ import cn.com.duiba.jdactivity.service.TbShopAccessTokenService;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONValidator; import com.alibaba.fastjson.JSONValidator;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.Expiry;
import com.jd.open.api.sdk.domain.seller.ShopSafService.response.query.ShopJosResult; import com.jd.open.api.sdk.domain.seller.ShopSafService.response.query.ShopJosResult;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.checkerframework.checker.index.qual.NonNegative;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
...@@ -44,6 +51,34 @@ public class AccessTokenUtils { ...@@ -44,6 +51,34 @@ public class AccessTokenUtils {
@Resource @Resource
private TbShopAccessTokenService tbShopAccessTokenService; private TbShopAccessTokenService tbShopAccessTokenService;
/**
* 活动类型名称缓存
*/
private static final Cache<String, TbShopAccessTokenDto> ACCESS_TOKEN_CACHE = Caffeine.newBuilder()
.expireAfter(new Expiry<String, TbShopAccessTokenDto>() {
@Override
public long expireAfterCreate(String key, TbShopAccessTokenDto value, long currentTime) {
// 明天零点跟过期时间取最小
return Math.min(value.getExpiresTime().getTime(),
LocalDate.now().plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.of("+8")));
}
@Override
public long expireAfterUpdate(String key, TbShopAccessTokenDto value, long currentTime, @NonNegative long currentDuration) {
// 明天零点跟过期时间取最小
return Math.min(value.getExpiresTime().getTime(),
LocalDate.now().plusDays(1).atStartOfDay().toEpochSecond(ZoneOffset.of("+8")));
}
@Override
public long expireAfterRead(String key, TbShopAccessTokenDto value, long currentTime, @NonNegative long currentDuration) {
return 0;
}
})
.initialCapacity(10)
.maximumSize(100)
.build();
public String generateAuthUrl(JdAppEnum appKey, String state) { public String generateAuthUrl(JdAppEnum appKey, String state) {
Map<String, String> param = new TreeMap<>(); Map<String, String> param = new TreeMap<>();
param.put("app_key", appKey.getAppKey()); param.put("app_key", appKey.getAppKey());
...@@ -75,10 +110,8 @@ public class AccessTokenUtils { ...@@ -75,10 +110,8 @@ public class AccessTokenUtils {
return null; return null;
} }
private static String getCacheKey(Long venderId, Long shopId) {
public Long saveAccessToken(JdAppEnum jdAppEnum, AccessTokenResponse accessTokenByCode, ShopJosResult data) { return String.format("%s_%s", venderId, shopId);
TbShopAccessTokenDto tbShopAccessTokenDto = assembleTbShopAccessTokenDto(jdAppEnum, accessTokenByCode, data);
return tbShopAccessTokenService.insert(tbShopAccessTokenDto);
} }
private TbShopAccessTokenDto assembleTbShopAccessTokenDto(JdAppEnum jdAppEnum, AccessTokenResponse accessTokenByCode, ShopJosResult data) { private TbShopAccessTokenDto assembleTbShopAccessTokenDto(JdAppEnum jdAppEnum, AccessTokenResponse accessTokenByCode, ShopJosResult data) {
...@@ -99,8 +132,49 @@ public class AccessTokenUtils { ...@@ -99,8 +132,49 @@ public class AccessTokenUtils {
return tbShopAccessTokenDto; return tbShopAccessTokenDto;
} }
private static Pair<String, String> splitCacheKey(String key) throws BizException {
String[] split = key.split("_");
if (split.length != 2) {
throw new BizException("key不合法" + key);
}
return Pair.of(split[0], split[1]);
}
public Long saveAccessToken(JdAppEnum jdAppEnum, AccessTokenResponse accessTokenByCode, ShopJosResult data) {
ACCESS_TOKEN_CACHE.invalidate(getCacheKey(data.getVenderId(), data.getShopId()));
TbShopAccessTokenDto tbShopAccessTokenDto = assembleTbShopAccessTokenDto(jdAppEnum, accessTokenByCode, data);
return tbShopAccessTokenService.insert(tbShopAccessTokenDto);
}
public TbShopAccessTokenDto getAccessTokenWithCache(Long venderId, Long shopId) throws BizException {
if (venderId == null || shopId == null || venderId == 0L || shopId == 0L) {
throw new BizException("店铺参数不存在");
}
String key = getCacheKey(venderId, shopId);
TbShopAccessTokenDto tbShopAccessTokenDto = ACCESS_TOKEN_CACHE.get(key, s -> {
try {
Pair<String, String> pair = splitCacheKey(key);
return getAccessTokenWithoutCache(Long.parseLong(pair.getRight()), Long.parseLong(pair.getRight()));
} catch (BizException e) {
LOGGER.warn("加载缓存失败");
return null;
}
});
if (tbShopAccessTokenDto == null) {
throw new BizException("店铺授权获取失败" + shopId);
}
if (tbShopAccessTokenDto.getExpiresTime().before(new Date())) {
ACCESS_TOKEN_CACHE.invalidate(key);
throw new BizException("店铺授权获取失败" + shopId);
}
return tbShopAccessTokenDto;
}
public TbShopAccessTokenDto getAccessToken(Long venderId, Long shopId) throws BizException { private TbShopAccessTokenDto getAccessTokenWithoutCache(Long venderId, Long shopId) throws BizException {
if (venderId == null || shopId == null || venderId == 0L || shopId == 0L) { if (venderId == null || shopId == null || venderId == 0L || shopId == 0L) {
throw new BizException("店铺参数不存在"); throw new BizException("店铺参数不存在");
} }
......
#MySQL配置 注意这是内网地址 #MySQL配置 注意这是内网地址
spring.datasource.url=jdbc:mysql://mysql-cn-north-1-5321aee1b70d421c.rds.jdcloud.com:3306/custom?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.url=jdbc:mysql://mysql-cn-north-1-5321aee1b70d421c.rds.jdcloud.com:3306/custom?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&connectTimeout=5000&socketTimeout=60000
spring.datasource.username=jd_activity spring.datasource.username=jd_activity
spring.datasource.password=kP6oWdeYU78tHee70bcs spring.datasource.password=kP6oWdeYU78tHee70bcs
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
......
...@@ -17,4 +17,16 @@ spring.thymeleaf.prefix=classpath:templates/ ...@@ -17,4 +17,16 @@ spring.thymeleaf.prefix=classpath:templates/
spring.thymeleaf.suffix=.html spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML spring.thymeleaf.mode=HTML
spring.thymeleaf.cache=false spring.thymeleaf.cache=false
#连接池最大连接数
spring.datasource.tomcat.max-active=8
#连接池的初始化连接数
spring.datasource.tomcat.initial-size=3
#连接池最大空闲链接数
spring.datasource.tomcat.max-idle=8
#连接池最小空闲连接数
spring.datasource.tomcat.min-idle=0
#等待连接池的最大时间
spring.datasource.tomcat.max-wait=3000
#连接最大存活时间
spring.datasource.tomcat.max-age=1800000
...@@ -65,7 +65,7 @@ class JdApiUtilTest extends BaseTest { ...@@ -65,7 +65,7 @@ class JdApiUtilTest extends BaseTest {
void createCoupon() { void createCoupon() {
System.out.println(JSON.toJSONString( System.out.println(JSON.toJSONString(
jdApiUtil.createCoupon(JdAppEnum.DUIBA, "dfef1ede28aa455999ddefe2944980cfzguy", jdApiUtil.createCoupon(JdAppEnum.DUIBA, "dfef1ede28aa455999ddefe2944980cfzguy",
"测试优惠券-zsp-06", 2))); "测试优惠券-排行榜-01", 50)));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment