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

问题描述

现在比如说我有10笔交易,我在执行第二笔交易的时候需要根据第一笔交易的结果来判断是否需要做该笔交易。注:如果是同步调用,应该很简单,但是现在因为业务需要不能改成同步调用。求大神支招。

解决方案

任务队列啊。这不就是一个典型的状态机场景吗。每一步执行完成后,在根据执行结果选择下一步进行执行。需要注意的是防止重复执行和保证最终一致的机制。防止重复执行:每一笔交易给它一个唯一编码,执行成功后再次调用也不予第二次执行。保证最终一致:异步执行过程中,如果返回失败则继续重试,设定最大重试次数,超过后转入异常队列,等待人工干预处理,不致于因为异常任务浪费大量处理时间。
解决方案二:
话说,java.util.concurrent.Future 这个接口能用不?
解决方案三:
你的每比交易都是开一个新的线程去做的吗?你可以用thread.join()在当前业务中将两个线程的逻辑人为的同步化。
解决方案四:
楼主兄弟:在下有一个小技巧第一:在最第一笔交易时,首先将第一笔交易存放到,本地线程变量中。如实现方式 public class ThreadLocalManager { private static ThreadLocal<HashMap<?, ?>> pool = new ThreadLocal<HashMap<?, ?>>(); public static Object get(String key) { Map<?, ?> map = (Map<?, ?>) pool.get(); if (map == null) { return null; } return map.get(key); } public static void add(String key, Object value) { if (pool.get() == null) { pool.set(new HashMap()); } Map map = (Map) pool.get(); map.put(key, value); } public static Map getMap() { return (Map) pool.get(); } public static void clear() { pool.set(null); }在将你第一笔交易存放。如ThreadLocalManager.add(key,value); //这里存放的键值对的数据,方便在第二笔中获取第二:在执行第二笔交易的时候,去第一笔交易中,获取数据。如 ThreadLocalManager.get(key); //这里通过key获取当前上个线程变量存放的数据。接下来,做逻辑判断,就是你的事了。祝你成功。
解决方案五:
可以根据上一个的返回结果或者利用回调函数实现。
解决方案六:
一.如果你不是在一个代码实现,那就做一个标志位(回调),等到异步返回的时候,修改标志,通知第二笔交易可以进行了。二.调用的结果虽是异步的,在代码里处理像是同步处理的。那你就必须实现主动等待了。while循环,时间累加试探性的去侦探返回标志。一旦返回了就跳出循环,处理第二笔交易。大概是这样的思路,纯手打,求分。可私信交流。

时间: 2024-08-02 14:43:13

java异步调用但是需要实现同步的效果的相关文章

JAVA异步调用

就是A调用一个系统的工作流,系统工作流做完反馈B,这是一个异步的过程.现在想做成同步的,就是A启动工作流之后停止,一直等待B被回调了,设定超时时间,如果超时A返回错误:否则返回成功.  B每次收到请求就往里面加数据 A如果非超时处理完请求就会把数据删掉 A这边设置一个集合 只有集合里有工单ID了才返回结果,并且把这个ID从集合中REMOVE调 B一来A就ADD一个  public class AClient2C2 { private final long timeout = 10000; pub

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发送短信系列之同步、异步发送短信_java

本篇本章是发送短信的第一部分, 说一下同步/异步发送短信的代码, 以后几篇我们稍微完善一下功能, 添加发送频率的限制和日发送次数的限制. 发送短信的方法可能不少, 我们的方法是使用服务商提供的服务. 一般来说, 这些服务都是和语言无关的, 这里我们使用java写示例程序.1.发送短信的接口 根据自己的情况选择服务商.2.开发文档 从开发文档中我们可以看到. 可以直接使用http请求也可以使用WebService请求发送短信. 由于DEMO文件夹下的java和jsp文件夹中的代码都是使用http请

C#:Func的同步、异步调用

实际开发中,对于一些耗时较长的操作,我们往往会将其封装成异步方式调用,以加速系统响应或改善用户体验,下面是一个示例: 有一个现成的类MyMath,里面有一个Add方法:  1 public class MyMath 2 { 3 4 public int Add(int a, int b) 5 { 6 System.Threading.Thread.Sleep(5000); 7 return a + b; 8 } 9 10 } 对Add方法做下封装,对了对比,同时提供"同步调用"与&qu

艾伟_转载:C# 委托的同步调用和异步调用

委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 同步调用的例子: using System;using System.Threading;public delegate int AddHandler(int a, int b);public class Foo {static void Main() { Console.WriteLine("**********SyncInvokeTest**************&

C# 委托的同步调用和异步调用

委托的Invoke方法用来进行同步调用.同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行. 同步调用的例子: using System; using System.Threading; public delegate int AddHandler(int a, int b); public class Foo { static void Main() { Console.WriteLine("**********SyncInvokeTest***********