当前位置: 首页 > 知识库问答 >
问题:

在特定条件和时间下运行线程

陆飞龙
2023-03-14

我想创建一个条件,当用户下订单时,有一个线程运行20秒来检查数据库的支付状态是完成还是挂起,如果完成了,线程将停止,如果仍然挂起,线程将继续运行20秒,并更新数据库中的状态以取消,我使用mybatis和XML映射器

这是我的代码

public class PaymentCheck implements Runnable{
   private String username;
    public PaymentCheck(String username) {
        this.username = username;
    }

    @Override
    public void run() {
        SqlSession session = MyBatisUtil.getSqlSessionFactory().openSession();
        Booking bookStatus =  session.selectOne("User.check",username);

        String status = bookStatus.getPayment_status();
        while (status.equalsIgnoreCase("pending")){
            final Timer timer = new Timer();
            timer.scheduleAtFixedRate(new TimerTask() {
                int i = 6; // Time in seconds

                public void run() {
                    System.out.println(i--);
                    if (i < 0) {
                        timer.cancel();

                    }
                }
            }, 0, 1000);
        }
    }
}

下面是我在控制器中的代码

@RequestMapping(value = "/Booking", method = RequestMethod.POST,consumes = "application/json", produces = "application/json")
public ResponseEntity<?> Booking(@RequestBody JSONObject jobj, @RequestHeader(HEADER)  String header) throws RestClientException, JsonProcessingException {

    String username = userRepo.claimToken(SECRET,PREFIX,header);
    jobj.put("username",username);
    HttpHeaders headers = new HttpHeaders();
    MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
    headers.setContentType(type);
    System.out.println(jobj.toString());
    HttpEntity<JSONObject> formEntity = new HttpEntity<JSONObject>(jobj, headers);
    JSONObject json = restTemplate.postForEntity("http://localhost:8080/hotel/Booking", formEntity, JSONObject.class).getBody();
    String message = String.valueOf(json.get("Booking Status"));

    if (!message.equalsIgnoreCase("Failed")) {
        System.out.println("json:" + json.toString());
        System.out.println(username);
        PaymentCheck tq = new PaymentCheck(username);
        tq.run();
        return new ResponseEntity<>(json,HttpStatus.CREATED);
    }else{

        return new ResponseEntity<>(json,HttpStatus.CREATED);
    }


}

这是数据库

它不会显示任何错误,但也不会改变任何东西...

共有1个答案

孙成益
2023-03-14

你似乎把这事搞得太复杂了。

问题1:线程每秒轮询一次,但是控制器响应在响应客户之前并不等待更新发生。所以投票没有意义。

问题2:线程实际上并没有更新数据库。

    null
private Timer timer = new Timer();

@RequestMapping(value = "/Booking", method = RequestMethod.POST,consumes = "application/json", produces = "application/json")
public ResponseEntity<?> Booking(@RequestBody JSONObject jobj, @RequestHeader(HEADER)  String header) throws RestClientException, JsonProcessingException {

    String username = userRepo.claimToken(SECRET,PREFIX,header);
    jobj.put("username",username);
    HttpHeaders headers = new HttpHeaders();
    MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
    headers.setContentType(type);
    System.out.println(jobj.toString());
    HttpEntity<JSONObject> formEntity = new HttpEntity<JSONObject>(jobj, headers);
    JSONObject json = restTemplate.postForEntity("http://localhost:8080/hotel/Booking", formEntity, JSONObject.class).getBody();
    String message = String.valueOf(json.get("Booking Status"));

    if (!message.equalsIgnoreCase("Failed")) {
        System.out.println("json:" + json.toString());
        System.out.println(username);
        TimerTask tt = new PaymentCheck(username);
        timer.schedule(tt, 20000);
        return new ResponseEntity<>(json,HttpStatus.CREATED);
    }else{
        return new ResponseEntity<>(json,HttpStatus.CREATED);
    }
}

public class PaymentCheck extends TimerTask {

   private static final MYQUERY = "update User.check set payment_status = 'cancelled' where payment_status = 'pending' and user = ?";

   private String username;

   public PaymentCheck(String username) {
       this.username = username;
   }

    @Override
    public void run() {
        try (Connection cn = ...) {
            try (Statement stmt = new PreparedStatement(MYQUERY))
            {
                stmt.setString(1, username);
                stmt.execute();
                cn.commit();
            }
        }
    }
}


 类似资料:
  • 问题内容: 我有一个Web应用程序,每小时与中央数据库同步四次。该过程通常需要2分钟。我想将此进程作为线程在X:55,X:10,X:25和X:40运行,以便用户知道在X:00,X:15,X:30和X:45他们有数据库的干净副本。这只是管理期望。我已经通过了执行器,但是调度是通过它完成的,我认为不能保证以小时为单位的实际运行时间。我可以使用第一个延迟来启动,以便第一个接近启动时间和每15分钟的计划,

  • 问题内容: 我需要帮助在特定时间(如下午2点)在服务器上运行Java程序(以索引新文件)。 有人告诉我Java有一些叫做Job的东西,但我不知道该如何使用。我尝试了这个: 但是有了这个程序仍在运行。 如何在指定时间运行程序? 问题答案: 有一个名为Quartz的API ,您的程序可以在其中调度“作业”,并在该时刻运行它。 在给出示例之前,请尝试使用此链接。 编辑:首先,您必须创建一个实现org.q

  • 例如,我想编写一个Java程序,在每天上午12点打印“Hello World”,如何使用Quartz调度器实现这一点? 这样地?我应该把打印“hello world”方法放在哪里?

  • 现在我每天下午3点运行我的cron作业 但是我想一天运行两次cron作业。上午10点30分和下午2点30分 我相信此命令将在上午 10:30 运行。我应该如何在下午 2:30 运行它?

  • 问题内容: 我想编写一个简单的python脚本来完成特定的工作。我花了一些时间从网站链接信息。 在正确的时间单击这些链接的最佳方法是什么?我是否需要计算当前电流与列表中的电流之间的时间间隔并睡眠一会儿? 我真的停留在这一点上,并欢迎任何可能有用的想法。 问题答案: 看一下Python的sched模块。

  • 有一种方法可以运行junit测试,只需在“mvn clean install”命令中添加参数?没有使用@Profile注释测试。