bulkRequestの再起処理について

お世話になっております。

2000件以上の登録についてご相談が御座います。

下記のソースで2000件以上のレコードを保存しており、再起処理が上手くいかず悩んでいます。

7000件のレコードを登録した場合に最初の2000件を登録し、再起処理を実行するのですが再起処理実行と同時?に「情報の登録が完了しました。」とメッセージが出てしまい、4000件までは登録され、残りの再起処理が実行されず3000件が登録できない状態です。

再起処理を行うか判断するif文をresolveの手前に持ってきても全件登録がされますが次はretrunで返らず、メッセージが表示されない状態で別画面に遷移することなく処理が終わってしまいます。

再起処理を上手く回す方法があればご教示いただけませんでしょうか?

//新規追加登録後のイベント
kintone.events.on('app.record.create.submit.success',function (event) {
  returnnewkintone.Promise(function (resolve, reject) {
    kintone.api(kintone.api.url('/k/v1/apps',true),'GET', {},function (resp) {
      //レコード情報の取得
      varrecord = event.record;
      //追加するレコードリスト
      varnewRecords;
      //レコード情報の作成
      newRecords = createNewRecords(record);
      //newRecordsで登録する配列を作成
      //(例) [{…}, {…}]
      // 0: {TEST: {…}, TESTコード: {…}, 日付: {…}}
      // 1: {TEST: {…}, TESTコード: {…}, 日付: {…}}
      //...2001: {TEST: {…}, TESTコード: {…}, 日付: {…}}
      //bulkRequestで使用するbodyの配列を作成
      varbulkLists = bulkCreate(newRecords);
      //bodyを作成し、配列化する
      //(例) [{…}, {…}]
      //0:
      // api: "/k/v1/records.json"
      // method: "POST"
      // payload: {app: 1, records: Array(2)}←Arry(2000)にnewRecordsで作成した2000件が入っています。
      //1:
      // api: "/k/v1/records.json"
      // method: "POST"
      // payload: {app: 1, records: Array(1)}  
  
       //bRequestで登録を行います。
      varbResult = bRequest(bulkLists,0);
      if(bResult) {
        resolve(bResult);
      }else{
        returnevent;
      }
    },function (error) {
      // error
      alert("情報の登録に失敗しました。");
    });
  }).then(function (resp) {
    alert("情報の登録が完了しました。");
    event.url = location.protocol + "//" + location.hostname + "/k/" + APPID(アプリ番号);
    returnevent;
  });
});
functionbRequest(bodyLists, count) {
  returnnewkintone.Promise(function (resolve, reject) {
    kintone.api(kintone.api.url('/k/v1/bulkRequest',true),'POST', bodyLists[count],function (resp) {
      resolve(resp);
    },function (error) {
      console.log(error);
      returnfalse;
    });
  }).then(function (resp) {
    count++;
    //body配列の数がcountと一緒になるまで再起処理を行う
    if(bodyLists.length==count) {
      returnture;
    }else{
      bRequest(bodyLists, count);
    }
  });
}

 

富永さん

質問なのですが、件数が少ない場合、正常に動作するのでしょうか?

動作の状況を教えていただければと思います。

ただ、そもそもbulkRequestで7000件を登録したことがないので、動くのか?という疑問もありますが。

 

 

再起処理に関しては、手元で動作確認をしたわけではないのと、Promise内でPromiseオブジェクトを

処理しようとしたことがないので、間違っているのか、違和感なのかわからないですが、

うまくいかない場合に、処理の判定に使っている bodyLists.length==count はどうなっているのでしょうか?

 

 

また、body情報を bodyLists[count] を配列内を順に処理処理してるようですが、

複数のアプリへの処理リクエストが格納されていて、それが配列となっているという状況でしょうか?

コメントアウトとしているところが、配列内の情報かと思いますが、records: Array(2) に2000県のデータが

入っているとありますが、ちょっと状況が把握できてないです。

サクラエビ様

ご対応頂きありがとう御座います。

>件数が少ない場合、正常に動作するのでしょうか?

件数が少ない場合は正常に機能します。

4000件以上のデータを登録しようとすると2000件が登録された後次の2000件を登録する処理と一緒に「登録しました。」とメッセージが表示され、

4000件まで登録されると再起処理されず終了していきます。

 

>処理の判定に使っている bodyLists.length==count はどうなっているのでしょうか?

1度目は正常に動作し、2度目も正常に動作するのですが再起処理を行っていないようです。

Promise内でPromiseを使う点について再度調べてみようと思います。

 

>複数のアプリへの処理リクエストが格納されていて、それが配列となっているという状況でしょうか?

仰る通りで御座います。

bulkRequestは1度に20リクエストを同に処理できると認識しています。

ですので20リクエストを一度に行うbodyを作成し、bulkListsという配列の中に格納しています。

その後、countで1件ずつ処理を行っています。

 

>1度目は正常に動作し、2度目も正常に動作するのですが再起処理を行っていないようです。

すみません。正常に動作するのところの状況がよくわからないのですが、

if (bodyLists.length==count) {
return ture;
} else {
bRequest(bodyLists, count);

              }

となっているところにおいて、2度目も else 処理が実行されるが、bRequest の処理が

行われないという状況でしょうか?

また、bodyLists.length は 4 などが格納されていますでしょうか?

処理終了のメッセージが出るという状況から、判定が 2週目で true になってしまい、処理が進んでいるのでは

と思っております。

 

>bulkRequestは1度に20リクエストを同に処理できると認識しています。

認識の通り、bulkRequest 自体は20リクエストを実行できる仕様らしいです。

2000件の登録ということは、状況的に100件の登録を20リクエストで1度に実行しているということですよね?

 

2000件の登録ではないですが、記載されているコードにあわせて、bulkRequest 用のリクエストを付与し、

3週ほど再起処理する形で、実行してみましたが、想定通りに動いているようでした。 

上で書いたifのところもなのですが、1つ気になるのは、一度の登録を2000件ではなく、件数を減らしたら

どのような動作になりますでしょうか?同じように2週目の再起で終わってしまうということであれば、

リクエストの配列側に問題があるかと思います。