Java 轮询(重发)机制

1.需求:

(1):支付成功需要给商户发送异步通知接口

(2):发送失败得情况下需要有重发机制,重发10次,如果10次还是失败,就不重发了

2.思路 :

(1):创建表,需要有时间,次数,状态,推送信息,唯一表示

(2):入库

(3):成功更新状态,失败更新状态(唯一标识)

3.技术 

   (1):TimeUnit是java.uitl.concurrent包下得一个类名,主要功能是暂停线程得操作与Thread.sleep()一样功能都是暂停线程

    (2):Thread.sleep()只能精确到毫秒,只可以精确到毫秒数

   //睡眠多久

 (3):TimeUnit.SECONDS.sleep(intervalTime);

    (4): *  NANOSECONDS:毫微秒
         *  MICROSECONDS:微妙
         *  MILLISECONDS:毫秒
         *  SECONDS:秒
         *  MINUTES:分钟
         *  HOURS:小时
         *  DAYS:天

4.实现: 

public class B {

    //最大重试次数 10
    private static  final Integer tryTimes=10;
    //重时间隔单位秒
    private static  final  Integer intervalTime = 2;

    public static void main(String[] args) throws InterruptedException {
        boolean b = B.retryBuss();
        System.out.println("最终指向结果:"+(b ? "成功":"失败"));
    }

    private static boolean retryBuss() throws InterruptedException {
        Integer retryNum = 1;
        boolean flag = false;
        while (retryNum <= tryTimes){
            try {
                flag = execute(retryNum);
                if(flag){
                    System.out.println("第"+retryNum+"成功");
                    break;
                }
                System.out.println("第"+retryNum+"失败");
                TimeUnit.SECONDS.sleep(intervalTime);
                retryNum++;
            }catch (Exception e){
              retryNum++;
                continue;
            }

        }
        return flag;
    }

    /**
     * 具体得业务逻辑
     * @param retryNum
     * @return
     */
    private static boolean execute(int retryNum) {
        Random random = new Random();
        int i = random.nextInt(20);
        boolean flag = true;
        try {
            if(i != 6 ){
                flag = false;
                throw  new RuntimeException();
            }
        }catch (Exception e){

        }

        return flag;
    }

}

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Java实现轮询机制可以使用 Servlet 或者基于 Servlet 的框架,如 Spring MVC。下面是一个使用 Servlet 实现轮询的示例代码: ```java @WebServlet("/api/data") public class LongPollingServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置响应类型为 JSON response.setContentType("application/json"); // 模拟获取数据的过程 // 例如,可以查询数据库或者调用外部接口来获取数据 String data = getData(); if (data != null) { // 有新数据可用时,将数据作为响应发送给客户端 response.getWriter().write(data); response.getWriter().flush(); } else { // 没有新数据可用时,将请求挂起,并保持连接打开 synchronized (this) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 接收到新数据时,唤醒挂起的请求 synchronized (this) { notifyAll(); } } private String getData() { // 返回获取到的数据,如果没有数据可用,返回 null // 例如,可以从数据库或其他资源中获取数据 return null; } } ``` 在上面的示例中,`/api/data` 路径对应的 Servlet 类 `LongPollingServlet` 用于接收长轮询请求。在 `doGet` 方法中,首先设置响应类型为 JSON,然后模拟获取数据的过程。如果有新数据可用,将数据作为响应发送给客户端;如果没有新数据可用,将请求挂起,并保持连接打开,直到有新数据到达或超时。在 `doPost` 方法中,接收到新数据时,唤醒挂起的请求。 这只是一个简单的示例,实际情况可能需要根据具体需求对代码进行更多的处理和优化。另外,长轮询机制也可以通过使用 WebSocket 或其他推送技术来实现,这些方法可以实现实时的双向通信,而不需要轮询

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值