复制代码代码如下:
แพ็คเกจ com.happyelements.odin.util;
นำเข้า com.google.common.base.preconditions.checknotnull;
นำเข้า org.jetbrains.annotations.notnull;
นำเข้า com.happyelements.odin.jedis.jedisclient;
นำเข้า com.happyelements.rdcenter.commons.util.datetimeutil;
-
* ผู้ใช้: Jude.wang
* วันที่: 14-1-16
* เวลา: 上午 9:43
-
ชั้นเรียนสาธารณะพร้อมกัน {
สตริงสุดท้ายคงที่สาธารณะ user_lock_key_format = "user_lock_%d_%s";
สตริงสุดท้ายคงที่สาธารณะ custom_lock_format = "custom_lock_%s";
สาธารณะคงสุดท้าย jedisclient redisclient = jedisclient.getInstance ();
สตริงสุดท้ายคงที่สาธารณะปลดล็อค = "0";
สตริงสุดท้ายคงที่ล็อค = "1";
INT สุดท้ายคงที่ int max_repeat_times = 10;
@notnull
String String สาธารณะ BuildUserLockkey (Long UserId, @NotNull String Key) {
CheckNotNull (กุญแจ);
return string.format (user_lock_key_format, userId, คีย์);
-
@notnull
String String สาธารณะ buildCustomLockKey (@NotNull String Key) {
CheckNotNull (กุญแจ);
return string.format (custom_lock_format, key);
-
-
* 此方法可以因为拿不到锁而导致การดำเนินการ没有执行
-
* @param key
* @see com.happyelements.odin.util.concurrentutil#buildcustomlockkey (สตริง)
* @see com.happyelements.odin.util.concurrentutil#builduserlockkey (ยาว, สตริง)
-
* การดำเนินการ @param
* @throws com.happyelements.odin.util.concurrentutil.operationnotExecexception
* การดำเนินการ没有被执行
-
โมฆะคงที่สาธารณะ DOJOBWITHLOCK (คีย์สตริง @NotNull, @NotNull ilockOperation การดำเนินการ) พ่น OperationNotExecException {
บูลีนล็อค = เท็จ;
พยายาม {
CheckNotNull (กุญแจ);
checkNotNull (การดำเนินการ);
ล็อค = ล็อค (กุญแจ);
} catch (throwable t) {
โยน OperationNotExecException ใหม่ (คีย์, t);
-
พยายาม {
ถ้า (ล็อค) {
// system.out.println (thread.currentthread () + "/t" + "ล็อค");
Operation.doJob ();
} อื่น {
โยน OperationNotExecException ใหม่ (คีย์);
-
} ในที่สุด {
ถ้า (ล็อค) {
ปลดล็อก (กุญแจ);
-
-
-
โมฆะคงที่ส่วนตัวปลดล็อค (คีย์สตริง) {
พยายาม {
CheckNotNull (กุญแจ);
string oldstatus = redisclient.getSet (คีย์, ปลดล็อค);
if (isunlocked (oldstatus)) {
// lock-> dojob-> 过期-> ปลดล็อค
// todo log
-
} catch (throwable t) {
// todo log
-
// system.out.println (thread.currentthread () + "/t" + "ปลดล็อค");
-
บูลีนคงที่ส่วนตัว isunlocked (สถานะสตริง) {
สถานะส่งคืน == null || status.equals (ปลดล็อค);
-
ล็อคบูลีนแบบคงที่ส่วนตัว (คีย์สตริง) {
บูลีนล็อค = เท็จ;
สำหรับ (int i = 0; i <max_repeat_times; i ++) {
String oldstatus = redisclient.getSet (คีย์, ล็อค);
if (isunlocked (oldstatus)) {
if (oldstatus == null) {
redisclient.expire (คีย์, datetimeutil.minute_second * 5);
ล็อค = จริง;
หยุดพัก;
-
ล็อค = จริง;
หยุดพัก;
-
-
กลับล็อค;
-
อินเทอร์เฟซคงที่สาธารณะ ilockoperation {
โมฆะ dojob ();
-
-
* {@link com.happyelements.odin.util.concurrentutil.ilockoperation#dojob ()} 没有被执行
* 上层必须处理该异常, 捕获到该异常可以 retry 本次操作, 或者包装成 {@link com.happyelements.rdcenter.commons.throwable.heexception} 抛出去
-
การดำเนินการระดับสแตติกสาธารณะ Public OperationNotExecException ขยายข้อยกเว้น {
Public OperationNotExecException () {
-
Public OperationNotExecException (String S) {
Super (s);
-
Public OperationNotExecException (String s, throwable throwable) {
super (s, throwable);
-
Public OperationNotExecException (โยนได้ได้) {
super (throwable);
-
-
-