Yugal Kishor Bais
Yugal Kishor Bais

Reputation: 199

Jasper API Call returning 500 error for larger reports in Laravel

I am using Larevel (PHP Framework) and have integrated Jasper API for reporting. It is working for small reports which usually takes less that 60 seconds to process. But jasper throws 500 Internal error for large reports which usually takes 2-3 minutes processing time to laravel. When I run same report on Jasper panel it works but it throws an error (code 500) to Laravel from API Call.
PHP settings :- memory_limit : 512M, post_max_size : 400M, upload_max_filesize : 300M, max_execution_time : 600

$.ajax({
                type: "POST",
                url: base_url+'admin/get-report-details',
                data:   $('form#jsperReports').serialize(), 
                dataType:'json',
                timeout:1200000, 
                beforeSend: function(){ 
                    $('#reportDetailsRow').addClass('hide');
                    var dialog = bootbox.dialog({
                        message: '<p class="text-center">Please wait while we do something...</p>',
                        closeButton: false
                    });
                },
                success:function(data){ 
                    $('.modal').modal('hide');
                    if(!!data && data.success == true){
                            $('#reportDetails').html(data.html);
                            $('#reportDetailsRow').removeClass('hide');
                    }else if (!!data && data.success == false) {
                        showMsgModel("Error",data.msg)
                    }
                }
            });

Laravel Code:

$JASPERSETTINGS= \App\JASPERSETTINGS::find(Input::get('report_name'));
        if(!$JASPERSETTINGS){return response()->json( array('success' => false,'msg'=>"Settings Not Found.") );}
        $c = new Client("http://".env('JSPER_IP')."/jasperserver", env('JSPER_ID'), env('JSPER_PWD'));
        $input_controls = $c->reportService()->getReportInputControls('/'.$JASPERSETTINGS->folder_path);
        $parameter= \App\JASPERPARAMETER::where('jsaper_id','=',$JASPERSETTINGS->id)->where('parameter_dy','!=','')->pluck('parameter_dy_query','jasper_parameter')->toArray();
        foreach($input_controls as $ic) {
            if(array_key_exists($ic->id,$parameter)){
                $sqlQuery=$parameter[$ic->id];
                if(preg_match_all('/{+(.*?)}/', $parameter[$ic->id], $m)) {
                    $matches=array_unique(($m[1]));
                }
                if(count($matches)>0){
                    $rt=0;
                    foreach($matches as $k=>$value){
                        if(strpos($parameter[$ic->id], '{'.$value.'}') !== false){
                            $PVALUE= \App\JASPERPARAMETER::where('jsaper_id','=',$JASPERSETTINGS->id)->where('jasper_parameter','=',$ic->id)->where('parameter_dy','!=','')->first();
                            $par= explode(',',$PVALUE->parameter_dy);
                            if(count($par)>0 && isset($par[$rt]))
                            $sqlQuery = str_replace('{'.$value.'}',"'".Input::get($par[$rt])."'", $sqlQuery);
                            $rt++;
                        }
                    }
                }
                $data=DB::select( DB::raw($sqlQuery));
                $ff=$ic->id;
                $options[$ic->id]= $data[0]->$ff;
            }else{
                $rules[$ic->id] = 'Required';
                $options[$ic->id]=Input::get($ic->id);
            }
        }   
        $validator = Validator::make(Input::get(), $rules);
        if ($validator->fails()) 
        {
            $messages = $validator->messages();
            return response()->json($messages);
        }
        $time= \Carbon\Carbon::now()->format('Y-m-d_His');
        $filename=str_replace(" ","_",$JASPERSETTINGS->file_name).'_'.$time.'.'.Input::get('report_type');
        if($JASPERSETTINGS->dy_file_name!='n'){
            #to Make Dynamic Report Name
            $getType= \App\JASPERPARAMETER::where('jsaper_id','=',$JASPERSETTINGS->id)->where('jasper_parameter','=',$JASPERSETTINGS->dy_file_name)->first();
            $this->QUERY_TYPE= array('1'=>'Input','2'=>'Drop Down','3'=>"Date",'4'=>"Date Time Range");
            if($getType && $getType->jasper_parameter_type==1){
                $filename=str_replace(" ","_",Input::get($JASPERSETTINGS->dy_file_name)).'_'.$time.'.'.Input::get('report_type');
            }else if($getType && $getType->jasper_parameter_type==2){
                $data= DB::select( DB::raw(Input::get('SQL_QUERY'))." LIMIT 1");
                if(count($data)>0 && isset($data[$JASPERSETTINGS->dy_file_name])  && !empty($data[$JASPERSETTINGS->dy_file_name])){
                    $filename=str_replace(" ","_",$data[$JASPERSETTINGS->dy_file_name]).'_'.$time.'.'.Input::get('report_type');
                }
            }
        }
        $report = $c->reportService()->runReport('/'.$JASPERSETTINGS->folder_path, Input::get('report_type'), null, null, $options);
        if(Input::get('report_type')=="html"){
            $returnHTML= view('report/jasper-report-details')->with(compact('report'))->render();
            return response()->json( array('success' => true, 'html'=>$returnHTML) );
        }elseif(Input::get('report_type')=="pdf"){
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Description: File Transfer');
            header('Content-Disposition: attachment; filename='.$filename);
            header('Content-Transfer-Encoding: binary');
            header('Content-Length: ' . strlen($report));
            header('Content-Type: application/pdf');
            echo $report;
        }elseif(Input::get('report_type')=="xls" || Input::get('report_type')=="xlsx"|| Input::get('report_type')=="csv"){
            header('Content-Description: File Transfer');
            header('Content-Disposition: attachment; filename='.$filename);
            header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            header('Content-Transfer-Encoding: binary');
            header('Pragma: public');
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            echo $report;
        }else{
            return response()->json( array('success' => false,'msg'=>"Working For This.") );
        }

Below is server logs

Jasper server log: 2018-02-01 10:06:15,794 ERROR RenderViewExceptionInterceptor,ajp-apr-8009-exec-11:58 - Internal server error occurred. Please contact your system administrator. org.apache.jasper.JasperException: java.lang.IllegalStateException: Cannot forward after response has been committed

at java.lang.Thread.run(Thread.java:748)Caused by: java.lang.IllegalStateException: Cannot forward after response has been committed

2018-02-01 10:06:15,807 ERROR HandlerExecutionChain,ajp-apr-8009-exec-11:173 - HandlerInterceptor.afterCompletion threw exception java.lang.IllegalStateException: Cannot call sendError() after the response has been committed


Tomcat log: 01-Feb-2018 10:06:15.793 SEVERE [ajp-apr-8009-exec-11] org.apache.catalina.core.ApplicationDispatcher.invoke Servlet.service() for servlet jsp threw exception java.lang.IllegalStateException: Cannot forward after response has been committed

01-Feb-2018 10:06:15.836 SEVERE [ajp-apr-8009-exec-11] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [jasperserver] in context with path [/jasperserver] threw exception [java.lang.IllegalStateException: Cannot forward after response has been committed] with root cause


localhost_access_log: [01/Feb/2018:14:48:54 +0000] "GET /jasperserver/rest_v2/reports/reports/MYPROJ/TR_MYPROJ/TR.pdf?interactive=true&onePagePerSheet=false&freshData=true&saveDataSnapshot=false&course_name=%27TR00000017%27%2C%27TR00000046%27 HTTP/1.1" 500 -

Am I missing any configuration or do I need to do any other setting while making API Call to Jasper from Laravel?

Upvotes: 2

Views: 1580

Answers (0)

Related Questions