问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

RocketMQBinder集成消息订阅

发布网友 发布时间:2024-10-01 17:31

我来回答

1个回答

热心网友 时间:2024-10-17 20:14

RocketMQBinder集成消息订阅

AbstractMessageChannelBinder类中提供了创建MessageProducer的协议,在初始化Binder的时候加载createConsumerEndpoint方法。

RocketMQMessageChannelBinder完成RocketMQInboundChannelAdapter的创建和初始化。

RocketMQMessageChannelBinder的createConsumerEndpoint方法:

@OverrideprotectedMessageProducercreateConsumerEndpoint(ConsumerDestinationdestination,Stringgroup,ExtendedConsumerProperties<RocketMQConsumerProperties>consumerProperties)throwsException{if(group==null||"".equals(group)){thrownewRuntimeException("'groupmustbeconfiguredforchannel"+destination.getName());}RocketMQListenerBindingContainerlistenerContainer=newRocketMQListenerBindingContainer(consumerProperties,rocketBinderConfigurationProperties,this);listenerContainer.setConsumerGroup(group);listenerContainer.setTopic(destination.getName());listenerContainer.setConsumeThreadMax(consumerProperties.getConcurrency());listenerContainer.setSuspendCurrentQueueTimeMillis(consumerProperties.getExtension().getSuspendCurrentQueueTimeMillis());listenerContainer.setDelayLevelWhenNextConsume(consumerProperties.getExtension().getDelayLevelWhenNextConsume());listenerContainer.setNameServer(rocketBinderConfigurationProperties.getNameServer());listenerContainer.setHeaderMapper(createHeaderMapper(consumerProperties));RocketMQInboundChannelAdapterrocketInboundChannelAdapter=newRocketMQInboundChannelAdapter(listenerContainer,consumerProperties,instrumentationManager);topicInUse.put(destination.getName(),group);ErrorInfrastructureerrorInfrastructure=registerErrorInfrastructure(destination,group,consumerProperties);if(consumerProperties.getMaxAttempts()>1){rocketInboundChannelAdapter.setRetryTemplate(buildRetryTemplate(consumerProperties));rocketInboundChannelAdapter.setRecoveryCallback(errorInfrastructure.getRecoverer());}else{rocketInboundChannelAdapter.setErrorChannel(errorInfrastructure.getErrorChannel());}returnrocketInboundChannelAdapter;}

RocketMQInboundChannelAdapter是适配器,需要适配SpringFramework的重试和回调机制,用来订阅消息和转化消息格式。RocketMQListenerBindingContainer是对RocketMQ客户端API的封装,适配器中持有它的对象。

RocketMQ提供两种消费模式:顺序消费和并发消费。RocketMQ客户端API中顺序消费的默认监听器是DefaultMessageListenerOrderly,并发消费的默认监听器是DefaultMessageListenerConcurrently类,无论哪个消费模式,监听器收到的消息都会回调RocketMQListener

RocketMQInboundChannelAdapter中创建和初始化RocketMQListener的实现类

RocketMQInboundChannelAdapter

@OverrideprotectedvoidonInit(){if(consumerProperties==null||!consumerProperties.getExtension().getEnabled()){return;}super.onInit();if(this.retryTemplate!=null){Assert.state(getErrorChannel()==null,"Cannothavean'errorChannel'propertywhena'RetryTemplate'is"+"provided;usean'ErrorMessageSendingRecoverer'inthe'recoveryCallback'propertyto"+"sendanerrormessagewhenretriesareexhausted");}BindingRocketMQListenerlistener=newBindingRocketMQListener();rocketMQListenerContainer.setRocketMQListener(listener);if(retryTemplate!=null){this.retryTemplate.registerListener(listener);}try{rocketMQListenerContainer.afterPropertiesSet();}catch(Exceptione){log.error("rocketMQListenerContaineriniterror:"+e.getMessage(),e);thrownewIllegalArgumentException("rocketMQListenerContaineriniterror:"+e.getMessage(),e);}instrumentationManager.addHealthInstrumentation(newInstrumentation(rocketMQListenerContainer.getTopic()+rocketMQListenerContainer.getConsumerGroup()));}protectedclassBindingRocketMQListenerimplementsRocketMQListener<Message>,RetryListener{@OverridepublicvoidonMessage(Messagemessage){booleanenableRetry=RocketMQInboundChannelAdapter.this.retryTemplate!=null;if(enableRetry){RocketMQInboundChannelAdapter.this.retryTemplate.execute(context->{RocketMQInboundChannelAdapter.this.sendMessage(message);returnnull;},(RecoveryCallback<Object>)RocketMQInboundChannelAdapter.this.recoveryCallback);}else{RocketMQInboundChannelAdapter.this.sendMessage(message);}}@Overridepublic<T,EextendsThrowable>booleanopen(RetryContextcontext,RetryCallback<T,E>callback){returntrue;}@Overridepublic<T,EextendsThrowable>voidclose(RetryContextcontext,RetryCallback<T,E>callback,Throwablethrowable){}@Overridepublic<T,EextendsThrowable>voidonError(RetryContextcontext,RetryCallback<T,E>callback,Throwablethrowable){}}

