java中如何设计异步调用接口,用监听实现异步结果的通知

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中如何设计异步调用接口,用监听实现异步结果的通知相关的知识,希望对你有一定的参考价值。

一个接口用来往第三方发送请求数据,另一个接口是第三方调用,推送返回结果
有没有相应代码

参考技术A 向对方注册本地的接收接口
像微信

~~~~~~~~追问

能说下具体实现吗

java队列实现异步执行

现在需求是这样的,
系统需要调用第三方接口推送信息,现在的代码是,调用接口,等待接口返回值,处理结果,然后再执行后面的代码,最后的部分跟处理结果没有太大的联系,可以分开进行,
所以新的设计是,创建一个队列,队列中放需要执行的动作,后台不停循环这个队列,如果有元素,调用对应方法,如果队列为空,后台进入休眠,直到队列添加新的元素。系统只要往队列中添加动作,然后直接执行最后面的代码,队列中的动作访问接口,完成后自己去处理返回结果。
对队列不是很熟,请大神指教。
目前我写的小程序测试结果
第一张图,在queue.offer(new ProcessData(ss));下面还有一句
run();

在整个思路上要调整一下

1、会有很多线程给一个队列上添加任务

2、有一个或者多个线程逐个执行队列的任务


考虑一下几点:

1、没有任务时,队列执行线程处于等待状态

2、添加任务时,激活队列执行线程,全部run起来,首先抢到任务的执行,其他全部wait


给个小例子吧

package org;
import java.util.LinkedList;
import java.util.List;
public class Queues 
public static List<Task> queue = new LinkedList<Task>();
/**
 * 假如 参数o 为任务
 * @param o
 */
public static void add (Task t)
synchronized (Queues.queue) 
Queues.queue.add(t); //添加任务
Queues.queue.notifyAll();//激活该队列对应的执行线程,全部Run起来


static class Task
public void test()
System.out.println("我被执行了");


package org;
import java.util.List;
public class Exec implements Runnable
@Override
public void run() 
while(true)
synchronized (Queues.queue) 
while(Queues.queue.isEmpty()) //
try 
Queues.queue.wait(); //队列为空时,使线程处于等待状态
 catch (InterruptedException e) 
e.printStackTrace();

System.out.println("wait...");

Queues.Task t= Queues.queue.remove(0); //得到第一个
t.test(); //执行该任务
System.out.println("end");



public static void main(String[] args) 
Exec e = new Exec();
for (int i = 0; i < 2; i++) 
new Thread(e).start(); //开始执行时,队列为空,处于等待状态

//上面开启两个线程执行队列中的任务,那就是先到先得了
//添加一个任务测试
Queues.Task t =new Queues.Task();
Queues.add(t); //执行该方法,激活所有对应队列,那两个线程就会开始执行啦



上面的就是很简单的例子了

参考技术A 你想问什么呢?判断队列是否有值?取队列中的值?
这两个问题你能完成的话还有啥需要解决呢?跟你以前的需求不一样么?追问

我也不知道,以前没用过队列,看了下文档,然后写了这货,给组长看看,组长说不行,想请大神指导下异步写队列的规范。
还有,我再添加队列元素的时候需要调用下run那个方法,会不会对当前执行的run有影响。

以上是关于java中如何设计异步调用接口,用监听实现异步结果的通知的主要内容,如果未能解决你的问题,请参考以下文章

在asp.net里怎样异步调用WebService方法

如何实现webservice的异步调用

架构设计|异步请求如何同步处理?

架构设计|异步请求如何同步处理?

java 异步查询转同步多种实现方式:循环等待,CountDownLatch,Spring Even

获取 异步执行调用的结果