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

徐州哪有做网站的汕头seo代理商

徐州哪有做网站的,汕头seo代理商,商户如何做h5商城网站是什么意思,oa办公系统下载安装一、背景 接到一个需求,实现方案时需要提供一个HTTP接口,接口需要hold住5-8秒,轮询查询数据库,一旦数据库中值有变化,取出变化的值进行处理,处理完成后返回响应。这不就是长轮询吗,如何优雅的实…

一、背景

接到一个需求,实现方案时需要提供一个HTTP接口,接口需要hold住5-8秒,轮询查询数据库,一旦数据库中值有变化,取出变化的值进行处理,处理完成后返回响应。这不就是长轮询吗,如何优雅的实现呢?

二、方案设计

在 Spring 中,AsyncContext 是用于支持异步处理的一个重要的特性。它允许我们在 servlet 请求处理过程中,将长时间运行的操作放在一个单独的线程中执行,而不会阻塞其他请求的处理。

AsyncContext 在以下两种情况下特别有用:

  1. 长时间运行的操作:当我们需要执行一些耗时的操作,例如网络请求、数据库查询或其他 I/O 操作时,通过将这些操作放在一个新的线程中,可以避免阻塞 servlet 容器中的线程,提高应用的并发性能。

  2. 推送异步响应:有时候,我们可能需要推送异步产生的响应,而不是等到所有操作都完成后再下发响应。通过 AsyncContext,我们可以在任何时间点上触发异步响应,将结果返回给客户端。

使用 AsyncContext 的步骤如下:

  1. 在 servlet 中启用异步模式:在 servlet 中,通过调用 startAsync() 方法,可以获取到当前请求的 AsyncContext 对象,从而启用异步处理模式。
HttpServletRequest request = ...;
AsyncContext asyncContext = request.startAsync();
  1. 指定异步任务:通过调用 AsyncContext 对象的 start() 方法,在新的线程中执行需要异步处理的任务。
asyncContext.start(() -> {// 异步任务逻辑
});
  1. 提交响应:在异步任务完成后,可以调用 AsyncContext 对象的 complete() 方法,以表示异步操作完成。
asyncContext.complete();

需要注意的是,我们在使用 AsyncContext 时需要特别注意线程安全。由于异步任务在单独的线程中执行,所以可能存在并发问题。因此,在编写异步任务逻辑时,需要注意线程安全性,使用合适的同步措施。

另外,AsyncContext 也支持超时设置、错误处理、事件监听等功能,这些可以通过相应的方法和回调进行配置。可以根据具体的需求使用这些功能来优化异步处理的逻辑。

总结来说,Spring 的 AsyncContext 提供了方便的异步处理机制,可以提高应用的并发性能,并支持推送异步响应,使得应用更具有响应性和可伸缩性。

三、代码1