DefaultMessageListenerOrderly收到RocketMQ消息后,先回调BindingRocketMQListener的onMessage方法,再调用RocketMQInboundChannelAdapter父类的sendMessage方法将消息发送到DirectChannel

SpringCloudStream的接收消息和发送消息的消息模型是一致的,Binder中接收的消息先发送到MessageChannel,由订阅的MessageChannel通过Dispatcher转发到对应的MessageHandler进行处理。

RocketMQInboundChannelAdapter的父类MessageProducerSupport的getOutputChannel()得到的MessageChannel是在初始化RocketMQBinder时传入的DirectChannel

MessageProducerSupport的getOutputChannel方法:

@OverridepublicMessageChannelgetOutputChannel(){if(this.outputChannelName!=null){synchronized(this){if(this.outputChannelName!=null){this.outputChannel=getChannelResolver().resolveDestination(this.outputChannelName);this.outputChannelName=null;}}}returnthis.outputChannel;}

MessagingTemplate继承GenericMessagingTemplate类,实际执行doSend()方法发送消息

MessageChannel的实例是DirectChannel对象,复用前面消息发送流程,通过消息分发类MessageDispatcher把消息分发给MessageHandler

DirectChannel对应的消息处理器是StreamListenerMessageHandler

publicclassStreamListenerMessageHandlerextendsAbstractReplyProducingMessageHandler{privatefinalInvocableHandlerMethodinvocableHandlerMethod;privatefinalbooleancopyHeaders;StreamListenerMessageHandler(InvocableHandlerMethodinvocableHandlerMethod,booleancopyHeaders,String[]notPropagatedHeaders){super();this.invocableHandlerMethod=invocableHandlerMethod;this.copyHeaders=copyHeaders;this.setNotPropagatedHeaders(notPropagatedHeaders);}@OverrideprotectedbooleanshouldCopyRequestHeaders(){returnthis.copyHeaders;}publicbooleanisVoid(){returnthis.invocableHandlerMethod.isVoid();}@OverrideprotectedObjecthandleRequestMessage(Message<?>requestMessage){try{returnthis.invocableHandlerMethod.invoke(requestMessage);}catch(Exceptione){if(einstanceofMessagingException){throw(MessagingException)e;}else{thrownewMessagingException(requestMessage,"Exceptionthrownwhileinvoking"+this.invocableHandlerMethod.getShortLogMessage(),e);}}}}

InvocableHandlerMethod使用java反射机制完成回调,StreamListenerMessageHandler与@

StreamListenerAnnotationBeanPostProcessor的afterSingletonsInstantiated方法:

