JAVA异步调用

就是A调用一个系统的工作流,系统工作流做完反馈B,这是一个异步的过程。现在想做成同步的,就是A启动工作流之后停止,一直等待B被回调了,设定超时时间,如果超时A返回错误;否则返回成功。

 B每次收到请求就往里面加数据
A如果非超时处理完请求就会把数据删掉
A这边设置一个集合
只有集合里有工单ID了才返回结果,并且把这个ID从集合中REMOVE调
B一来A就ADD一个 

public class AClient2C2 {

	private final long timeout = 10000;

	public void test(String taskId) {
		long count = 0;
		while (BService2C2.getInstance().isHasTask(taskId) && count < timeout) {

			try {
				System.out.println("wait+"+count);
				Thread.sleep(1000);
				count += 1000;
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(count>=timeout) {
			System.out.println("超时");
		}

	}

	public static void main(String[] args){

		BService2C2.getInstance().regesitTaskId("aaaa");
		AClient2C2 ac = new AClient2C2();
		ac.test("aaaa");
		BService2C2.getInstance().removeTaskId("aaaa");
	}
}
import java.util.HashMap;
import java.util.Map;

public class BService2C2 {

	private static BService2C2 instance;

	private static Map<String,String> map = new HashMap<String,String>();

    private BService2C2() {

    }

    public static BService2C2 getInstance(){
    	if(instance==null){
    		instance = new BService2C2();
    	}
    	return instance;
    }

    public void regesitTaskId(String taskId){
    	map.put(taskId, taskId);
    }

    public void removeTaskId(String taskId){
    	map.remove(taskId);
    }

    public boolean isHasTask(String taskId){
    	if(null!=map.get(taskId)){
    		return Boolean.TRUE;
    	}
    	return Boolean.FALSE;
    }

}
时间: 2024-09-20 08:12:33

JAVA异步调用的相关文章

java异步调用但是需要实现同步的效果

问题描述 现在比如说我有10笔交易,我在执行第二笔交易的时候需要根据第一笔交易的结果来判断是否需要做该笔交易.注:如果是同步调用,应该很简单,但是现在因为业务需要不能改成同步调用.求大神支招. 解决方案 任务队列啊.这不就是一个典型的状态机场景吗.每一步执行完成后,在根据执行结果选择下一步进行执行.需要注意的是防止重复执行和保证最终一致的机制.防止重复执行:每一笔交易给它一个唯一编码,执行成功后再次调用也不予第二次执行.保证最终一致:异步执行过程中,如果返回失败则继续重试,设定最大重试次数,超过

JAVA异步调用再度改进

NEW A(MANY)->SEND MESSAGE(UNIQUE) NEW B(MANY)->SET MESSAGE(UNIQUE) ONLY ONE C(IF A GET MESSAGE A SENT,C remove MESSAGE FROM HASHMAP) public class AClient2C2 { private final long timeout = 10000; public void test(String taskId) { long count = 0; whil

Java多线程实现异步调用的方法_java

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

JAVA实现异步调用实例代码_java

在JAVA平台,实现异步调用的角色有如下三个角色: 调用者 取货凭证   真实数据 一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据. 在调用一个方法的时候,程序会进入被调用方法体内,执行完这个被调用方法后,才返回执行下一条语句.怎么做到像ajax异步请求一样,发送请求后,没等请求响应就执行下一条语句呢?对于java的异步请求,找了许多教材都没有找到,如thinking in java.core java2 ......等等.受多线程

python使用multiprocessing模块实现带回调函数的异步调用方法_python

本文实例讲述了python使用multiprocessing模块实现带回调函数的异步调用方法.分享给大家供大家参考.具体分析如下: multipressing模块是python 2.6版本加入的,通过这个模块可以轻松实现异步调用 from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': pool = Pool(processes=1) # Start a worker processes. r

多线程异步调用 java-多线程异步调用的问题

问题描述 多线程异步调用的问题 请改造以下类,使之在多线程异步调用时,而不会出数据覆盖,即并发冲突 pulbi class Math { private static int result = 0; public static int sum(int a, int b){ result = a + b; return result; } } 请教大神 怎么做 解决方案 如果不考虑同步控制粒度问题,直接把synchronized(Math.class) 加在当前类定义上的,是可行的 当然控制同步的

VB.NET中使用代表对方法异步调用

异步 按照我们常规的思维方式,计算机应该是干完一件事,然后再干下一件.用术语来说,这种执行任务的方式叫做同步执行(Synchronous Execution).既然这样,那么为什么要引入异步执行的概念呢? 目录 为什么要使用异步调用实现异步调用的步骤和机理 为什么要使用异步调用(Asynchronous Method Execution) 按照我们常规的思维方式,计算机应该是干完一件事,然后再干下一件.用术语来说,这种执行任务的方式叫做同步执行(Synchronous Execution).既然

老树新花-Java异步服务开发

内容来源:2017年5月13日,饿了么资深Java工程师朱杰在"Java开发者大会 | Java之美[上海站]"进行<老树新花-Java异步服务开发>演讲分享.IT大咖说作为独家视频合作方,经主办方和讲者审阅授权发布. 阅读字数: 1901 用时: 13分钟 嘉宾演讲视频地址:http://t.cn/RKtxNEE 同步模型 以前在并发量很低的情况下,是通过线程去收取数据并发送数据给客户端.但是当并发量和客户端连接数比较高的时候,服务器会出现明显的瓶颈. 阻塞模型比较符合人

求问java 异步编程实现的原理是什么?我一直不明白它与回调的区别,求解,谢谢

问题描述 求问java 异步编程实现的原理是什么?我一直不明白它与回调的区别.假如我在执行某个任务的时候我再开启另外一个线程进行监听,这个与异步的实现有什么区别? 解决方案 应该这样理解同步是和异步进行比较的回调只是一种编程方法,让代码更加的优雅,回调是函数式编程的一种说法,相对于面向对像编程时,"回调"就变成"事件监听"这种说法了我们常说的同步回调,指的就是一个代码执行过程中,需要等到回调函数完全执行完后,才能往 下走.异步回调指的是一个代码执行到回调函数时,他可