Skip to content

Commit

Permalink
🎨 #1820 优化更新getTicket方法,调整锁调用时机避免并发问题
Browse files Browse the repository at this point in the history
* Fix:调整获取相关票据的锁处理时机

* Fix:更新票据,锁之后,再次检查是否有效,避免并发同时进入多次重置票据

Co-authored-by: weiwei.xing <[email protected]>
  • Loading branch information
soulinfo and nplus-xingweiwei authored Oct 25, 2020
1 parent 449bda4 commit 15e02d7
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,22 +32,25 @@ public String getCardApiTicket() throws WxErrorException {

@Override
public String getCardApiTicket(boolean forceRefresh) throws WxErrorException {
Lock lock = this.wxMaService.getWxMaConfig().getCardApiTicketLock();
lock.lock();
try {
if (forceRefresh) {
this.wxMaService.getWxMaConfig().expireCardApiTicket();
}

if (this.wxMaService.getWxMaConfig().isCardApiTicketExpired()) {
String responseContent = this.wxMaService.get(GET_JSAPI_TICKET_URL + "?type=wx_card", null);
JsonObject tmpJsonObject = GsonParser.parse(responseContent);
String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
this.wxMaService.getWxMaConfig().updateCardApiTicket(jsapiTicket, expiresInSeconds);
if (forceRefresh) {
this.wxMaService.getWxMaConfig().expireCardApiTicket();
}

if (this.wxMaService.getWxMaConfig().isCardApiTicketExpired()) {
Lock lock = this.wxMaService.getWxMaConfig().getCardApiTicketLock();
lock.lock();
try {
if (this.wxMaService.getWxMaConfig().isCardApiTicketExpired()) {
String responseContent = this.wxMaService.get(GET_JSAPI_TICKET_URL + "?type=wx_card", null);
JsonObject tmpJsonObject = GsonParser.parse(responseContent);
String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
this.wxMaService.getWxMaConfig().updateCardApiTicket(jsapiTicket, expiresInSeconds);
}
} finally {
lock.unlock();
}
} finally {
lock.unlock();
}
return this.wxMaService.getWxMaConfig().getCardApiTicket();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,23 +151,26 @@ public String getTicket(TicketType type) throws WxErrorException {

@Override
public String getTicket(TicketType type, boolean forceRefresh) throws WxErrorException {
Lock lock = this.getWxMpConfigStorage().getTicketLock(type);
lock.lock();
try {
if (forceRefresh) {
this.getWxMpConfigStorage().expireTicket(type);
}

if (this.getWxMpConfigStorage().isTicketExpired(type)) {
String responseContent = execute(SimpleGetRequestExecutor.create(this),
GET_TICKET_URL.getUrl(this.getWxMpConfigStorage()) + type.getCode(), null);
JsonObject tmpJsonObject = GsonParser.parse(responseContent);
String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
this.getWxMpConfigStorage().updateTicket(type, jsapiTicket, expiresInSeconds);
if (forceRefresh) {
this.getWxMpConfigStorage().expireTicket(type);
}

if (this.getWxMpConfigStorage().isTicketExpired(type)) {
Lock lock = this.getWxMpConfigStorage().getTicketLock(type);
lock.lock();
try {
if (this.getWxMpConfigStorage().isTicketExpired(type)) {
String responseContent = execute(SimpleGetRequestExecutor.create(this),
GET_TICKET_URL.getUrl(this.getWxMpConfigStorage()) + type.getCode(), null);
JsonObject tmpJsonObject = GsonParser.parse(responseContent);
String jsapiTicket = tmpJsonObject.get("ticket").getAsString();
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
this.getWxMpConfigStorage().updateTicket(type, jsapiTicket, expiresInSeconds);
}
} finally {
lock.unlock();
}
} finally {
lock.unlock();
}

return this.getWxMpConfigStorage().getTicket(type);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,24 +48,26 @@ public String getCardApiTicket() throws WxErrorException {
@Override
public String getCardApiTicket(boolean forceRefresh) throws WxErrorException {
final TicketType type = TicketType.WX_CARD;
Lock lock = getWxMpService().getWxMpConfigStorage().getTicketLock(type);
lock.lock();
try {

if (forceRefresh) {
this.getWxMpService().getWxMpConfigStorage().expireTicket(type);
}
if (forceRefresh) {
this.getWxMpService().getWxMpConfigStorage().expireTicket(type);
}

if (this.getWxMpService().getWxMpConfigStorage().isTicketExpired(type)) {
String responseContent = this.wxMpService.execute(SimpleGetRequestExecutor
.create(this.getWxMpService().getRequestHttp()), WxMpApiUrl.Card.CARD_GET_TICKET, null);
JsonObject tmpJsonObject = GsonParser.parse(responseContent);
String cardApiTicket = tmpJsonObject.get("ticket").getAsString();
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
this.getWxMpService().getWxMpConfigStorage().updateTicket(type, cardApiTicket, expiresInSeconds);
if (this.getWxMpService().getWxMpConfigStorage().isTicketExpired(type)) {
Lock lock = getWxMpService().getWxMpConfigStorage().getTicketLock(type);
lock.lock();
try {
if (this.getWxMpService().getWxMpConfigStorage().isTicketExpired(type)) {
String responseContent = this.wxMpService.execute(SimpleGetRequestExecutor
.create(this.getWxMpService().getRequestHttp()), WxMpApiUrl.Card.CARD_GET_TICKET, null);
JsonObject tmpJsonObject = GsonParser.parse(responseContent);
String cardApiTicket = tmpJsonObject.get("ticket").getAsString();
int expiresInSeconds = tmpJsonObject.get("expires_in").getAsInt();
this.getWxMpService().getWxMpConfigStorage().updateTicket(type, cardApiTicket, expiresInSeconds);
}
} finally {
lock.unlock();
}
} finally {
lock.unlock();
}
return this.getWxMpService().getWxMpConfigStorage().getTicket(type);
}
Expand Down

0 comments on commit 15e02d7

Please sign in to comment.