利用redis做消息隊列的示例:
1.生產者模擬程序,代碼:
package scheduleTest;
import java.util.Random;
import java.util.UUID;
import redis.clients.jedis.Jedis;
/**
* 模擬一個生產者
*
Title: TaskProducer
*
Description:
*
Company:
* @author 夏 杰
* @date 2020年12月8日 下午4:26:48
* @vesion 1.0
*/
public class TaskProducer implements Runnable{
Jedis jedis = new Jedis("120.55.195.177",6379);
public void run() {
Random random = new Random();
while(true){
try{
Thread.sleep(random.nextInt(600) + 600);
// 模擬生成一個任務
UUID taskid = UUID.randomUUID();
//將任務插入任務隊列:task-queue
jedis.lpush("task-queue", taskid.toString());
System.out.println("插入了一個新的任務: " + taskid);
}catch(Exception e){
e.printStackTrace();
}
}
}
}
2.消費者模擬程序,代碼:
package scheduleTest;
import java.util.Random;
import redis.clients.jedis.Jedis;
/**
* 模擬消費者
*
Title: TaskConsumer
*
Description:
*
Company:
* @author 夏 杰
* @date 2015年12月11日 下午4:44:23
* @vesion 1.0
*/
public class TaskConsumer implements Runnable {
Jedis jedis = new Jedis("120.55.195.177",6379);
public void run() {
Random random = new Random();
while(true){
//從任務隊列"task-queue"中獲取一個任務,并將該任務放入暫存隊列"tmp-queue"
String taskid = jedis.rpoplpush("task-queue", "tmp-queue");
// 處理任務----純屬業務邏輯,模擬一下:睡覺
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//模擬成功和失敗的偶然現象
if(random.nextInt(13) % 7 == 0){// 模擬失敗的情況,概率為2/13
//將本次處理失敗的任務從暫存隊列"tmp-queue"中,彈回任務隊列"task-queue"
jedis.rpoplpush("tmp-queue", "task-queue");
System.out.println(taskid + "處理失敗,被彈回任務隊列");
} else {// 模擬成功的情況
// 將本次任務從暫存隊列"tmp-queue"中清除
jedis.rpop("tmp-queue");
System.out.println(taskid+"處理成功,被清除");
}
}
}
}
3.調度主程序,代碼:
package scheduleTest;
/**
*
Title: TaskShedulerSystem
*
Description:
*
Company:
* @author 夏 杰
* @date 2015年12月11日 下午4:19:09
* @vesion 1.0
*/
public class TaskShedulerSystem {
public static void main(String[] args) throws Exception {
// 啟動一個生產者線程,模擬任務的產生
new Thread(new TaskProducer()).start();
Thread.sleep(15000);
//啟動一個線程者線程,模擬任務的處理
new Thread(new TaskConsumer()).start();
//主線程休眠
Thread.sleep(Long.MAX_VALUE);
}
}