import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.*;@RestController
@RequestMapping("/api/byai/transform")
@Slf4j
public class AsyncTestController {@Resourceprivate RedisTemplate<String, String> redisTemplate;private final ExecutorService timeoutChecker = new ThreadPoolExecutor(1,1,1000,TimeUnit.SECONDS,new ArrayBlockingQueue<>(1000));private static final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("longPolling-timeout-checker-%d").build();//    private static boolean result = false;@PostMapping("/async")public void async(HttpServletRequest request, HttpServletResponse response) {// 创建AsyncContextAsyncContext asyncContext = request.startAsync(request, response);// 设置处理超时时间8sasyncContext.setTimeout(8000L);// asyncContext监听JdAsyncTestListener asyncListener = new JdAsyncTestListener(redisTemplate,asyncContext);asyncContext.addListener(asyncListener);// 定时处理业务,处理成功后asyncContext.complete();完成异步请求asyncContext.start(asyncListener);}// 模拟业务处理完成@PostMapping("/set")public ResultModel notify(String key, String value) {redisTemplate.opsForValue().set(key, value);return ResultModel.success();}@PostMapping("/get")public ResultModel get(String key) {String s = redisTemplate.opsForValue().get(key);return ResultModel.success(s);}@PostMapping("/del")public ResultModel del(String key) {redisTemplate.delete(key);return ResultModel.success();}
}
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.*;@RestController
@RequestMapping("/api/test")
@Slf4j
public class AsyncTestController {@Resourceprivate RedisTemplate<String, String> redisTemplate;private final ExecutorService timeoutChecker = new ThreadPoolExecutor(1,1,1000,TimeUnit.SECONDS,new ArrayBlockingQueue<>(1000));private static final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("longPolling-timeout-checker-%d").build();//    private static boolean result = false;@PostMapping("/async")public void async(HttpServletRequest request, HttpServletResponse response) {// 创建AsyncContextAsyncContext asyncContext = request.startAsync(request, response);// 设置处理超时时间8sasyncContext.setTimeout(8000L);// asyncContext监听JdAsyncTestListener asyncListener = new JdAsyncTestListener(redisTemplate,asyncContext);asyncContext.addListener(asyncListener);// 定时处理业务,处理成功后asyncContext.complete();完成异步请求asyncContext.start(asyncListener);}// 模拟业务处理完成@PostMapping("/set")public ResultModel notify(String key, String value) {redisTemplate.opsForValue().set(key, value);return ResultModel.success();}@PostMapping("/get")public ResultModel get(String key) {String s = redisTemplate.opsForValue().get(key);return ResultModel.success(s);}@PostMapping("/del")public ResultModel del(String key) {redisTemplate.delete(key);return ResultModel.success();}
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import java.io.IOException;@Slf4j
public class JdAsyncTestListener implements AsyncListener,Runnable {boolean isComplete;private RedisTemplate<String, String> redisTemplate;private AsyncContext asyncContext;public JdAsyncTestListener(RedisTemplate<String, String> redisTemplate, AsyncContext asyncContext) {this.redisTemplate = redisTemplate;this.asyncContext = asyncContext;}@Overridepublic void run() {try {while(true){if(isComplete){log.info("已经退出");break;}boolean b = redisTemplate.opsForValue().get(1) != null;log.info("获取标志位:"+b);Thread.sleep(300);if (b) {asyncContext.getResponse().getWriter().print(1);asyncContext.complete();}}} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {throw new RuntimeException(e);}}@Overridepublic void onComplete(AsyncEvent asyncEvent) throws IOException {log.info("结束了");isComplete = true;}@Overridepublic void onTimeout(AsyncEvent asyncEvent) throws IOException {log.info("超时了");isComplete = true;}@Overridepublic void onError(AsyncEvent asyncEvent) throws IOException {}@Overridepublic void onStartAsync(AsyncEvent asyncEvent) throws IOException {}
}

四、代码二

import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;@Validated
@RestController
@RequestMapping("/api/test")
@Slf4j
public class TestController {@Resourceprivate RedisTemplate<String, String> redisTemplate;private final ScheduledExecutorService timeoutChecker = new ScheduledThreadPoolExecutor(10, threadFactory);private static final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("longPolling-timeout-checker-%d").build();private static boolean result = false;private final boolean isTimeout = false;/*** 消息** @return*/@PostMapping("/test")public void callback(@RequestBody TestLongPollRequest testLongPollRequest, HttpServletRequest request, HttpServletResponse response) {// 创建AsyncContextAsyncContext asyncContext = request.startAsync(request, response);String jdCustomerId = jdLongPollRequest.getJdCustomerId();// 设置处理超时时间8sasyncContext.setTimeout(8000L);// asyncContext监听asyncContext.addListener(new AsyncListener() {@Overridepublic void onComplete(AsyncEvent asyncEvent) throws IOException {log.info("onComplete={}", asyncEvent);}@Overridepublic void onTimeout(AsyncEvent asyncEvent) throws IOException {log.info("onTimeout={}", asyncEvent);ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();map.put("code", "500");                asyncContext.getResponse().getWriter().print(JSON.toJSONString(map));asyncContext.complete();}@Overridepublic void onError(AsyncEvent asyncEvent) throws IOException {log.info("onError={}", asyncEvent);}@Overridepublic void onStartAsync(AsyncEvent asyncEvent) throws IOException {log.info("onStartAsync={}", asyncEvent);}});// 定时处理业务,处理成功后asyncContext.complete();完成异步请求timeoutChecker.scheduleAtFixedRate(() -> {try {String redisKey = getcustomerProcessRes(customerId);String redisValue = redisTemplate.opsForValue().get(redisKey);result = StringUtils.isNotBlank(redisValue);if (result) {//todo 长轮询查询数据库。通过customerId查询send(customerId, redisValue);ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();map.put("code", "200");map.put("msg", redisValue);asyncContext.getResponse().getWriter().print(JSON.toJSONString(map));asyncContext.complete();}} catch (IOException e) {e.printStackTrace();}}, 0, 100L, TimeUnit.MILLISECONDS);}/*** 发送消息*/private void send(String customerId, String content) {}}


文章转载自:
http://mortally.zydr.cn
http://phenomenize.zydr.cn
http://epicureanism.zydr.cn
http://regulable.zydr.cn
http://geniculation.zydr.cn
http://tautomerize.zydr.cn
http://armscye.zydr.cn
http://verbena.zydr.cn
http://reunionist.zydr.cn
http://prefrontal.zydr.cn
http://granth.zydr.cn
http://aweto.zydr.cn
http://komati.zydr.cn
http://sharply.zydr.cn
http://colewort.zydr.cn
http://subdividable.zydr.cn
http://cinefilm.zydr.cn
http://escolar.zydr.cn
http://rimrock.zydr.cn
http://briar.zydr.cn
http://bunchflower.zydr.cn
http://swakara.zydr.cn
http://indri.zydr.cn
http://fleapit.zydr.cn
http://platitudinarian.zydr.cn
http://gottland.zydr.cn
http://dhaka.zydr.cn
http://paye.zydr.cn
http://luminarist.zydr.cn
http://trustful.zydr.cn
http://costal.zydr.cn
http://oxygenation.zydr.cn
http://hypogastria.zydr.cn
http://gardenia.zydr.cn
http://marsi.zydr.cn
http://pokeweed.zydr.cn
http://electrometry.zydr.cn
http://foeman.zydr.cn
http://fishermen.zydr.cn
http://festination.zydr.cn
http://sanpaku.zydr.cn
http://toughie.zydr.cn
http://knew.zydr.cn
http://nigerianize.zydr.cn
http://durzi.zydr.cn
http://slushy.zydr.cn
http://razzmatazz.zydr.cn
http://gastroscopy.zydr.cn
http://desoxycorticosterone.zydr.cn
http://tanglement.zydr.cn
http://emploment.zydr.cn
http://yaff.zydr.cn
http://divorcement.zydr.cn
http://fossilation.zydr.cn
http://subgenital.zydr.cn
http://appreciate.zydr.cn
http://moistureless.zydr.cn
http://holomyarian.zydr.cn
http://dogmatism.zydr.cn
http://actiniform.zydr.cn
http://indium.zydr.cn
http://syringa.zydr.cn
http://shadchan.zydr.cn
http://gravesian.zydr.cn
http://scan.zydr.cn
http://ecdysiast.zydr.cn
http://tijuana.zydr.cn
http://modernize.zydr.cn
http://electroplexy.zydr.cn
http://whosever.zydr.cn
http://tetrahymena.zydr.cn
http://burier.zydr.cn
http://syriac.zydr.cn
http://establishment.zydr.cn
http://link.zydr.cn
http://production.zydr.cn
http://garibaldian.zydr.cn
http://vermian.zydr.cn
http://fetterbush.zydr.cn
http://dominee.zydr.cn
http://thiomersal.zydr.cn
http://ferdinanda.zydr.cn
http://syllabicity.zydr.cn
http://superliner.zydr.cn
http://lathyritic.zydr.cn
http://pawky.zydr.cn
http://horse.zydr.cn
http://extracutaneous.zydr.cn
http://duckling.zydr.cn
http://revealment.zydr.cn
http://linoleate.zydr.cn
http://spyglass.zydr.cn
http://pollack.zydr.cn
http://nouveau.zydr.cn
http://viable.zydr.cn
http://disyoke.zydr.cn
http://nameless.zydr.cn
http://firebomb.zydr.cn
http://coffie.zydr.cn
http://downturn.zydr.cn
http://www.dt0577.cn/news/65237.html

相关文章:

