Springboot下的RabbitMQ消息监听源码解读

Springboot下的RabbitMQ消息监听源码解读,第1张

以上配置比较简单,都是一些基本的配置,配置Rabbit的连接工厂,配置Template,客户端 *** 作的模版RabbitTemplate对象。

注解核心配置

主要注册一个BeanPostProcessor和RabbitListenerEndpointRegistry创建消息监听容器管理生命周期。

RabbitBootstrapConfiguration.java

在上一步将所有的方法方法上有@RabbitListener注解的)解析处理后,接下来开始处理消息监听

接着上面构建完MethodRabbitListenerEndpoint对象后,将所有的监听方法保存

到此消息监听@RabbitListener注解的方法就处理完成了,所有的监听方法都保存到了RabbitListenerAnnotationBeanPostProcessor.registrar.endpointDescriptors集合中。

RabbitListenerAnnotationBeanPostProcessor 处理器程序实现了SmartInitializingSingleton接口,所以在所有的Bean创建完成以后会执行Bean实现了SmartInitializingSingleton#afterSingletonsInstantiated的方法。

注册监听程序

注册监听容器

监听容器工厂父类创建监听容器

到此消息监听容器MessageListenerContainer(SimpleMessageListenerContainer)对象创建完成,

到这里主要的消息监听容器都创建完成后接下来就是启动消息监听容器了。

在2.2中注册了RabbitListenerEndpointRegistry 对象,该类实现了SmartLifecycle接口,也实现了ApplicationListener接口,并且处理的是ContextRefreshedEvent事件。

上面这两个动作都会在容器上下文初始化完成以后触发,在AbstractApplicationContext#refresh#finishRefresh方法中触发

开始消息监听

异步消息处理消费者AsyncMessageProcessingConsumer

事件处理

RabbitAutoConfiguration ===》RabbitAnnotationDrivenConfiguration ===》EnableRabbitConfiguration ===》 @EnableRabbit

注册RabbitListenerAnnotationBeanPostProcessor处理器处理@RabbitListener和@RabbitHandler注解

RabbitListenerAnnotationBeanPostProcessor类

将上一步解析出来的所有方法及对应的@RabbitListener注解中配置的信息进行包装到MethodRabbitListenerEndpoint中

说明:@RabbitListener注解中的errorHandler属性可以是SpEL表达式也可以是一个Bean的名称

该步骤中主要就是设置相关的一些属性信息到Endpoint中,比如:ackMode,queueName,concurrency等信息。

构造完Endpoint对象后将其保存到RabbitListenerEndpointRegistrar中。

RabbitListenerAnnotationBeanPostProcessor类实现了SmartInitializingSingleton接口,当所有的Bean初始化完成以后会执行实现了SmartInitializingSingleton接口Bean的回调方法afterSingletonsInstantiated。

在afterSingletonsInstantiated方法中调用RabbitListenerAnnotationBeanPostProcessor.registrar(RabbitListenerEndpointRegistrar)#afterPropertiesSet

方法。

在afterPropertiesSet方法中就是注册Endpoint了,在该方法中将所有的Endpoint再封装成MessageListenerContainer(SimpleMessageListenerContainer)

对象,最后将MessageListenerContainer对象保存到RabbitListenerEndpointRegistry.listenerContainers的Map集合中。

在这里是还没有启动所有的监听程序。

RabbitListenerEndpointRegistry对象Bean实现了SmartLifecycle接口,所以容器上下文执行完(刷新完)以后会调用实现了该接口的会滴方法start,启动消息监听。

SpringBoot多数据源配置详解

SpringBoot邮件发送示例

Springboot面试题整理附答案

SpringBoot配置文件你了解多少?

SpringBoot项目查看线上日志

springboot mybatis jpa 实现读写分离

Springboot整合openfeign使用详解

SpringBoot RabbitMQ消息可靠发送与接收

Springboot整合MyBatis复杂查询应用

Springboot整合RabbitMQ死信队列详解

1.在lichee/linux-3.0/include/linux/input.h文件可以查看底层驱动的按键编码

#define KEY_F1 59

#define KEY_F2 60

#define KEY_F3 61

#define KEY_F4 62

#define KEY_F5 63

#define KEY_F6 64

#define KEY_F7 65

#define KEY_F8 66

#define KEY_F9 67

#define KEY_F10 68

2.在android4.0/frameworks/base/core/java/android/view/KeyEvent.java文件可以查看上层驱动的按键编码

/** Key code constant: F1 key. */

