注解核心配置
主要注册一个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
}
应用程序注册接收相应的广播消息即可接收到键盘输入消息。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)