开发中偶尔会碰到一些轮询需求,比如我碰到的和银行对接,在做完某一个业务后银行没有同步给到结果,这时候就需要查询返回结果,我们的需求是5分钟一次,查询3次,3次过后如果没有结果则T+1等银行的文件,对于这种任务我们的要求是轮询不是很严格,所以我采取调度线程池方式,如果有查询任务,加入线程池,设置好执行次数及执行时间间隔,具体代码如下:

 import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.util.concurrent.*; public class LocalTest { private static final Logger log = LoggerFactory.getLogger(LocalTest.class); @Test
public void test01() throws InterruptedException {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
ConcurrentHashMap<String, Future> futureMap = new ConcurrentHashMap<>(); JobTest jobTest1 = new JobTest("job1",futureMap);
Future future1 = executorService.scheduleAtFixedRate(jobTest1,1, 5, TimeUnit.SECONDS);
futureMap.put(jobTest1.getJobId(),future1); JobTest jobTest2 = new JobTest("job2",futureMap);
Future future2 = executorService.scheduleAtFixedRate(jobTest2,1, 5, TimeUnit.SECONDS);
futureMap.put(jobTest2.getJobId(),future2); Thread.sleep(1000L * 30); JobTest jobTest3 = new JobTest("job3",futureMap);
Future future3 = executorService.scheduleAtFixedRate(jobTest3,1, 5, TimeUnit.SECONDS);
futureMap.put(jobTest1.getJobId(),future3); JobTest jobTest4 = new JobTest("job4",futureMap);
Future future4 = executorService.scheduleAtFixedRate(jobTest4,1, 5, TimeUnit.SECONDS);
futureMap.put(jobTest4.getJobId(),future4); Thread.sleep(1000L * 300);
executorService.shutdown();
} @Test
public void test02() { } class JobTest implements Runnable { private ConcurrentHashMap<String, Future> futureMap;
private int count = 0;
private String jobId; public JobTest(){ } public JobTest(String jobId, ConcurrentHashMap<String, Future> futureMap) {
super();
this.jobId = jobId;
this.futureMap = futureMap;
} @Override
public void run() {
count++;
log.info("{} count is {}", jobId, count);
if (count > 2) {
Future future = futureMap.remove(jobId);
future.cancel(true);
log.info("{} had cancel", jobId);
}
} public String getJobId() {
return jobId;
} public void setJobId(String jobId) {
this.jobId = jobId;
} public ConcurrentHashMap<String, Future> getFutureMap() {
return futureMap;
} public void setFutureMap(ConcurrentHashMap<String, Future> futureMap) {
this.futureMap = futureMap;
}
}
}

由于任务是放在队列,在内存里面,所以应用重启会导致任务丢失,如果对于严格要求轮询查询的不合适用这种方式

最新文章

  1. 为input输入框添加圆角并去除阴影
  2. VS 工程的 输出路径和工作路径的区别
  3. Thinkphp模型问题(一)
  4. Hibernate总结
  5. python 解析XML python模块xml.dom解析xml实例代码
  6. ActiveMQ之Queue
  7. 怎么让LinearLayout充满ScrollView
  8. JAX-WS
  9. tomcat错误信息解决方案【严重:StandardServer.await: create[8005]
  10. ios 记录支付宝集成遇到的坑及解决方法
  11. Set集合中的HashSet集合
  12. 解决SVG跨浏览器兼容性问题
  13. [转]loadView的用法,loadView创建基本界面,DidLoad读入数据
  14. Float 的那些事
  15. golang其实也可以优先调度
  16. ajax 执行成功 没有返回
  17. BZOJ5177 : [Jsoi2013]贪心的导游
  18. React.js 入门与实战课程思维导图
  19. POJ 3687 Labeling Balls(反向拓扑+贪心思想!!!非常棒的一道题)
  20. HDU 1729 类NIM 求SG

热门文章

  1. 洛谷 P2136 拉近距离 题解
  2. (转)React事件处理函数必须使用bind(this)的原因
  3. web安全总结
  4. A. The Fair Nut and Elevator (Codeforces Round #526 (Div. 2))
  5. 卷积神经网络CNN学习笔记
  6. Nginx压测和并发预估
  7. python的tecplot模块(tecplot新特性)
  8. 坑爹微信之读取PKCS12流时出现的java.io.IOException: DerInputStream.getLength
  9. RocketMQ官方启动脚本不支持jdk11的修改
  10. Linux Shell:Map的用法