springboot 长轮询实现

springboot 长轮询实现springboot长轮询实现基于@EnableAsync , @Sync@SpringBootApplication@EnableAsyncpublicclassDemoApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(DemoApplication.cla…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

springboot 长轮询实现

基于 @EnableAsync , @Sync

@SpringBootApplication
@EnableAsync
public class DemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}
@RequestMapping("/async")
@RestController
public class AsyncRequestDemo {

    @Autowired
    private AsyncRequestService asyncRequestService;

    @GetMapping("/value")
    public String getValue() {

        String msg =  null;
        Future<String> result = null;
        try{
            result = asyncRequestService.getValue();
            msg = result.get(10, TimeUnit.SECONDS);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (result != null){
                result.cancel(true);
            }
        }

        return msg;
    }

    @PostMapping("/value")
    public void postValue(String msg) {
        asyncRequestService.postValue(msg);
    }
}

@Service
public class AsyncRequestService {

    private String msg = null;

    @Async
    public Future<String> getValue() throws InterruptedException {

        while (true){
            synchronized (this){
                if (msg != null){
                    String resultMsg = msg;
                    msg = null;
                    return new AsyncResult(resultMsg);
                }
            }
            Thread.sleep(100);
        }
    }

    public synchronized void postValue(String msg) {
        this.msg = msg;
    }
}

备注

  1. @EnableAsync 开启异步
  2. @Sync 标记异步方法
  3. Future 用于接收异步返回值
  4. result.get(10, TimeUnit.SECONDS); 阻塞,超时获取结果
  5. Future.cancel() 中断线程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181940.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2.5.1大礼包

    2.5.1大礼包查找:全局搜索 prefs:root=或者 openURL:不要有“prefs:root=xxxx”这个可能出在自己项目中,特别是接手老项目,另一种可能是第三方sdk里出现的特别是调用相册相机调用wifi这类的第三方框架或SDK。如果第三方出现重新下载最新的包或者换第三方,联系第三方sdk开发者修改。修改一般只弹框提示不做跳转或者用苹果提供的方法。不要出现:@"pre…

    2022年7月16日
    13
  • 数据库mdf和ldf文件怎么打开_mdf数据库文件用什么打开

    数据库mdf和ldf文件怎么打开_mdf数据库文件用什么打开AdventureWorks2008数据文件下载(含mdf和ldf文件) 下载地址:http://pan.baidu.com/s/1kTA0EbH   (26MB左右。解压之后有196MB左右,直接附加即可使用。)

    2022年9月12日
    0
  • 代码加密 android,Android 开发怎样做代码加密或混淆「建议收藏」

    代码加密 android,Android 开发怎样做代码加密或混淆「建议收藏」原标题:Android开发怎样做代码加密或混淆对于Android开发技术人员来说,隐藏代码或是混淆代码至关重要。试想自己辛辛苦苦赶工出来的产品,被其他开发者反编译后轻松拿走。放在哪里都是一件让人崩溃的事情。华清创客学院Android开发讲师在这里和读者一起交流一下怎样做代码加密或混淆这个问题?Android开发怎样做代码加密或混淆:通常来说Proguard对一般用途来说足够了,但是也需要注意…

    2022年5月17日
    29
  • SQL server 查询语句「建议收藏」

    SQL server 查询语句「建议收藏」select*fromtest.dbo.users–普通条件查询whereid=1;模糊查询 select*fromtest.dbo.users whereusernamelike’%li%’;范围查询 select*fromtest.dbo.users –id在1~3之间的数据 whereidbetween1and3; select*fromtest.dbo.users –id在1~3以外的数据 where.

    2022年6月4日
    15
  • libiconv.a_libiptc

    libiconv.a_libiptc来源:’http://dxwang.blog.51cto.com/384651/538113介绍由于历史原因,国际上的各国文字都是依赖于自己本国语言而编码的。后来,随着Internet的出现和各国之间逐渐频繁的文字交流(比如浏览国外的Web页面),编码之间的转换就显得非常重要。这时也出现了一个问题,很多字符在一种编码中出现而没有被另一种编码包含。为了解决这种编码带来的混乱,人们

    2025年6月10日
    0
  • Java程序设计(高级及专题)- IO流与序列化

    Java程序设计(高级及专题)- IO流与序列化

    2021年7月20日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号