延時隊列消息推送,用於訂單完成之後主動通知第三方平臺

創建延時隊列item,這裏用到了lombok,也可以自己寫get和set方法

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

import lombok.Data;

@Data
public class DelayItem implements Delayed{

    private long time;
    private Order order;
	
    @Override
    public int compareTo(Delayed o) {
        DelayItem item = (DelayItem) o;
        long diff = this.time - item.time;
        if (diff <= 0) {
            return -1;
        }else {
            return 1;
        }
    }
    
    @Override
    public long getDelay(TimeUnit unit) {
        return time - System.currentTimeMillis();
    }
    
    public DelayItem(Order order, long time) {
	    super();
	    this.time = time;
	    this.order = order;
    }

    public DelayItem(Order order, long time, TimeUnit unit) {
        this.order = order;
        this.time = System.currentTimeMillis() + (time > 0? unit.toMillis(time): 0);
    }
	
	
}

 

 使用方式(這裏建議另起一個線程,進行推送)



// 推送時間間隔  這裏最好寫配置文件
String delayTime = "1,5,10";
		
String[] delayTimeItem = delayTime.split(",");
// 封裝推送數據
DelayQueue<DelayItem> queue = new DelayQueue<DelayItem> ();
Order order = new Order ("ORDER123456");
for (String time : delayTimeItem) {
    DelayItem item = new DelayItem(order, Integer.parseInt(time), TimeUnit.SECONDS);
    queue.put(item);
}
for (int i = 0; i < queue.size(); i++) {
    DelayItem take = queue.take();
    String resut=HttpClientUtils.doPost("http://test.com/api/test",JSON.toJSON(take.getOrder()), null);
    if ("SUCCESS".equals(resut)) {
        return;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章