Rabbitmq实现延时消息的两种方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rabbitmq实现延时消息的两种方式相关的知识,希望对你有一定的参考价值。
参考技术A Rabbitmq实现延时消息的两种方式使用队列的 ttl 特性,即配置死信队列的消息重新路由到消费队列中,同一个队列的消息过期时间将相同,即使消息本身可能带上了 ttl ,同样会因队头的消息未过期而无法消费;
定义两个队列 delay_message_queue_output 及 delay_message_queue_input ,并将 delay_message_queue_output 声明为延时队列,设定队列的 ttl 为 3000ms ,
deadLetterExchange及deadLetterQueueName表示若消息过期将转发至此交换机。
使用延时交换机实现延时消息更加灵活,可以针对每个消息设置任意的过期时间,交换机中的消息如果过期将路由到绑定的队列中进行消费;
定义两个队列并声明为延时 exchnage , delayed-exchange 需 rabbitmq 延时插件支持,在发送消息时带上 x-delay 参数指定过期时间;
使用队列的方式只能用于所有消息的过期时间均相同的情况下,延时中的消息总数可以延时队列中查看到,使用交换机插件的方式更加灵活,可以针对每个消息设置不同的超时,适应更多的业务场景,延时中的消息总数可以延时的交换机中查看到;
gitee https://gitee.com/viturefree/rabbitmq-delay
Android实现双击事件的两种方式
Work around的方法是先监听onTouch事件来监听连续点击次数,每次点击都布置一个间隔时间的延时任务,延时任务执行时判断间隔内是否还有点击,如果没有则发布点击次数,重置计数。
实现代码如下:
/** * 连续点击事件监听器 可以用作双击事件 * */ public abstract class OnMultiTouchListener implements OnTouchListener { /** * 上次 onTouch 发生的时间 */ private long lastTouchTime = 0; /** * 已经连续 touch 的次数 */ private AtomicInteger touchCount = new AtomicInteger(0); private Runnable mRun = null; public void removeCallback() { if (mRun != null) { getMainLoopHandler().removeCallbacks(mRun); mRun = null; } } @Override public boolean onTouch(final View v, final MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { final long now = System.currentTimeMillis(); lastTouchTime = now; touchCount.incrementAndGet(); //每点击一次就移除上一次的延迟任务,重新布置一个延迟任务 removeCallback(); mRun = new Runnable() { @Override public void run() {
//两个变量相等,表示时隔 multiTouchInterval之后没有新的touch产生, 触发事件并重置touchCount if (now == lastTouchTime) { onMultiTouch(v, event, touchCount.get()); touchCount.set(0); } } }; postTaskInUIThread(mRun, getMultiTouchInterval()); } return true; } /** * 连续touch的最大间隔, 超过该间隔将视为一次新的touch开始, 默认是400,推荐值,也可以由客户代码指定 * * @return */ protected int getMultiTouchInterval() { return 400; } /** * 连续点击事件回调 * * @param v * @param event * @param touchCount * 连续点击的次数 * @return */ public abstract void onMultiTouch(View v, MotionEvent event, int touchCount); }
使用代码:
mView.setOnTouchListener( new OnMultiTouchListener() { @Override public void onMultiTouch(View v, MotionEvent event, int touchCount) { if (touchCount == 2) { //双击 } } });
简洁直接的方法是用GestureDector类:
mView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { GestureDetector detector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return super.onSingleTapUp(e); } @Override public void onLongPress(MotionEvent e) { super.onLongPress(e); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return super.onScroll(e1, e2, distanceX, distanceY); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return super.onFling(e1, e2, velocityX, velocityY); } @Override public void onShowPress(MotionEvent e) { super.onShowPress(e); } @Override public boolean onDown(MotionEvent e) { return super.onDown(e); } @Override public boolean onDoubleTap(MotionEvent e) { return super.onDoubleTap(e); } @Override public boolean onDoubleTapEvent(MotionEvent e) { return super.onDoubleTapEvent(e); } @Override public boolean onSingleTapConfirmed(MotionEvent e) { return super.onSingleTapConfirmed(e); } @Override public boolean onContextClick(MotionEvent e) { return super.onContextClick(e); } }); detector.onTouchEvent(event); return false; } });
以上是关于Rabbitmq实现延时消息的两种方式的主要内容,如果未能解决你的问题,请参考以下文章
spring boot Rabbitmq集成,延时消息队列实现