バッチ実行時goPrint()でSystem.NullPointerExceptioが発生する

ホーム フォーラム ReportsConnect for Salesforce 人気のトピック

  • このトピックには22件の返信、2人の参加者があり、最後にsweetieにより9年、 1ヶ月前に更新されました。
15件の投稿を表示中 - 1 - 15件目 (全23件中)
  • 投稿者
    投稿
  • #269
    sys-act.com
    参加者

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

    現在、ReportsConnect for Salesforceを使用して、請求書のPDFを作成し、そのPDFをカスタムオブジェクトに添付するシステムを開発しています。

    ReportsConnectの中でSystem.NullPointerExceptionが発生します。

    エラーが発生する原因と対処法が分からないのでご教示頂ければ幸いです。

    ①例外付近のログは以下の通りです。

    10:09:29.636 (123636060872)|ENTERING_MANAGED_PKG|kpsr
    10:09:29.636 (123636128293)|ENTERING_MANAGED_PKG|kpsr
    10:09:29.636 (123636187445)|ENTERING_MANAGED_PKG|kpsr
    10:09:29.636 (123636264557)|ENTERING_MANAGED_PKG|kpsr
    10:09:29.636 (123636319280)|ENTERING_MANAGED_PKG|kpsr
    10:09:29.636 (123636390755)|ENTERING_MANAGED_PKG|kpsr
    10:09:29.743 (123743060228)|USER_DEBUG|[61]|ERROR|エラーが発生しました。System.NullPointerException
    Message: Attempt to de-reference a null object
    Cause: null
    Line number: 555
    Stack trace: (kpsr)

    ②goPrint()メソッドをコールしている付近のソースコードは以下の通りです
    kpsr.ReportsConnectController rc = new kpsr.ReportsConnectController();
    rc.setReportId(‘請求書’);
    rc.setSoql([機密保持のため省略]);
    rc.setLoginFix(true);
    rc.setNouiMode(true);
    rc.setAttcheToId(true);
    rc.setParentId(b.Id);
    rc.setFileName(b.Name);
    if (! Test.isRunningTest()) {
    rc.goPrint();
    System.debug(logginglevel.INFO, ‘goPrintを終了しました。);
    // System.debug(logginglevel.INFO, rc.batchMessage);
    kpsr.BatchPrintResult res = (kpsr.BatchPrintResult) JSON.deserialize(rc.batchMessage,kpsr.BatchPrintResult.class);
    if(! res.success){
    System.debug(logginglevel.ERROR, rc.batchMessage);

    ③このシステムでは、goPrint()メソッドを、Database.Batchable<sObject>, Database.Stateful, Database.AllowsCallouts インタフェースを実装したバッチプログラムからコールしています。

    ④ バッチプログラムのバッチサイズは200、処理レコード数は1,191件で、1,191個のPDFを作成するテストを実施しています。

    ⑤ 1,191レコードに対するバッチサイズが200なので、6回バッチが繰り返されますが、6回とも同じ例外が発生します。

    ⑥ バッチ内で発生する例外の出現には、よく似たパターンがあります。

    1回目のバッチでは、そのバッチ内の23回目のgoPrint()で、例外が発生しました。
    2回目のバッチでは、そのバッチ内の23回目のgoPrint()で、例外が発生しました。
    3回目のバッチでは、そのバッチ内の24回目のgoPrint()で、例外が発生しました。
    4回目のバッチでは、そのバッチ内の24回目のgoPrint()で、例外が発生しました。
    5回目のバッチでは、そのバッチ内の23回目のgoPrint()で、例外が発生しました。
    6回目のバッチでは、そのバッチ内の24回目のgoPrint()で、例外が発生しました。

    ⑦ エラーが発生するレコードに対して、個別にバッチを実行すると、エラーは発生せず、問題なく終了します。

    以上よろしくお願いします。

    #270
    sweetie
    参加者

    ログインユーザー固定化オプションを使用するケースで、1回のバッチ内で複数回PDF作成処理を呼んでいると思いますが、
    ReportsconnectControllerは1回のPDFの作成で複数回calloutを行います。

    現在salesforceのガバナ制限では1回の処理内のcallout回数が100回までとなっています。

    1回のバッチ内でのcallout件数の上限を超えてexceptionが内部で発生しているように思われます。
    内部のexceptionの扱いでエラーメッセージを出力に問題があって(想定外のexception)null Pointer Exceptionとなっている可能性があります。

    デバッグログ上のcallout回数を確認してください。

    #271
    sys-act.com
    参加者

    バッチ実行をした時はLIMIT USAGEの情報が取れないので、PDFファイル1つを作成する処理を手動で実行して情報を取得しました。
    ログには(default)とkpsrの2種類が表示され、それぞれ数値が異なります。

    11:13:20.113 (7113446982)|LIMIT_USAGE_FOR_NS|(default)|
    Number of SOQL queries: 1 out of 100
    Number of query rows: 1 out of 50000
    Number of SOSL queries: 0 out of 20
    Number of DML statements: 0 out of 150
    Number of DML rows: 0 out of 10000
    Maximum CPU time: 72 out of 10000
    Maximum heap size: 0 out of 6000000
    Number of callouts: 0 out of 100
    Number of Email Invocations: 0 out of 10
    Number of future calls: 0 out of 50
    Number of queueable jobs added to the queue: 0 out of 50
    Number of Mobile Apex push calls: 0 out of 10

    11:13:20.113 (7113446982)|LIMIT_USAGE_FOR_NS|kpsr|
    Number of SOQL queries: 6 out of 100 <—- 1つのPDF作成に対してSOQLが6回発行されている
    Number of query rows: 5 out of 50000
    Number of SOSL queries: 0 out of 20
    Number of DML statements: 0 out of 150
    Number of DML rows: 0 out of 10000
    Maximum CPU time: 0 out of 10000
    Maximum heap size: 0 out of 6000000
    Number of callouts: 2 out of 100 <—- 1つのPDF作成に対してコールアウトが2回実行されている
    Number of Email Invocations: 0 out of 10
    Number of future calls: 0 out of 50
    Number of queueable jobs added to the queue: 0 out of 50
    Number of Mobile Apex push calls: 0 out of 10

    バッチサイズ200の場合の実行時は23回目か24回目のコールで障害が発生していますが、

    コールアウト数は 2 × 23 = 46 で制限内におさまります。

    SOQL数は 6 × 23 = 138 でバッチ実行時のガバナ制限200だと制限内におさまります。
    (executeの中では私の方ではSOQLを発行していません。ReportsConnectControllerのメソッド以外はコールしていません)

    また、バッチサイズを少なくしながら障害がとのように発生するかの検証を行ったところ、以下の結果となりました。

    ※バッチサイズ = 1トランザクション内で作成するPDFの数 = goPrint()の1トランザクション内のコール回数です。

    バッチサイズ 20 の時 : NullPointerException が発生しました。(6回のバッチ実行のうち2回発生。それ以降は実行中止。)
    バッチサイズ 19 の時 : NullPointerException が発生しました。(14回のバッチ実行のうち1回発生。それ以降は実行中止。)
    バッチサイズ 18 の時 : NullPointerException が発生しました。(24回のバッチ実行のうち1回発生。それ以降は実行中止。)

    バッチサイズ18でもNullPointerExceptionが発生します。
    この時に1トランザクション内におけるガバナ制限を超過しているとは考えにくいです。

    また、どのバッチサイズでも、全てのバッチ実行で発生するのではなく、突然発生するため、規則性がありません。

    以上により、ガバナ制限超えが障害のトリガーであるとは考えづらいのですが、いかがでしょうか。

    ジョブ状況画面のキャプチャー画像を添付いたします。

    よろしくお願いします。

    Attachments:
    You must be logged in to view attached files.
    #273
    sweetie
    参加者

    ReportsConnectControllerのからのcall outで想定外のcallout exceptionが発生していると思われます。
    その際に、メッセージを正確に返せずnull pointer exceptionとなっているようです。

    想定外のcallout exceptionはそのままthrowするように修正を入れたバージョンをリリースしますので、暫くお待ち下さい。

    #274
    sys-act.com
    参加者

    承知しました。

    #275
    sweetie
    参加者

    Reportsconnect for salesforceの修正版のダウンロードURLです

    https://login.salesforce.com/packaging/installPackage.apexp?p0=04tG0000000MglC

    sandbox用はこちら

    https://test.salesforce.com/packaging/installPackage.apexp?p0=04tG0000000MglC

    お試しください

    #276
    sys-act.com
    参加者

    修正版をインストールした後に実行したら、下記のメッセージが出力されました。
    ユーザーIDやパスワードやセキュリティートークンは変更していません。

    “[LoginFault [ApiFault exceptionCode=’INVALID_LOGIN’\n exceptionMessage=’Invalid username, password, security token; or user locked out.’\n]\n]\n:null”,”tag”:”kps-reportsconnect”,

    念のため、セキュリティートークンの再発行をして設定を変更し、その後再テストを行いましたが、状況に変化はありませんでした。

    #277
    sweetie
    参加者

    LoginFaultは、前回のようにbatch環境で連続処理を行った場合に発生するのですか、
    それとも、単体で行った場合でも、必ず発生するという事ですか?

    こちらの環境ではこのような現象は再現できないのですが。

    #278
    sys-act.com
    参加者

    1.バッチ実行の場合 → LoginFaultが発生します。
    2.開発者コンソールから単体で実行した場合 → LoginFaultが発生します。
    3.帳票画面から「印刷テスト」ボタンを押した場合 → LoginFaultは発生しません。

    ためしに、セキュリティートークンの設定が間違っている帳票オブジェクトを別途作成して、ログインユーザー固定化チェックをONにし、帳票画面から「印刷テスト」ボタンを押したところ、そちらではLoginFaultが発生します。

    以上により、

    ・設定そのものが間違っている場合
    →クライアント画面のボタンでLoginFaultが発生します

    ・今回起きている現象
    →クライアント画面のボタンではLoginFaultが発生しないのに、Apexから実行したときは、単体でもバッチでもLoginFaultが発生します。

    #279
    sweetie
    参加者

    当方で、ログインユーザーを固定化する および UIを使用しない にチェックした帳票オブジェクトを使用して以下の様なコードを開発者コンソールの Open Execute Anonymous Windowから実行したところ、正常に稼働していますが。

    public class Maint {

    public static void goBtcPrint(){
    kpsr.ReportsConnectController rc = new kpsr.ReportsConnectController();
    rc.setReportId(‘見積り’);
    rc.getParms().put(‘condition’,’WHERE Opportunity.OrderNumber__c = \’TST11001\”);
    rc.goPrint();
    system.debug(rc.batchMessage);

    }
    }

    #280
    sys-act.com
    参加者

    当方で、ログインユーザーを固定化する および UIを使用しない にチェックした帳票オブジェクトを使用して以下の様なコードを開発者コンソールの Open Execute Anonymous Windowから実行したところ、LoginFaultエラーが発生していますが。

    印字テストボタンを実行したときは、ちゃんと応答が返ってきます。

    public class Maint {
    public static void goBtcPrint(){
    String soql = ‘SELECT Name FROM Bill_c lmit 1’;
    Bill__c b = [select id, name from bill__c limit 1];
    kpsr.ReportsConnectController rc = new kpsr.ReportsConnectController();
    rc.setReportId(‘請求書’);
    rc.setSoql(soql);
    system.debug(logginglevel.INFO, soql);
    rc.setAttcheToId(true);
    rc.setParentId(b.Id);
    rc.setFileName(b.Name);
    rc.goPrint();
    system.debug(logginglevel.INFO, rc.batchMessage);
    }
    }

    #281
    sys-act.com
    参加者

    1.貴社の製品を導入し、
    2.有料オプションを購入する予定でテストをしていて、
    3.障害が発生したので問い合わせを行い、
    4.貴社から修正版が出たので導入したら違うエラーが発生した(こちらで設定変更は行わず、ただ修正版をインストールしただけです)ので
    5.再度問い合わせをしているだけなのに、

    なぜ「私のところではうまくいく」ということ「だけ」を延々と主張し続けるのでしょうか?
    貴社の環境でいくらうまくいってもこちらで動かなければ使用できないのですが、
    貴社の製品は使用するなという意味なのでしょうか?

    #282
    sweetie
    参加者

    製品を使用するかどうかは、テストの結果で判断していただければ結構です。
    こちらで作成したこのコードでは正常に稼働しているので、エラーが出る場合とどこに相違があるかを確認してもらいたいだけです。

    また、このフォーラムは、すべての問題の解決を保証するものではありません。

    そちらのコードを見ると、rc.setReportId(‘請求書’);と、帳票オブジェクトを名称で指定していますが、請求書という名前のオブジェクトが複数あるということは無いですか?

    複数ある場合は、そのうちのどのオブジェクトが選択されるか特定できません。
    ユーザーID、パスワードが正しくない指定の同一名のオブジェクトがあるということはありませんか?

    #283
    sys-act.com
    参加者

    請求書という名前のオブジェクトはひとつしかありません

    #284
    sweetie
    参加者

    追加ですが、rc.setReportId()は引数にIDを指定することも可能ですから、正しい帳票オブジェクトのIDを指定してやってみてください。

15件の投稿を表示中 - 1 - 15件目 (全23件中)
  • このトピックに返信するにはログインが必要です。