@OverridepublicfinalvoidafterSingletonsInstantiated(){this.injectAndPostProcessDependencies();EvaluationContextevaluationContext=IntegrationContextUtils.getEvaluationContext(this.applicationContext.getBeanFactory());for(Map.Entry<String,List<StreamListenerHandlerMethodMapping>>mappedBindingEntry:this.mappedListenerMethods.entrySet()){ArrayList<DispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper>handlers;handlers=newArrayList<>();for(StreamListenerHandlerMethodMappingmapping:mappedBindingEntry.getValue()){finalInvocableHandlerMethodinvocableHandlerMethod=this.messageHandlerMethodFactory.createInvocableHandlerMethod(mapping.getTargetBean(),checkProxy(mapping.getMethod(),mapping.getTargetBean()));StreamListenerMessageHandlerstreamListenerMessageHandler=newStreamListenerMessageHandler(invocableHandlerMethod,resolveExpressionAsBoolean(mapping.getCopyHeaders(),"copyHeaders"),this.springIntegrationProperties.getMessageHandlerNotPropagatedHeaders());streamListenerMessageHandler.setApplicationContext(this.applicationContext);streamListenerMessageHandler.setBeanFactory(this.applicationContext.getBeanFactory());if(StringUtils.hasText(mapping.getDefaultOutputChannel())){streamListenerMessageHandler.setOutputChannelName(mapping.getDefaultOutputChannel());}streamListenerMessageHandler.afterPropertiesSet();if(StringUtils.hasText(mapping.getCondition())){StringconditionAsString=resolveExpressionAsString(mapping.getCondition(),"condition");Expressioncondition=SPEL_EXPRESSION_PARSER.parseExpression(conditionAsString);handlers.add(newDispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper(condition,streamListenerMessageHandler));}else{handlers.add(newDispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper(null,streamListenerMessageHandler));}}if(handlers.size()>1){for(DispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapperhandler:handlers){Assert.isTrue(handler.isVoid(),StreamListenerErrorMessages.MULTIPLE_VALUE_RETURNING_METHODS);}}AbstractReplyProducingMessageHandlerhandler;if(handlers.size()>1||handlers.get(0).getCondition()!=null){handler=newDispatchingStreamListenerMessageHandler(handlers,evaluationContext);}else{handler=handlers.get(0).getStreamListenerMessageHandler();}handler.setApplicationContext(this.applicationContext);handler.setChannelResolver(this.binderAwareChannelResolver);handler.afterPropertiesSet();this.applicationContext.getBeanFactory().registerSingleton(handler.getClass().getSimpleName()+handler.hashCode(),handler);this.applicationContext.getBean(mappedBindingEntry.getKey(),SubscribableChannel.class).subscribe(handler);}this.mappedListenerMethods.clear();}

在Spring容器管理的所有单例对象初始化完成之后,遍历StreamListenerHandlerMethodMapping,进行InvocableHandlerMethod和StreamListenerMessageHandler的创建和初始化

StreamListenerHandlerMethodMapping保存了StreamListener和InvocableHandlerMethod的映射关系,映射关系的创建是在StreamListenerAnnotationBeanPostProcessor的postProcessAfterInitialization()方法

