<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      終于可以愉快的擼Java異步代碼了!

      ??異步響應式編程可以極大的提高系統的并發呑吐量,但由于Java沒有類似于其他語言的Async/Await機制,所以只能通過CompletableFuture.thenXXX()來串聯各個異步任務,這給習慣了寫同步增刪改查的小伙伴們帶來了些小麻煩。如果說C#基于狀態機在編譯時實現了await轉換,那么Java肯定也可以基于相同的原理實現await,作者上網一搜果然找到了ea-async,使用與C#相同的方式實現了await異步方法,這回終于可以愉快的擼Java異步代碼了。

      一、 示例代碼

      ??舉個扣減庫存并保存訂單的例子,在沒有await方式下的示例代碼如下:

      public CompletableFuture<?> saveOrder(Order order) {
          //1.開始事務
          return DataStore.DemoDB.beginTransaction().thenCompose(txn -> {
              //2.扣庫存
              var cmd = new SqlUpdateCommand<Order>();
              cmd.update(e -> e.Stock = e.Stock - order.Quantity); //當前量扣除訂單量
              cmd.where(e -> e.ProductId == order.ProductId);
              var outs = cmd.output(e -> e.Stock);
              return cmd.execAsync(txn).thenCompose(rows -> {
                  //3.判斷庫存
                  if (rows == 0 || outs.get(0) < 0) 
                      return CompletableFuture.failedFuture("庫存不足");
                  //4.保存訂單
                  return order.saveAsync(txn);
              }).thenCompose(r -> txn.commitAsync()); //5.遞交事務
          }).thenApply(r -> "Done.");
      }
      

      ??WTF! 一層套一層的回調,這還只是個簡單的例子啊。但是如果使用await的方式,業務邏輯就變得清爽多了:

      import static sys.Async.await;
      
      public CompletableFuture<?> saveOrder(Order order) {
          //1.開始事務
          var txn = await(DataStore.DemoDB.beginTransaction());
          //2.扣庫存
          var cmd = new SqlUpdateCommand<Order>();
          cmd.update(e -> e.Stock = e.Stock - order.Quantity); //當前量扣除訂單量
          cmd.where(e -> e.ProductId == order.ProductId);
          var outs = cmd.output(e -> e.Stock); 
          var rows = await(cmd.execAsync(txn));
          //3.判斷庫存
          if (rows == 0 || outs.get(0) < 0)
              return CompletableFuture.failedFuture("庫存不足");
          //4.保存訂單
          await(order.saveAsync(txn));
          //5.遞交事務
          await(txn.commitAsync());
          return CompletableFuture.completedFuture("Done.");
      }
      

      二、 實現原理

      ??核心思想沒有變,還是代碼分析轉換。作者原本想利用JDT在源碼層進行await轉換,但是工作量還是比較大的,在這里感謝github/ea-async項目,使得作者只修改了十幾行代碼就實現了上述效果,具體轉換過程如下:

      1. 服務模型的虛擬代碼經過JDT分析、轉換、編譯為class文件(參考前篇說明);
      2. 調用ea-async的Transformer類直接分析與轉換class文件內的await方法調用,生成新的class文件。

      具體參考源碼PublishService的compileService()及transformAsync()方法。

      三、 本篇小結

      ??先解釋一下上篇"優雅的Java ORM"小伙伴們的評論,有說這么多ORM干嗎還要造一個的,也有說不夠"優雅"的,其實造輪子最根本的原因是:異步支持!,Spring WebFlux及VertX有相應的異步操作數據庫的支持,但本框架沒法集成。MyBatis之類的全是同步操作,小的應用系統沒有問題,高并發系統的呑吐量就非常可憐了,這個大家可以測一下Spring MVC與WebFlux的性能對比。

      ??軟件技術日新月異,新一代的開發框架必定是異步的!對于作者來講Spring還不夠簡單優雅,運行的也不夠快,所以才會嘗試重新造這個大輪子,爭取讓應用系統的開發人員有更多的時間關注數據結構、業務邏輯和用戶體驗,也爭取讓小伙伴們有一個絲般順滑的開發體驗。

      邊碼代碼邊碼文實屬不易,作者需要您的支持請您多多點贊推薦!另歡迎感興趣的小伙伴加入我們!

      posted @ 2021-01-18 14:08  白菜園  閱讀(2174)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 国产自产av一区二区三区性色| 亚洲人成网站999久久久综合| 最新中文字幕国产精品| 国产女人18毛片水真多1| 国产av国片精品一区二区| 欧美疯狂xxxxbbbb喷潮| 精品一区二区久久久久久久网站| 99久久精品一区二区国产| 久久91精品牛牛| 久久青青草原亚洲AV无码麻豆| 开心激情站开心激情网六月婷婷| 欧美中文字幕无线码视频| 少妇高潮喷水正在播放| 国产午夜在线观看视频播放| 亚洲成人av日韩在线| 精品国产精品午夜福利| 亚洲欧洲一区二区精品| 四虎永久精品免费视频| 无码天堂va亚洲va在线va| 成A人片亚洲日本久久| 日韩精品理论片一区二区| 国产亚洲人成网站观看| 色欲综合久久中文字幕网| 无码熟妇人妻av在线电影| 国产精品日韩中文字幕熟女| 沈阳市| 色天使亚洲综合一区二区| www久久只有这里有精品| 成人性做爰aaa片免费看| 久久欧洲精品成av人片| 成人乱码一区二区三区四区| 欧美亚洲h在线一区二区| 男人的天堂av一二三区| 亚洲黄日本午夜一区二区| 成年无码av片在线蜜芽| 极品无码国模国产在线观看| 亚洲激情一区二区三区在线| 国产精品亚洲av三区色| 久久综合国产色美利坚| 视频一区视频二区中文字幕| 亚洲欧美日韩综合久久|