Reputation: 199
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