利用Redis生成自增序列訂單號及解決spring-boot工具類沒法自動注入其餘類

package io.thanz.util;


import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * 生成訂單號
 * 定義訂單號規則
 * 下單渠道+業務類型+時間信息+自增
 * 下單渠道:1(根據本身業務設置)
 * 業務類型:1(根據本身業務設置)
 * 時間信息:秒級時間戳,如java的 (System.currentTimeMillis()/1000 + "").substring(1)
 * 自增:3位自增,可採用redis的incr,從redis取到值後對1000取餘,若是值不存在初始可設爲111
 * 總位數:1位+1位+9位+3位=14位
 *
 * @author fzx
 * @date 2018/11/2
 */
@Component
public class BookingOrderNoCreator {
  @Resource
  private StringRedisTemplate autowireRedisTemplate;

  private static RedisTemplate redisTemplate;

  private static final String CHANNEL = "1";

  private static final String BUSINESSTYPE = "1";


  @PostConstruct
  public void init() {
    redisTemplate = autowireRedisTemplate;
  }

  public static String createBookingOrderNo() {
    StringBuilder bookingOrderNo = new StringBuilder();
    RedisAtomicLong redisAtomicLong = new RedisAtomicLong("bookingOrderNo", redisTemplate.getConnectionFactory());
    Long currentValue = redisAtomicLong.get();
    if (currentValue == 0) {
      redisAtomicLong.set(111L);
    }
    Long incrementValue = redisAtomicLong.incrementAndGet() % 1000;
    bookingOrderNo.append(CHANNEL).append(BUSINESSTYPE).append((System.currentTimeMillis() / 1000 + "").substring(1)).append(incrementValue);
    return bookingOrderNo.toString();
  }


}
複製代碼

      其緣由是spring-boot啓動時沒有掃描到工具類,因此第一步在工具類的class級別加上註釋@Component,其後在變量autowireRedisTemplate上加上@Resource自動注入,爲了能讓static方法能用,再建一個靜態變量redisTemplate,用一個@PostConstruct註釋的方法將autowireRedisTemplate賦值給redisTemplate(此方法會在項目啓動時一同運行),最後,static方法中使用redisTemplate進行業務處理。java

      具體沒法注入緣由我也不是很肯定,若是有疑問或者指教請在下方評論,謝謝~redis

相關文章
相關標籤/搜索