java接口怎么异步响应前端

Python015

java接口怎么异步响应前端,第1张

1、异步概念

异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程。

必须强调一个基础逻辑,异步是一种设计理念,异步操作不等于多线程,MQ中间件,或者消息广播,这些是可以实现异步处理的方式。

同步处理和异步处理相对,需要实时处理并响应,一旦超过时间会结束会话,在该过程中调用方一直在等待响应方处理完成并返回。同步类似电话沟通,需要实时对话,异步则类似短信交流,发送消息之后无需保持等待状态。

2、异步处理优点

虽然异步处理不能实时响应,但是处理复杂业务场景,多数情况都会使用异步处理。

异步可以解耦业务间的流程关联,降低耦合度;

降低接口响应时间,例如用户注册,异步生成相关信息表;

异步可以提高系统性能,提升吞吐量;

流量削峰即把请求先承接下来,然后在异步处理;

异步用在不同服务间,可以隔离服务,避免雪崩;

异步处理的实现方式有很多种,常见多线程,消息中间件,发布订阅的广播模式,其根据逻辑在于先把请求承接下来,放入容器中,在从容器中把请求取出,统一调度处理。

注意:一定要监控任务是否产生积压过度情况,任务如果积压到雪崩之势的地步,你会感觉每一片雪花都想勇闯天涯。

3、异步处理模式

异步流程处理的实现有好多方式,但是实际开发中常用的就那么几种,例如:

基于接口异步响应,常用在第三方对接流程;

基于消息生产和消费模式,解耦复杂流程;

基于发布和订阅的广播模式,常见系统通知

异步适用的业务场景,对数据强一致性的要求不高,异步处理的

在JAVA平台 实现异步调用的角色有如下三个角色:调用者 提货单 真实数据一个调用者在调用耗时操作 不能立即返回数据时 先返回一个提货单 然后在过一断时间后凭提货单来获取真正的数据 去蛋糕店买蛋糕 不需要等蛋糕做出来(假设现做要很长时间) 只需要领个提货单就可以了(去干别的事情) 等到蛋糕做好了 再拿提货单取蛋糕就可以了 public class Main { public static void main(String[] args) {

System out println( main BEGIN )

Host host = new Host()

Data data = host request( A )

Data data = host request( B )

Data data = host request( C )

System out println( main otherJob BEGIN )

try {

Thread sleep( )

} catch (InterruptedException e) {

}

System out println( main otherJob END )

System out println( data = + data getContent())

System out println( data = + data getContent())

System out println( data = + data getContent())

System out println( main END )

}

}

这里的main类就相当于 顾客 host就相当于 蛋糕店 顾客向 蛋糕店 定蛋糕就相当于 发请求request 返回的数据data是FutureData的实例 就相当于提货单 而不是真正的 蛋糕 在过一段时间后(sleep一段时间后) 调用data getContent() 也就是拿提货单获取执行结果

下面来看一下 顾客定蛋糕后 蛋糕店做了什么

public class Host {

public Data request(final int count final char c) {

System out println( request( + count + + c + ) BEGIN )

// ( ) 建立FutureData的实体

final FutureData future = new FutureData()

// ( ) 为了建立RealData的实体 启动新的线程

new Thread() {

public void run() {

//在匿名内部类中使用count future c

RealData realdata = new RealData(count c)

future setRealData(realdata)

}

} start()

System out println( request( + count + + c + ) END )

// ( ) 取回FutureData实体 作为传回值

return future

}

}

host( 蛋糕店 )在接到请求后 先生成了 提货单 FutureData的实例future 然后命令 蛋糕师傅 RealData去做蛋糕 realdata相当于起个线程去做蛋糕了 然后host返回给顾客的仅仅是 提货单 future 而不是蛋糕 当蛋糕做好后 蛋糕师傅才能给对应的 提货单 蛋糕 也就是future setRealData(realdata)

下面来看看蛋糕师傅是怎么做蛋糕的

建立一个字符串 包含count个c字符 为了表现出犯法需要花费一些时间 使用了sleep

public class RealData implements Data { private final String content

public RealData(int count char c) {

System out println( making RealData( + count + + c + ) BEGIN )

char[] buffer = new char[count]

for (int i = i <counti++) {

buffer[i] = c

try {

Thread sleep( )

} catch (InterruptedException e) {

}

}

System out println( making RealData( + count + + c + ) END )

ntent = new String(buffer)

}

public String getContent() {

return content

}

}

现在来看看 提货单 future是怎么与蛋糕 content 对应的:

public class FutureData implements Data { private RealData realdata = null

private boolean ready = false

public synchronized void setRealData(RealData realdata) {

if (ready) {

return// 防止setRealData被调用两次以上

}

this realdata = realdata

this ready = true

notifyAll()

}

public synchronized String getContent() {

while (!ready) {

try {

wait()

} catch (InterruptedException e) {

}

}

return realdata getContent()

}

}

顾客做完自己的事情后 会拿着自己的 提货单 来取蛋糕

System out println( data = + data getContent())

这时候如果蛋糕没做好 就只好等了

while (!ready) { try {

wait()

} catch (InterruptedException e) {

}

//等做好后才能取到

return realdata getContent()

程序分析

对于每个请求 host都会生成一个线程 这个线程负责生成顾客需要的 蛋糕 在等待一段时间以后 如果蛋糕还没有做好 顾客还必须等待 直到 蛋糕被做好 也就是

future setRealData(realdata)执行以后 顾客才能拿走蛋糕

每个线程只是专门负责制作特定顾客所需要的 蛋糕 也就是顾客A对应着蛋糕师傅A 顾客B对应着蛋糕师傅B 即使顾客B的蛋糕被先做好了 顾客A也只能等待蛋糕师傅A把蛋糕做好 换句话说 顾客之间没有竞争关系

lishixinzhi/Article/program/Java/gj/201311/27425