当前位置: 首页 > news >正文

wordpress产品轮播青岛关键词优化平台

wordpress产品轮播,青岛关键词优化平台,gitgub做网站,企业做营销型网站springboot整合undertow服务器的源码从老生常谈的createWebServer方法谈起。spring会在生成所有bean后到创建web容器,此时会到容器找到ServletWebServerFactory接口bean,spring会根据引入的框架确定生成的ServletWebServerFactory,我们在mave…

springboot整合undertow服务器的源码从老生常谈的createWebServer方法谈起。spring会在生成所有bean后到创建web容器,此时会到容器找到ServletWebServerFactory接口bean,spring会根据引入的框架确定生成的ServletWebServerFactory,我们在maven中引入了undertow后,由UndertowServletWebServerFactory实现。

	private void createWebServer() {WebServer webServer = this.webServer;ServletContext servletContext = getServletContext();if (webServer == null && servletContext == null) {ServletWebServerFactory factory = getWebServerFactory();this.webServer = factory.getWebServer(getSelfInitializer());getBeanFactory().registerSingleton("webServerGracefulShutdown",new WebServerGracefulShutdownLifecycle(this.webServer));getBeanFactory().registerSingleton("webServerStartStop",new WebServerStartStopLifecycle(this, this.webServer));}else if (servletContext != null) {try {getSelfInitializer().onStartup(servletContext);}catch (ServletException ex) {throw new ApplicationContextException("Cannot initialize servlet context", ex);}}initPropertySources();}

UndertowServletWebServerFactory类的getWebServer会创建WebServer。

	public WebServer getWebServer(ServletContextInitializer... initializers) {Builder builder = this.delegate.createBuilder(this);DeploymentManager manager = createManager(initializers);return getUndertowWebServer(builder, manager, getPort());}

先用默认的配置构建Builder对象,再使用读取的配置。

Builder createBuilder(AbstractConfigurableWebServerFactory factory) {Ssl ssl = factory.getSsl();InetAddress address = factory.getAddress();int port = factory.getPort();Builder builder = Undertow.builder();if (this.bufferSize != null) {builder.setBufferSize(this.bufferSize);}if (this.ioThreads != null) {builder.setIoThreads(this.ioThreads);}if (this.workerThreads != null) {builder.setWorkerThreads(this.workerThreads);}if (this.directBuffers != null) {builder.setDirectBuffers(this.directBuffers);}if (ssl != null && ssl.isEnabled()) {new SslBuilderCustomizer(factory.getPort(), address, ssl, factory.getSslStoreProvider()).customize(builder);Http2 http2 = factory.getHttp2();if (http2 != null) {builder.setServerOption(UndertowOptions.ENABLE_HTTP2, http2.isEnabled());}}else {builder.addHttpListener(port, (address != null) ? address.getHostAddress() : "0.0.0.0");}builder.setServerOption(UndertowOptions.SHUTDOWN_TIMEOUT, 0);for (UndertowBuilderCustomizer customizer : this.builderCustomizers) {customizer.customize(builder);}return builder;}

