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

如何在百度上为企业做网站外链发布平台有哪些

如何在百度上为企业做网站,外链发布平台有哪些,商城网站建设行业现状,网站网页是怎么做的在Servlet模型中,每个请求都是由某个线程处理,然后,将响应写入IO流,发送给客户端。从开始处理请求,到写入响应完成,都是在同一个线程中处理的。 实现Servlet容器的时候,只要每处理一个请求&…

在Servlet模型中,每个请求都是由某个线程处理,然后,将响应写入IO流,发送给客户端。从开始处理请求,到写入响应完成,都是在同一个线程中处理的。

实现Servlet容器的时候,只要每处理一个请求,就创建一个新线程处理它,就能保证正确实现了Servlet线程模型。在实际产品中,例如Tomcat,总是通过线程池来处理请求,它仍然符合一个请求从头到尾都由某一个线程处理。

这种线程模型非常重要,因为Spring的JDBC事务是基于ThreadLocal实现的,如果在处理过程中,一会由线程A处理,一会又由线程B处理,那事务就全乱套了。此外,很多安全认证,也是基于ThreadLocal实现的,可以保证在处理请求的过程中,各个线程互不影响。

但是,如果一个请求处理的时间较长,例如几秒钟甚至更长,那么,这种基于线程池的同步模型很快就会把所有线程耗尽,导致服务器无法响应新的请求。如果把长时间处理的请求改为异步处理,那么线程池的利用率就会大大提高。Servlet从3.0规范开始添加了异步支持,允许对一个请求进行异步处理。

我们先来看看在Spring MVC中如何实现对请求进行异步处理的逻辑。首先建立一个Web工程,然后编辑web.xml文件如下:

<web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextClass</param-name><param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value></init-param><init-param><param-name>contextConfigLocation</param-name><param-value>com.itranswarp.learnjava.AppConfig</param-value></init-param><load-on-startup>0</load-on-startup><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>
</web-app>

和前面普通的MVC程序相比,这个web.xml主要对DispatcherServlet的配置多了一个<async-supported>,默认值是false,必须明确写成true,这样Servlet容器才会支持async处理。

下一步就是在Controller中编写async处理逻辑。我们以ApiController为例,演示如何异步处理请求。

第一种async处理方式是返回一个Callable,Spring MVC自动把返回的Callable放入线程池执行,等待结果返回后再写入响应:

@GetMapping("/users")
public Callable<List<User>> users() {return () -> {// 模拟3秒耗时:try {Thread.sleep(3000);} catch (InterruptedException e) {}return userService.getUsers();};
}

第二种async处理方式是返回一个DeferredResult对象,然后在另一个线程中,设置此对象的值并写入响应:

@GetMapping("/users/{id}")
public DeferredResult<User> user(@PathVariable("id") long id) {DeferredResult<User> result = new DeferredResult<>(3000L); // 3秒超时new Thread(() -> {// 等待1秒:try {Thread.sleep(1000);} catch (InterruptedException e) {}try {User user = userService.getUserById(id);// 设置正常结果并由Spring MVC写入Response:result.setResult(user);} catch (Exception e) {// 设置错误结果并由Spring MVC写入Response:result.setErrorResult(Map.of("error", e.getClass().getSimpleName(), "message", e.getMessage()));}}).start();return result;
}

使用DeferredResult时,可以设置超时,超时会自动返回超时错误响应。在另一个线程中,可以调用setResult()写入结果,也可以调用setErrorResult()写入一个错误结果。

运行程序,当我们访问http://localhost:8080/api/users/1时,假定用户存在,则浏览器在1秒后返回结果:

deferred-result-ok

访问一个不存在的User ID,则等待1秒后返回错误结果:

deferred-result-error

使用Filter

当我们使用async模式处理请求时,原有的Filter也可以工作,但我们必须在web.xml中添加<async-supported>并设置为true。我们用两个Filter:SyncFilter和AsyncFilter分别测试:

<web-app ...>...<filter><filter-name>sync-filter</filter-name><filter-class>com.itranswarp.learnjava.web.SyncFilter</filter-class></filter><filter><filter-name>async-filter</filter-name><filter-class>com.itranswarp.learnjava.web.AsyncFilter</filter-class><async-supported>true</async-supported></filter><filter-mapping><filter-name>sync-filter</filter-name><url-pattern>/api/version</url-pattern></filter-mapping><filter-mapping><filter-name>async-filter</filter-name><url-pattern>/api/*</url-pattern></filter-mapping>...
</web-app>

一个声明为支持<async-supported>的Filter既可以过滤async处理请求,也可以过滤正常的同步处理请求,而未声明<async-supported>的Filter无法支持async请求,如果一个普通的Filter遇到async请求时,会直接报错,因此,务必注意普通Filter的<url-pattern>不要匹配async请求路径。

logback.xml配置文件中,我们把输出格式加上[%thread],可以输出当前线程的名称:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><layout class="ch.qos.logback.classic.PatternLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</Pattern></layout></appender>...
</configuration>

对于同步请求,例如/api/version,我们可以看到如下输出:

2020-05-16 11:22:40 [http-nio-8080-exec-1] INFO  c.i.learnjava.web.SyncFilter - start SyncFilter...
2020-05-16 11:22:40 [http-nio-8080-exec-1] INFO  c.i.learnjava.web.AsyncFilter - start AsyncFilter...
2020-05-16 11:22:40 [http-nio-8080-exec-1] INFO  c.i.learnjava.web.ApiController - get version...
2020-05-16 11:22:40 [http-nio-8080-exec-1] INFO  c.i.learnjava.web.AsyncFilter - end AsyncFilter.
2020-05-16 11:22:40 [http-nio-8080-exec-1] INFO  c.i.learnjava.web.SyncFilter - end SyncFilter.

可见,每个Filter和ApiController都是由同一个线程执行。

对于异步请求,例如/api/users,我们可以看到如下输出:

2020-05-16 11:23:49 [http-nio-8080-exec-4] INFO  c.i.learnjava.web.AsyncFilter - start AsyncFilter...
2020-05-16 11:23:49 [http-nio-8080-exec-4] INFO  c.i.learnjava.web.ApiController - get users...
2020-05-16 11:23:49 [http-nio-8080-exec-4] INFO  c.i.learnjava.web.AsyncFilter - end AsyncFilter.
2020-05-16 11:23:52 [MvcAsync1] INFO  c.i.learnjava.web.ApiController - return users...

可见,AsyncFilterApiController是由同一个线程执行的,但是,返回响应的是另一个线程。

DeferredResult测试,可以看到如下输出:

2020-05-16 11:25:24 [http-nio-8080-exec-8] INFO  c.i.learnjava.web.AsyncFilter - start AsyncFilter...
2020-05-16 11:25:24 [http-nio-8080-exec-8] INFO  c.i.learnjava.web.AsyncFilter - end AsyncFilter.
2020-05-16 11:25:25 [Thread-2] INFO  c.i.learnjava.web.ApiController - deferred result is set.

同样,返回响应的是另一个线程。

在实际使用时,经常用到的就是DeferredResult,因为返回DeferredResult时,可以设置超时、正常结果和错误结果,易于编写比较灵活的逻辑。

使用async异步处理响应时,要时刻牢记,在另一个异步线程中的事务和Controller方法中执行的事务不是同一个事务,在Controller中绑定的ThreadLocal信息也无法在异步线程中获取。

此外,Servlet 3.0规范添加的异步支持是针对同步模型打了一个“补丁”,虽然可以异步处理请求,但高并发异步请求时,它的处理效率并不高,因为这种异步模型并没有用到真正的“原生”异步。Java标准库提供了封装操作系统的异步IO包java.nio,是真正的多路复用IO模型,可以用少量线程支持大量并发。使用NIO编程复杂度比同步IO高很多,因此我们很少直接使用NIO。相反,大部分需要高性能异步IO的应用程序会选择Netty这样的框架,它基于NIO提供了更易于使用的API,方便开发异步应用程序。

http://www.dtcms.com/wzjs/206701.html

相关文章:

  • 网站页面做多宽网站seo需要用到哪些工具
  • 网站怎么添加导航栏宁波seo排名外包公司
  • 靖江网站赣州seo外包怎么收费
  • 西安做网站公司怎么样哈尔滨最新今日头条新闻
  • xampp搭建wordpressseo专员是什么职业
  • 在线app开发平台长沙关键词优化公司电话
  • 制作图网官网北京搜索引擎优化管理专员
  • 可以做微课ppt模板 网站有哪些内容国外搜索引擎大全
  • 湘潭外包网络推广公司seo准
  • 音乐摄影网站建设宗旨自助建站系统平台
  • wap网站设计电商网站如何避免客户信息泄露
  • 中建八局第一建设有限公司电话成都自然排名优化
  • 透明度 宁波政府网站建设百度搜索工具
  • 手机网站开发相关问题凡科小程序
  • 门户网站建设招标方公司网站设计
  • 哈尔滨快速建站案例软文营销的三个层面
  • 比价网站怎么做怎么创建网页链接
  • 制作企业网站页面html私域流量和裂变营销
  • 北京高端网站建设咸阳4p营销理论
  • 电子商务网站建设的核心硬件最经典的营销案例
  • 网站开发语言net亿驱动力竞价托管
  • phpcms 网站标题线上营销活动方案
  • 购物网站支付页面制作互联网公司排名
  • 想学网络营销网站建设免费seo教程资源
  • 做网站一般用什么几号字全自动推广引流软件免费
  • mvc5 网站开发美學 pdfseo免费培训教程
  • 自己做b2b平台网站建设推广app用什么平台比较好
  • 大型网站开发用什么语言百度快速收录技术
  • 建设企业网站的目的营销网页
  • 南宁做网站优化整合营销网络推广