zoukankan      html  css  js  c++  java
  • redis做消息队列

    1.用redis中的List可以实现队列,这样可以用来做消息处理和任务调度的队列

    2.代码模拟

    代码结构

    生产者模拟程序

    /** 
     *  
     */  
    package scheduleTest;  
      
    import java.util.Random;  
    import java.util.UUID;  
      
    import redis.clients.jedis.Jedis;  
      
    /** 
     * 模拟一个生产者 
     * <p>Title: TaskProducer</p> 
     * <p>Description: </p> 
     * <p>Company: </p> 
     * @author 夏 杰 
     * @date 2015年12月11日 下午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();  
                }  
            }  
              
        }  
      
    }
     

    消费者模拟程序

    /** 
     *  
     */  
    package scheduleTest;  
      
    import java.util.Random;  
      
    import redis.clients.jedis.Jedis;  
      
    /** 
     * 模拟消费者 
     * <p>Title: TaskConsumer</p> 
     * <p>Description: </p> 
     * <p>Company: </p> 
     * @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+"处理成功,被清除");  
                      
                }     
            }  
                              
        }  
          
      
          
    }
     

    调度主程序

    /** 
     *  
     */  
    package scheduleTest;  
      
    /** 
     * <p>Title: TaskShedulerSystem</p> 
     * <p>Description: </p> 
     * <p>Company: </p> 
     * @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);  
        }  
    }
     

    运行结果

    插入了一个新的任务: 8025c8b8-f81f-4560-a653-3f339cc371a6

    插入了一个新的任务: 98dcf980-10d9-4df6-8765-a4873f6b6a74

    插入了一个新的任务: d9636112-4cea-4f49-9f70-88e934aa2a66

    插入了一个新的任务: 0a8a2799-d672-4444-b53d-74b679559565

    插入了一个新的任务: 3948e29e-0217-434a-b7fe-c3be2f0b1073

    插入了一个新的任务: f06c3a03-83a1-4278-a7c8-61d88afcbadf

    插入了一个新的任务: fbf7ed91-b1f1-4713-8490-325d77f951b0

    插入了一个新的任务: 99cbf0e4-d981-45ad-88f4-10db1604171e

    插入了一个新的任务: ca7cd3cf-9ae3-41a1-b8e1-c8ac9a729255

    插入了一个新的任务: 3c954253-d195-4185-b27d-390a6e441eaa

    插入了一个新的任务: 4b7f2b4d-c77b-4813-9a63-2b6975cb44a1

    插入了一个新的任务: 662e0d60-7163-444c-9f1a-43451bb442c3

    插入了一个新的任务: d9cca9bd-9870-468d-9beb-f2c3e029c58c

    插入了一个新的任务: 7af0318f-7771-4996-99aa-7adb26214f6c

    插入了一个新的任务: 7deb7d15-9234-44c8-92d6-53e44b578f6b

    插入了一个新的任务: 419a4e25-4343-43f6-bd0e-1f02c6aea19f

    插入了一个新的任务: b955ac83-6371-461e-b86b-2a12f45809cc

    8025c8b8-f81f-4560-a653-3f339cc371a6处理成功,被清除

    插入了一个新的任务: 73218c74-dfd6-46c3-84eb-a14df4a3f7f5

    98dcf980-10d9-4df6-8765-a4873f6b6a74处理成功,被清除

    插入了一个新的任务: f90f9781-6456-474f-8736-93dc3dcc548f

    d9636112-4cea-4f49-9f70-88e934aa2a66处理成功,被清除

    插入了一个新的任务: cc499c95-3153-4392-9341-3e7173cbf685

    0a8a2799-d672-4444-b53d-74b679559565处理失败,被弹回任务队列

    插入了一个新的任务: 437c33ae-8adb-49fd-8aad-9e7a396aa72b

    3948e29e-0217-434a-b7fe-c3be2f0b1073处理失败,被弹回任务队列

    插入了一个新的任务: dbd99594-0a82-4dee-a481-117e1541c549

    f06c3a03-83a1-4278-a7c8-61d88afcbadf处理成功,被清除

    插入了一个新的任务: d9900559-a995-49cd-9300-540375c21ea0

    fbf7ed91-b1f1-4713-8490-325d77f951b0处理成功,被清除

    插入了一个新的任务: 72dd3c9a-0cf7-4dd4-9a8d-378da4a531a1

  • 相关阅读:
    jdbc数据库连接
    判断集合元素唯一的原理-ArrayList的contains和HashSet的contains、add。Map接口、 集合嵌套
    集合、Iterator迭代器、增强for循环、泛型、List接口、Set接口
    String类、字符串缓冲区、正则表达式、
    Date、DateFormat类、Calendar类、基本类型包装类、System类、Math类、Arrays类、大数据运算类
    Java的API及Object类
    java学习中自己平时不注意的一点知识点1:基础知识第一部分
    匿名对象、内部类、包的声明与访问、访问修饰符、
    java 方法重载,引用数据类型整理 ArrayList集合整理
    java 二维数组 方法知识整理
  • 原文地址:https://www.cnblogs.com/wcss/p/14115150.html
Copyright © 2011-2022 走看看