之后再注册Servlet和Filter过滤器到容器中。

    public void deploy() {final DeploymentInfo deploymentInfo = originalDeployment.clone();if (deploymentInfo.getServletStackTraces() == ServletStackTraces.ALL) {UndertowServletLogger.REQUEST_LOGGER.servletStackTracesAll(deploymentInfo.getDeploymentName());}deploymentInfo.validate();final DeploymentImpl deployment = new DeploymentImpl(this, deploymentInfo, servletContainer);this.deployment = deployment;final ServletContextImpl servletContext = new ServletContextImpl(servletContainer, deployment);deployment.setServletContext(servletContext);handleExtensions(deploymentInfo, servletContext);final List<ThreadSetupHandler> setup = new ArrayList<>();setup.add(ServletRequestContextThreadSetupAction.INSTANCE);setup.add(new ContextClassLoaderSetupAction(deploymentInfo.getClassLoader()));setup.addAll(deploymentInfo.getThreadSetupActions());deployment.setThreadSetupActions(setup);deployment.getServletPaths().setWelcomePages(deploymentInfo.getWelcomePages());if (deploymentInfo.getDefaultEncoding() != null) {deployment.setDefaultCharset(Charset.forName(deploymentInfo.getDefaultEncoding()));}if(deploymentInfo.getDefaultRequestEncoding() != null) {deployment.setDefaultRequestCharset(Charset.forName(deploymentInfo.getDefaultRequestEncoding()));} else if (deploymentInfo.getDefaultEncoding() != null) {deployment.setDefaultRequestCharset(Charset.forName(deploymentInfo.getDefaultEncoding()));}if(deploymentInfo.getDefaultResponseEncoding() != null) {deployment.setDefaultResponseCharset(Charset.forName(deploymentInfo.getDefaultResponseEncoding()));} else if (deploymentInfo.getDefaultEncoding() != null) {deployment.setDefaultResponseCharset(Charset.forName(deploymentInfo.getDefaultEncoding()));}handleDeploymentSessionConfig(deploymentInfo, servletContext);deployment.setSessionManager(deploymentInfo.getSessionManagerFactory().createSessionManager(deployment));deployment.getSessionManager().setDefaultSessionTimeout(deploymentInfo.getDefaultSessionTimeout());try {deployment.createThreadSetupAction(new ThreadSetupHandler.Action<Void, Object>() {@Overridepublic Void call(HttpServerExchange exchange, Object ignore) throws Exception {final ApplicationListeners listeners = createListeners();listeners.start();deployment.setApplicationListeners(listeners);//now create the servlets and filters that we know about. We can still get more latercreateServletsAndFilters(deployment, deploymentInfo);//first initialize the temp dirinitializeTempDir(servletContext, deploymentInfo);//then run the SCI'sfor (final ServletContainerInitializerInfo sci : deploymentInfo.getServletContainerInitializers()) {final InstanceHandle<? extends ServletContainerInitializer> instance = sci.getInstanceFactory().createInstance();try {instance.getInstance().onStartup(sci.getHandlesTypes(), servletContext);} finally {instance.release();}}deployment.getSessionManager().registerSessionListener(new SessionListenerBridge(deployment, listeners, servletContext));for(SessionListener listener : deploymentInfo.getSessionListeners()) {deployment.getSessionManager().registerSessionListener(listener);}initializeErrorPages(deployment, deploymentInfo);initializeMimeMappings(deployment, deploymentInfo);listeners.contextInitialized();//runHttpHandler wrappedHandlers = ServletDispatchingHandler.INSTANCE;wrappedHandlers = wrapHandlers(wrappedHandlers, deploymentInfo.getInnerHandlerChainWrappers());wrappedHandlers = new RedirectDirHandler(wrappedHandlers, deployment.getServletPaths());if(!deploymentInfo.isSecurityDisabled()) {HttpHandler securityHandler = setupSecurityHandlers(wrappedHandlers);wrappedHandlers = new PredicateHandler(DispatcherTypePredicate.REQUEST, securityHandler, wrappedHandlers);}HttpHandler outerHandlers = wrapHandlers(wrappedHandlers, deploymentInfo.getOuterHandlerChainWrappers());wrappedHandlers = new PredicateHandler(DispatcherTypePredicate.REQUEST, outerHandlers, wrappedHandlers);wrappedHandlers = handleDevelopmentModePersistentSessions(wrappedHandlers, deploymentInfo, deployment.getSessionManager(), servletContext);MetricsCollector metrics = deploymentInfo.getMetricsCollector();if(metrics != null) {wrappedHandlers = new MetricsChainHandler(wrappedHandlers, metrics, deployment);}if( deploymentInfo.getCrawlerSessionManagerConfig() != null ) {wrappedHandlers = new CrawlerSessionManagerHandler(deploymentInfo.getCrawlerSessionManagerConfig(), wrappedHandlers);}final ServletInitialHandler servletInitialHandler = SecurityActions.createServletInitialHandler(deployment.getServletPaths(), wrappedHandlers, deployment, servletContext);HttpHandler initialHandler = wrapHandlers(servletInitialHandler, deployment.getDeploymentInfo().getInitialHandlerChainWrappers());initialHandler = new HttpContinueReadHandler(initialHandler);if(deploymentInfo.getUrlEncoding() != null) {initialHandler = Handlers.urlDecodingHandler(deploymentInfo.getUrlEncoding(), initialHandler);}deployment.setInitialHandler(initialHandler);deployment.setServletHandler(servletInitialHandler);deployment.getServletPaths().invalidate(); //make sure we have a fresh set of servlet pathsservletContext.initDone();return null;}}).call(null, null);} catch (Exception e) {throw new RuntimeException(e);}//any problems with the paths won't get detected until the data is initialize//so we force initialization heredeployment.getServletPaths().initData();for(ServletContextListener listener : deploymentInfo.getDeploymentCompleteListeners()) {listener.contextInitialized(new ServletContextEvent(servletContext));}state = State.DEPLOYED;}

WebServer接口的start()方法就会启动undertow服务器了,本质就是通过XNIO框架监听服务器端口号,接收请求并处理。处理请求时的io线程模型分数据处理线程和业务处理线程。

    public synchronized void start() {UndertowLogger.ROOT_LOGGER.infof("starting server: %s", Version.getFullVersionString());xnio = Xnio.getInstance(Undertow.class.getClassLoader());channels = new ArrayList<>();try {if (internalWorker) {worker = xnio.createWorker(OptionMap.builder().set(Options.WORKER_IO_THREADS, ioThreads).set(Options.CONNECTION_HIGH_WATER, 1000000).set(Options.CONNECTION_LOW_WATER, 1000000).set(Options.WORKER_TASK_CORE_THREADS, workerThreads).set(Options.WORKER_TASK_MAX_THREADS, workerThreads).set(Options.TCP_NODELAY, true).set(Options.CORK, true).addAll(workerOptions).getMap());}OptionMap socketOptions = OptionMap.builder().set(Options.WORKER_IO_THREADS, worker.getIoThreadCount()).set(Options.TCP_NODELAY, true).set(Options.REUSE_ADDRESSES, true).set(Options.BALANCING_TOKENS, 1).set(Options.BALANCING_CONNECTIONS, 2).set(Options.BACKLOG, 1000).addAll(this.socketOptions).getMap();OptionMap serverOptions = OptionMap.builder().set(UndertowOptions.NO_REQUEST_TIMEOUT, 60 * 1000).addAll(this.serverOptions).getMap();ByteBufferPool buffers = this.byteBufferPool;if (buffers == null) {buffers = new DefaultByteBufferPool(directBuffers, bufferSize, -1, 4);}listenerInfo = new ArrayList<>();for (ListenerConfig listener : listeners) {UndertowLogger.ROOT_LOGGER.debugf("Configuring listener with protocol %s for interface %s and port %s", listener.type, listener.host, listener.port);final HttpHandler rootHandler = listener.rootHandler != null ? listener.rootHandler : this.rootHandler;OptionMap socketOptionsWithOverrides = OptionMap.builder().addAll(socketOptions).addAll(listener.overrideSocketOptions).getMap();......if (listener.type == ListenerType.HTTP) {HttpOpenListener openListener = new HttpOpenListener(buffers, undertowOptions);HttpHandler handler = rootHandler;if (http2) {handler = new Http2UpgradeHandler(handler);}openListener.setRootHandler(handler);final ChannelListener<StreamConnection> finalListener;if (listener.useProxyProtocol) {finalListener = new ProxyProtocolOpenListener(openListener, null, buffers, OptionMap.EMPTY);} else {finalListener = openListener;}ChannelListener<AcceptingChannel<StreamConnection>> acceptListener = ChannelListeners.openListenerAdapter(finalListener);AcceptingChannel<? extends StreamConnection> server = worker.createStreamConnectionServer(new InetSocketAddress(Inet4Address.getByName(listener.host), listener.port), acceptListener, socketOptionsWithOverrides);server.resumeAccepts();channels.add(server);listenerInfo.add(new ListenerInfo("http", server.getLocalAddress(), openListener, null, server));} ......}
http://www.hrbkazy.com/news/22158.html

相关文章:

  • 联合年检在什么网站做沈阳优化推广哪家好
  • 网站开发 书今日头条号官网
  • 企业网站框架图腾讯效果推广
  • 如何用威客做网站推广 方案公司seo排名优化
  • 青岛网站建设和优化自己手机怎么免费做网站
  • 网站搜索功能怎么做西安百度公司官网
  • 大学生可以做的网站广东seo教程
  • 苏州做网站的多地优化完善疫情防控措施
  • 网站服务器有哪些sem推广是什么
  • 网页设计需要学什么书seo优化网
  • 网站开发用什么技术可行性新公司怎么做网络推广
  • 高端外贸网站制作广告策划方案怎么做
  • vps云主机可以做网站电子制作网站
  • python开发动态网站开发推广赚钱的平台有哪些
  • 建筑工程人才网西安百度关键词优化排名
  • 深圳的网站建设seo短视频发布页
  • 怎样建设网站首页360优化大师安卓下载
  • 网站制作目标及要求郑州网络seo
  • 加强学校网站建设的要求建站平台哪个比较权威
  • dede修改网站密码国外推广都是怎么推广
  • 成都维尼网络 网站建设怎么发外链
  • 男女做暧暧观看免费网站厦门人才网唯一官网登录
  • 做网站排名的公司有哪些网站seo主要是做什么的
  • 做设计素材在哪个网站pc网站建设和推广
  • 个人或企业做网络贸易的主要网站网络营销有什么特点
  • 唐山市住房和城乡建设局网站怎么制作网页页面
  • wordpress页面传递参数海南快速seo排名优化
  • 上海装修公司排名l短视频seo优化排名
  • 自己做的美食在哪个网站上卖seovip培训
  • 视频网站开发问题企业官网seo