public static final int KEYCODE_F1 = 131

/** Key code constant: F2 key. */

public static final int KEYCODE_F2 = 132

/** Key code constant: F3 key. */

public static final int KEYCODE_F3 = 133

/** Key code constant: F4 key. */

public static final int KEYCODE_F4 = 134

/** Key code constant: F5 key. */

public static final int KEYCODE_F5 = 135

/** Key code constant: F6 key. */

public static final int KEYCODE_F6 = 136

/** Key code constant: F7 key. */

public static final int KEYCODE_F7 = 137

/** Key code constant: F8 key. */

public static final int KEYCODE_F8 = 138

/** Key code constant: F9 key. */

public static final int KEYCODE_F9 = 139

/** Key code constant: F10 key. */

public static final int KEYCODE_F10 = 140

3.在/android4.0/frameworks/base/data/keyboards/Generic.kl文件里面有底层到上层的映射,将这个文件定制到自己的系统android4.0/out/target/product/crane-m1003h6/system/usr/keylayout目录下就可以了在上层收到USB键盘F1-F10的消息了。

key 59F1

key 60F2

key 61F3

key 62F4

key 63F5

key 64F6

key 65F7

key 66F8

key 67F9

key 68F10

4.在/android4.0/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java文件的onKeyDown,onKeyUp函数截获F1-F10的消息,用自己定义的广播消息广播出去应用就可以在后台或者前台都可以接收到按键按下或者释放的广播消息了。

case KeyEvent.KEYCODE_F1: {

//Log.e("zkliu","---------------------------test F1---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F1_KEYDOWN"))

return true

}

case KeyEvent.KEYCODE_F2: {

//Log.e("zkliu","---------------------------test F2---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F2_KEYDOWN"))

return true

}

case KeyEvent.KEYCODE_F3: {

//Log.e("zkliu","---------------------------test F3---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F3_KEYDOWN"))

return true

}

case KeyEvent.KEYCODE_F4: {

//Log.e("zkliu","---------------------------test F4---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F4_KEYDOWN"))

return true

}

case KeyEvent.KEYCODE_F5: {

//Log.e("zkliu","---------------------------test F5---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F5_KEYDOWN"))

return true

}

case KeyEvent.KEYCODE_F6: {

//Log.e("zkliu","---------------------------test F6---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F6_KEYDOWN"))

return true

}

case KeyEvent.KEYCODE_F7: {

//Log.e("zkliu","---------------------------test F7---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F7_KEYDOWN"))

return true

}

case KeyEvent.KEYCODE_F8: {

//Log.e("zkliu","---------------------------test F8---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F8_KEYDOWN"))

return true

}

case KeyEvent.KEYCODE_F9: {

//Log.e("zkliu","---------------------------test F9---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F9_KEYDOWN"))

return true

}

case KeyEvent.KEYCODE_F10: {

//Log.e("zkliu","---------------------------test F10---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F10_KEYDOWN"))

return true

}

case KeyEvent.KEYCODE_F1: {

//Log.e("zkliu","---------------------------test F1---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F1_KEYUP"))

return true

}

case KeyEvent.KEYCODE_F2: {

//Log.e("zkliu","---------------------------test F2---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F2_KEYUP"))

return true

}

case KeyEvent.KEYCODE_F3: {

//Log.e("zkliu","---------------------------test F3---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F3_KEYUP"))

return true

}

case KeyEvent.KEYCODE_F4: {

//Log.e("zkliu","---------------------------test F4---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F4_KEYUP"))

return true

}

case KeyEvent.KEYCODE_F5: {

//Log.e("zkliu","---------------------------test F5---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F5_KEYUP"))

return true

}

case KeyEvent.KEYCODE_F6: {

//Log.e("zkliu","---------------------------test F6---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F6_KEYUP"))

return true

}

case KeyEvent.KEYCODE_F7: {

//Log.e("zkliu","---------------------------test F7---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F7_KEYUP"))

return true

}

case KeyEvent.KEYCODE_F8: {

//Log.e("zkliu","---------------------------test F8---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F8_KEYUP"))

return true

}

case KeyEvent.KEYCODE_F9: {

//Log.e("zkliu","---------------------------test F9---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F9_KEYUP"))

return true

}

case KeyEvent.KEYCODE_F10: {

//Log.e("zkliu","---------------------------test F10---------------------------")

getContext().sendBroadcast(new Intent("com.android.action.F10_KEYUP"))

return true

}

应用程序注册接收相应的广播消息即可接收到键盘输入消息。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7772238.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存