天天看点

利用Redis 实现消息队列

利用Redis 实现消息队列

代码结构

利用Redis 实现消息队列

生产者模拟程序

<code>/** </code>

<code> </code><code>*  </code>

<code> </code><code>*/</code>  

<code>package</code> <code>scheduleTest;  </code>

<code>  </code> 

<code>import</code> <code>java.util.Random;  </code>

<code>import</code> <code>java.util.UUID;  </code>

<code>import</code> <code>redis.clients.jedis.Jedis;  </code>

<code> </code><code>* 模拟一个生产者 </code>

<code> </code><code>* &lt;p&gt;Title: TaskProducer&lt;/p&gt; </code>

<code> </code><code>* &lt;p&gt;Description: &lt;/p&gt; </code>

<code> </code><code>* &lt;p&gt;Company: &lt;/p&gt; </code>

<code> </code><code>* @author 夏 杰 </code>

<code> </code><code>* @date 2015年12月11日 下午4:26:48 </code>

<code> </code><code>* @vesion 1.0 </code>

<code>*/</code>  

<code>public</code> <code>class</code> <code>TaskProducer </code><code>implements</code> <code>Runnable{  </code>

<code>    </code><code>Jedis jedis = </code><code>new</code> <code>Jedis(</code><code>"120.55.195.177"</code><code>,</code><code>6379</code><code>);  </code>

<code>      </code> 

<code>    </code><code>public</code> <code>void</code> <code>run() {  </code>

<code>        </code><code>Random random = </code><code>new</code> <code>Random();  </code>

<code>        </code><code>while</code><code>(</code><code>true</code><code>){  </code>

<code>            </code><code>try</code><code>{  </code>

<code>                </code><code>Thread.sleep(random.nextInt(</code><code>600</code><code>) + </code><code>600</code><code>);  </code>

<code>                </code><code>// 模拟生成一个任务  </code>

<code>                </code><code>UUID taskid = UUID.randomUUID();  </code>

<code>                </code><code>//将任务插入任务队列:task-queue  </code>

<code>                </code><code>jedis.lpush(</code><code>"task-queue"</code><code>, taskid.toString());  </code>

<code>                </code><code>System.out.println(</code><code>"插入了一个新的任务: "</code> <code>+ taskid);  </code>

<code>            </code><code>}</code><code>catch</code><code>(Exception e){  </code>

<code>                </code><code>e.printStackTrace();  </code>

<code>            </code><code>}  </code>

<code>        </code><code>}  </code>

<code>          </code> 

<code>    </code><code>}  </code>

<code>}</code>

消费者模拟程序

<code> </code><code>* 模拟消费者 </code>

<code> </code><code>* &lt;p&gt;Title: TaskConsumer&lt;/p&gt; </code>

<code> </code><code>* @date 2015年12月11日 下午4:44:23 </code>

<code>public</code> <code>class</code> <code>TaskConsumer </code><code>implements</code> <code>Runnable {  </code>

<code>              </code> 

<code>            </code><code>//从任务队列"task-queue"中获取一个任务,并将该任务放入暂存队列"tmp-queue"  </code>

<code>            </code><code>String taskid = jedis.rpoplpush(</code><code>"task-queue"</code><code>, </code><code>"tmp-queue"</code><code>);  </code>

<code>            </code><code>// 处理任务----纯属业务逻辑,模拟一下:睡觉  </code>

<code>            </code><code>try</code> <code>{  </code>

<code>                </code><code>Thread.sleep(</code><code>1000</code><code>);  </code>

<code>            </code><code>} </code><code>catch</code> <code>(InterruptedException e) {  </code>

<code>            </code><code>//模拟成功和失败的偶然现象  </code>

<code>            </code><code>if</code><code>(random.nextInt(</code><code>13</code><code>) % </code><code>7</code> <code>== </code><code>0</code><code>){</code><code>// 模拟失败的情况,概率为2/13  </code>

<code>                </code><code>//将本次处理失败的任务从暂存队列"tmp-queue"中,弹回任务队列"task-queue"  </code>

<code>                </code><code>jedis.rpoplpush(</code><code>"tmp-queue"</code><code>, </code><code>"task-queue"</code><code>);  </code>

<code>                </code><code>System.out.println(taskid + </code><code>"处理失败,被弹回任务队列"</code><code>);  </code>

<code>            </code><code>} </code><code>else</code> <code>{</code><code>// 模拟成功的情况  </code>

<code>                  </code> 

<code>                </code><code>// 将本次任务从暂存队列"tmp-queue"中清除  </code>

<code>                </code><code>jedis.rpop(</code><code>"tmp-queue"</code><code>);  </code>

<code>                </code><code>System.out.println(taskid+</code><code>"处理成功,被清除"</code><code>);  </code>

<code>            </code><code>}     </code>

<code>                          </code> 

调度主程序

<code> </code><code>* &lt;p&gt;Title: TaskShedulerSystem&lt;/p&gt; </code>

<code> </code><code>* @date 2015年12月11日 下午4:19:09 </code>

<code>public</code> <code>class</code> <code>TaskShedulerSystem {  </code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) </code><code>throws</code> <code>Exception {  </code>

<code>        </code><code>// 启动一个生产者线程,模拟任务的产生  </code>

<code>        </code><code>new</code> <code>Thread(</code><code>new</code> <code>TaskProducer()).start();  </code>

<code>        </code><code>Thread.sleep(</code><code>15000</code><code>);  </code>

<code>        </code><code>//启动一个线程者线程,模拟任务的处理  </code>

<code>        </code><code>new</code> <code>Thread(</code><code>new</code> <code>TaskConsumer()).start();  </code>

<code>        </code><code>//主线程休眠  </code>

<code>        </code><code>Thread.sleep(Long.MAX_VALUE);  </code>

运行结果

插入了一个新的任务: 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

      本文转自布拉君君 51CTO博客,原文链接:http://blog.51cto.com/5148737/1976868,如需转载请自行联系原作者

下一篇: DNS 原理

继续阅读