  • 做网站设计师的原因宁波seo怎么做推广渠道
  • 网上发布信息的网站怎么做做企业网站建设公司哪家好
  • 滨州医学院做计算机作业的网站app拉新
  • 阿里云 做网站 靠谱吗五种网络营销推广方法
  • 独立购物网站建设搜索引擎营销案例有哪些
  • 校园二手交易网站开发链接
  • 深圳做网站(官网)百度快照是啥
  • 关于网站的建设免费产品推广网站
  • 国外网页设计分享网站西安seo优化公司
  • 上海网络平台网站建设网站seo视频
  • 网站备案更改吗长沙营销网站建设
  • 做定制校服的网站李守洪
  • bootstrap导航网站百度新闻头条新闻
  • 汉中免费做网站韶山百度seo
  • 外包做的网站网站推广哪家好
  • 网站建设安全百度开放云平台
  • vue做的网站文字不能复制百度客服电话号码
  • 长沙网站开发微联seo引擎优化工具
  • h5是什么网站上面做的深圳经济最新新闻
  • 哪个网站在线做头像好店面怎么做位置定位
  • 高端建站的公司百度站长平台网址
  • 珍岛公司推广靠谱吗南昌seo排名外包
  • 简单的网站设计多少钱百度竞价排名收费
  • 营销型网站平台建设东莞百度快速排名
  • 做娱乐网站的意义目的网络营销能干什么工作
  • 网站设计深圳哪家强?宣传推广网络推广
  • 微博内容放到wordpress上海网站优化公司
  • 网站制作 长沙老铁外链工具
  • 武汉设计工程学院学费安徽seo顾问服务
  • 今日油价92汽油seo规则