ホーム › フォーラム › ReportsConnect for Salesforce › バッチ実行時goPrint()でSystem.NullPointerExceptioが発生する
-
投稿者投稿
-
2015年11月2日 11:12 AM #269sys-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()で、例外が発生しました。⑦ エラーが発生するレコードに対して、個別にバッチを実行すると、エラーは発生せず、問題なく終了します。
以上よろしくお願いします。
2015年11月4日 9:56 AM #270sweetie参加者ログインユーザー固定化オプションを使用するケースで、1回のバッチ内で複数回PDF作成処理を呼んでいると思いますが、
ReportsconnectControllerは1回のPDFの作成で複数回calloutを行います。現在salesforceのガバナ制限では1回の処理内のcallout回数が100回までとなっています。
1回のバッチ内でのcallout件数の上限を超えてexceptionが内部で発生しているように思われます。
内部のexceptionの扱いでエラーメッセージを出力に問題があって(想定外のexception)null Pointer Exceptionとなっている可能性があります。デバッグログ上のcallout回数を確認してください。
2015年11月5日 4:55 PM #271sys-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 1011: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.2015年11月5日 6:31 PM #273sweetie参加者ReportsConnectControllerのからのcall outで想定外のcallout exceptionが発生していると思われます。
その際に、メッセージを正確に返せずnull pointer exceptionとなっているようです。想定外のcallout exceptionはそのままthrowするように修正を入れたバージョンをリリースしますので、暫くお待ち下さい。
2015年11月6日 3:45 PM #274sys-act.com参加者承知しました。
2015年11月9日 10:24 AM #275sweetie参加者Reportsconnect for salesforceの修正版のダウンロードURLです
https://login.salesforce.com/packaging/installPackage.apexp?p0=04tG0000000MglC
sandbox用はこちら
https://test.salesforce.com/packaging/installPackage.apexp?p0=04tG0000000MglC
お試しください
2015年11月11日 3:02 PM #276sys-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”,
念のため、セキュリティートークンの再発行をして設定を変更し、その後再テストを行いましたが、状況に変化はありませんでした。
2015年11月12日 3:17 PM #277sweetie参加者LoginFaultは、前回のようにbatch環境で連続処理を行った場合に発生するのですか、
それとも、単体で行った場合でも、必ず発生するという事ですか?こちらの環境ではこのような現象は再現できないのですが。
2015年11月12日 4:03 PM #278sys-act.com参加者1.バッチ実行の場合 → LoginFaultが発生します。
2.開発者コンソールから単体で実行した場合 → LoginFaultが発生します。
3.帳票画面から「印刷テスト」ボタンを押した場合 → LoginFaultは発生しません。ためしに、セキュリティートークンの設定が間違っている帳票オブジェクトを別途作成して、ログインユーザー固定化チェックをONにし、帳票画面から「印刷テスト」ボタンを押したところ、そちらではLoginFaultが発生します。
以上により、
・設定そのものが間違っている場合
→クライアント画面のボタンでLoginFaultが発生します・今回起きている現象
→クライアント画面のボタンではLoginFaultが発生しないのに、Apexから実行したときは、単体でもバッチでもLoginFaultが発生します。2015年11月12日 6:37 PM #279sweetie参加者当方で、ログインユーザーを固定化する および 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);}
}2015年11月13日 11:00 AM #280sys-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);
}
}2015年11月13日 1:05 PM #281sys-act.com参加者1.貴社の製品を導入し、
2.有料オプションを購入する予定でテストをしていて、
3.障害が発生したので問い合わせを行い、
4.貴社から修正版が出たので導入したら違うエラーが発生した(こちらで設定変更は行わず、ただ修正版をインストールしただけです)ので
5.再度問い合わせをしているだけなのに、なぜ「私のところではうまくいく」ということ「だけ」を延々と主張し続けるのでしょうか?
貴社の環境でいくらうまくいってもこちらで動かなければ使用できないのですが、
貴社の製品は使用するなという意味なのでしょうか?2015年11月13日 1:14 PM #282sweetie参加者製品を使用するかどうかは、テストの結果で判断していただければ結構です。
こちらで作成したこのコードでは正常に稼働しているので、エラーが出る場合とどこに相違があるかを確認してもらいたいだけです。また、このフォーラムは、すべての問題の解決を保証するものではありません。
そちらのコードを見ると、rc.setReportId(‘請求書’);と、帳票オブジェクトを名称で指定していますが、請求書という名前のオブジェクトが複数あるということは無いですか?
複数ある場合は、そのうちのどのオブジェクトが選択されるか特定できません。
ユーザーID、パスワードが正しくない指定の同一名のオブジェクトがあるということはありませんか?2015年11月13日 1:29 PM #283sys-act.com参加者請求書という名前のオブジェクトはひとつしかありません
2015年11月13日 1:36 PM #284sweetie参加者追加ですが、rc.setReportId()は引数にIDを指定することも可能ですから、正しい帳票オブジェクトのIDを指定してやってみてください。
-
投稿者投稿
- このトピックに返信するにはログインが必要です。