@OverridepublicfinalObjectpostProcessAfterInitialization(Objectbean,finalStringbeanName)throwsBeansException{Class<?>targetClass=AopUtils.isAopProxy(bean)?AopUtils.getTargetClass(bean):bean.getClass();Method[]uniqueDeclaredMethods=ReflectionUtils.getUniqueDeclaredMethods(targetClass);for(Methodmethod:uniqueDeclaredMethods){StreamListenerstreamListener=AnnotatedElementUtils.findMergedAnnotation(method,StreamListener.class);if(streamListener!=null&&!method.isBridge()){this.streamListenerCallbacks.add(()->{Assert.isTrue(method.g

热心网友 时间:2024-10-17 20:12

RocketMQBinder集成消息订阅

AbstractMessageChannelBinder类中提供了创建MessageProducer的协议,在初始化Binder的时候加载createConsumerEndpoint方法。

RocketMQMessageChannelBinder完成RocketMQInboundChannelAdapter的创建和初始化。

RocketMQMessageChannelBinder的createConsumerEndpoint方法:

@OverrideprotectedMessageProducercreateConsumerEndpoint(ConsumerDestinationdestination,Stringgroup,ExtendedConsumerProperties<RocketMQConsumerProperties>consumerProperties)throwsException{if(group==null||"".equals(group)){thrownewRuntimeException("'groupmustbeconfiguredforchannel"+destination.getName());}RocketMQListenerBindingContainerlistenerContainer=newRocketMQListenerBindingContainer(consumerProperties,rocketBinderConfigurationProperties,this);listenerContainer.setConsumerGroup(group);listenerContainer.setTopic(destination.getName());listenerContainer.setConsumeThreadMax(consumerProperties.getConcurrency());listenerContainer.setSuspendCurrentQueueTimeMillis(consumerProperties.getExtension().getSuspendCurrentQueueTimeMillis());listenerContainer.setDelayLevelWhenNextConsume(consumerProperties.getExtension().getDelayLevelWhenNextConsume());listenerContainer.setNameServer(rocketBinderConfigurationProperties.getNameServer());listenerContainer.setHeaderMapper(createHeaderMapper(consumerProperties));RocketMQInboundChannelAdapterrocketInboundChannelAdapter=newRocketMQInboundChannelAdapter(listenerContainer,consumerProperties,instrumentationManager);topicInUse.put(destination.getName(),group);ErrorInfrastructureerrorInfrastructure=registerErrorInfrastructure(destination,group,consumerProperties);if(consumerProperties.getMaxAttempts()>1){rocketInboundChannelAdapter.setRetryTemplate(buildRetryTemplate(consumerProperties));rocketInboundChannelAdapter.setRecoveryCallback(errorInfrastructure.getRecoverer());}else{rocketInboundChannelAdapter.setErrorChannel(errorInfrastructure.getErrorChannel());}returnrocketInboundChannelAdapter;}

RocketMQInboundChannelAdapter是适配器,需要适配SpringFramework的重试和回调机制,用来订阅消息和转化消息格式。RocketMQListenerBindingContainer是对RocketMQ客户端API的封装,适配器中持有它的对象。

RocketMQ提供两种消费模式:顺序消费和并发消费。RocketMQ客户端API中顺序消费的默认监听器是DefaultMessageListenerOrderly,并发消费的默认监听器是DefaultMessageListenerConcurrently类,无论哪个消费模式,监听器收到的消息都会回调RocketMQListener

RocketMQInboundChannelAdapter中创建和初始化RocketMQListener的实现类

RocketMQInboundChannelAdapter

@OverrideprotectedvoidonInit(){if(consumerProperties==null||!consumerProperties.getExtension().getEnabled()){return;}super.onInit();if(this.retryTemplate!=null){Assert.state(getErrorChannel()==null,"Cannothavean'errorChannel'propertywhena'RetryTemplate'is"+"provided;usean'ErrorMessageSendingRecoverer'inthe'recoveryCallback'propertyto"+"sendanerrormessagewhenretriesareexhausted");}BindingRocketMQListenerlistener=newBindingRocketMQListener();rocketMQListenerContainer.setRocketMQListener(listener);if(retryTemplate!=null){this.retryTemplate.registerListener(listener);}try{rocketMQListenerContainer.afterPropertiesSet();}catch(Exceptione){log.error("rocketMQListenerContaineriniterror:"+e.getMessage(),e);thrownewIllegalArgumentException("rocketMQListenerContaineriniterror:"+e.getMessage(),e);}instrumentationManager.addHealthInstrumentation(newInstrumentation(rocketMQListenerContainer.getTopic()+rocketMQListenerContainer.getConsumerGroup()));}protectedclassBindingRocketMQListenerimplementsRocketMQListener<Message>,RetryListener{@OverridepublicvoidonMessage(Messagemessage){booleanenableRetry=RocketMQInboundChannelAdapter.this.retryTemplate!=null;if(enableRetry){RocketMQInboundChannelAdapter.this.retryTemplate.execute(context->{RocketMQInboundChannelAdapter.this.sendMessage(message);returnnull;},(RecoveryCallback<Object>)RocketMQInboundChannelAdapter.this.recoveryCallback);}else{RocketMQInboundChannelAdapter.this.sendMessage(message);}}@Overridepublic<T,EextendsThrowable>booleanopen(RetryContextcontext,RetryCallback<T,E>callback){returntrue;}@Overridepublic<T,EextendsThrowable>voidclose(RetryContextcontext,RetryCallback<T,E>callback,Throwablethrowable){}@Overridepublic<T,EextendsThrowable>voidonError(RetryContextcontext,RetryCallback<T,E>callback,Throwablethrowable){}}

DefaultMessageListenerOrderly收到RocketMQ消息后,先回调BindingRocketMQListener的onMessage方法,再调用RocketMQInboundChannelAdapter父类的sendMessage方法将消息发送到DirectChannel

SpringCloudStream的接收消息和发送消息的消息模型是一致的,Binder中接收的消息先发送到MessageChannel,由订阅的MessageChannel通过Dispatcher转发到对应的MessageHandler进行处理。

RocketMQInboundChannelAdapter的父类MessageProducerSupport的getOutputChannel()得到的MessageChannel是在初始化RocketMQBinder时传入的DirectChannel

MessageProducerSupport的getOutputChannel方法:

@OverridepublicMessageChannelgetOutputChannel(){if(this.outputChannelName!=null){synchronized(this){if(this.outputChannelName!=null){this.outputChannel=getChannelResolver().resolveDestination(this.outputChannelName);this.outputChannelName=null;}}}returnthis.outputChannel;}

MessagingTemplate继承GenericMessagingTemplate类,实际执行doSend()方法发送消息

MessageChannel的实例是DirectChannel对象,复用前面消息发送流程,通过消息分发类MessageDispatcher把消息分发给MessageHandler

DirectChannel对应的消息处理器是StreamListenerMessageHandler

publicclassStreamListenerMessageHandlerextendsAbstractReplyProducingMessageHandler{privatefinalInvocableHandlerMethodinvocableHandlerMethod;privatefinalbooleancopyHeaders;StreamListenerMessageHandler(InvocableHandlerMethodinvocableHandlerMethod,booleancopyHeaders,String[]notPropagatedHeaders){super();this.invocableHandlerMethod=invocableHandlerMethod;this.copyHeaders=copyHeaders;this.setNotPropagatedHeaders(notPropagatedHeaders);}@OverrideprotectedbooleanshouldCopyRequestHeaders(){returnthis.copyHeaders;}publicbooleanisVoid(){returnthis.invocableHandlerMethod.isVoid();}@OverrideprotectedObjecthandleRequestMessage(Message<?>requestMessage){try{returnthis.invocableHandlerMethod.invoke(requestMessage);}catch(Exceptione){if(einstanceofMessagingException){throw(MessagingException)e;}else{thrownewMessagingException(requestMessage,"Exceptionthrownwhileinvoking"+this.invocableHandlerMethod.getShortLogMessage(),e);}}}}

InvocableHandlerMethod使用java反射机制完成回调,StreamListenerMessageHandler与@

StreamListenerAnnotationBeanPostProcessor的afterSingletonsInstantiated方法:

@OverridepublicfinalvoidafterSingletonsInstantiated(){this.injectAndPostProcessDependencies();EvaluationContextevaluationContext=IntegrationContextUtils.getEvaluationContext(this.applicationContext.getBeanFactory());for(Map.Entry<String,List<StreamListenerHandlerMethodMapping>>mappedBindingEntry:this.mappedListenerMethods.entrySet()){ArrayList<DispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper>handlers;handlers=newArrayList<>();for(StreamListenerHandlerMethodMappingmapping:mappedBindingEntry.getValue()){finalInvocableHandlerMethodinvocableHandlerMethod=this.messageHandlerMethodFactory.createInvocableHandlerMethod(mapping.getTargetBean(),checkProxy(mapping.getMethod(),mapping.getTargetBean()));StreamListenerMessageHandlerstreamListenerMessageHandler=newStreamListenerMessageHandler(invocableHandlerMethod,resolveExpressionAsBoolean(mapping.getCopyHeaders(),"copyHeaders"),this.springIntegrationProperties.getMessageHandlerNotPropagatedHeaders());streamListenerMessageHandler.setApplicationContext(this.applicationContext);streamListenerMessageHandler.setBeanFactory(this.applicationContext.getBeanFactory());if(StringUtils.hasText(mapping.getDefaultOutputChannel())){streamListenerMessageHandler.setOutputChannelName(mapping.getDefaultOutputChannel());}streamListenerMessageHandler.afterPropertiesSet();if(StringUtils.hasText(mapping.getCondition())){StringconditionAsString=resolveExpressionAsString(mapping.getCondition(),"condition");Expressioncondition=SPEL_EXPRESSION_PARSER.parseExpression(conditionAsString);handlers.add(newDispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper(condition,streamListenerMessageHandler));}else{handlers.add(newDispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapper(null,streamListenerMessageHandler));}}if(handlers.size()>1){for(DispatchingStreamListenerMessageHandler.ConditionalStreamListenerMessageHandlerWrapperhandler:handlers){Assert.isTrue(handler.isVoid(),StreamListenerErrorMessages.MULTIPLE_VALUE_RETURNING_METHODS);}}AbstractReplyProducingMessageHandlerhandler;if(handlers.size()>1||handlers.get(0).getCondition()!=null){handler=newDispatchingStreamListenerMessageHandler(handlers,evaluationContext);}else{handler=handlers.get(0).getStreamListenerMessageHandler();}handler.setApplicationContext(this.applicationContext);handler.setChannelResolver(this.binderAwareChannelResolver);handler.afterPropertiesSet();this.applicationContext.getBeanFactory().registerSingleton(handler.getClass().getSimpleName()+handler.hashCode(),handler);this.applicationContext.getBean(mappedBindingEntry.getKey(),SubscribableChannel.class).subscribe(handler);}this.mappedListenerMethods.clear();}

在Spring容器管理的所有单例对象初始化完成之后,遍历StreamListenerHandlerMethodMapping,进行InvocableHandlerMethod和StreamListenerMessageHandler的创建和初始化

StreamListenerHandlerMethodMapping保存了StreamListener和InvocableHandlerMethod的映射关系,映射关系的创建是在StreamListenerAnnotationBeanPostProcessor的postProcessAfterInitialization()方法

@OverridepublicfinalObjectpostProcessAfterInitialization(Objectbean,finalStringbeanName)throwsBeansException{Class<?>targetClass=AopUtils.isAopProxy(bean)?AopUtils.getTargetClass(bean):bean.getClass();Method[]uniqueDeclaredMethods=ReflectionUtils.getUniqueDeclaredMethods(targetClass);for(Methodmethod:uniqueDeclaredMethods){StreamListenerstreamListener=AnnotatedElementUtils.findMergedAnnotation(method,StreamListener.class);if(streamListener!=null&&!method.isBridge()){this.streamListenerCallbacks.add(()->{Assert.isTrue(method.g
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
怎么设置我想要的铃声为闹钟呢? 定时机器人功能列表 ...暗黑破坏神2重制版好玩吗_暗黑破坏神2重制版怎么玩 怎么用ATMA导入装备? 我下载的暗黑存档是rar文件,怎么办 知学云(北京)科技股份有限公司电话是多少? 仓央嘉措有哪些描写心情的诗? 沙面街道现状 龙之谷2手游学者课堂怎么玩 龙之谷2学者课堂答案是什么_学者课堂答案大全 使用RabbitMq清除本地多节点缓存 苹果现在允许第三方软件在设备上下载,自己开发的手机应用,怎样可以不通 ... 手机qq语音通话有回音怎么办啊? 德国城市风景随拍高清桌面壁纸2560x160018P 湖南衡阳是哪个省 湖南衡阳有哪些 日本寿司的简易做法 日本寿司的简易做法是什么样的 衡阳是什么省的城市 湖南衡阳有哪些景点值得一去? 衡阳市在哪个市 日本正宗寿司的做法 大家好,我的oppor11被小孩玩忘记密码了,现在如何能解锁呢?谢谢大家给... 为什么要做羊水穿刺 哪些孕妇需要做羊水穿刺 怎么做正宗的佛跳墙? 怎样做出正宗的佛跳墙? ...罗宾逊这样一个强力中锋,会被奥拉朱旺打得那么惨?_百度知... ...生涯共得到28596分,那奥拉朱旺、尤因、罗宾逊多少分呢? 抢票成功是不是就不用付钱了啊? 九十年代 NBA四大中锋之外的四大中锋 在NBA四大中锋里谁的生涯首秀数据最让人惊艳?为何 穿越火线手游别人加的我QQ为什么QQ上把这个人删掉之后游戏里QQ好友上... 怎么把电脑蓝色的背景弄回去? 29英寸彩电,显色缺少蓝色,怎么办? 麻烦问一下那个电脑蓝色怎么办 这个要怎么变回蓝色的?还有图标下面本来没有蓝色的要怎么办?? 电脑蓝色了怎么办 电脑出现蓝色空白怎么办?图标都不见了!主菜单那儿也找不到! 你好,请问我的驾驶证丢失有一个星期了,别人会拿我的驾驶证去做违章的... 我的驾驶证丢了.不知道有没有违章.要怎么查询 地效飞行器优点介绍 飞行器有什么作用 我的驾驶证丢了,我在补办时遇到了有一个异的违章,是现场罚款单(和罚款... 地效飞行器军事应用 今起未来三天重庆多云为主 明傍晚迎弱降水出行带伞 重庆今起三天阴或多云为主 后天最高气温可达16℃ 幼儿园里要布置植物角,不知道什么植物比较合适 22日-24日重庆未来三天雨水渐歇 明后天部分地区有大雾出没 一星期七天如何用英文表示? 星期1到7用英语怎么说 丁字账根据什么做