我正在使用Larevel(PHP Framework)并集成了Jasper API用于报告。它适用于小型报告,通常需要不到60秒的时间来处理。但是jasper会为大型报告抛出500内部错误,这通常需要2-3分钟的处理时间才能完成。当我在Jasper面板上运行相同的报告时,它可以工作,但它会从API调用向Laravel抛出错误(代码500)。
PHP设置: - 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代码:
$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.") );
}
以下是服务器日志
Jasper服务器日志:
2018-02-01 10:06:15,794 ERROR RenderViewExceptionInterceptor,ajp-apr-8009-exec-11:58 - 发生内部服务器错误。请联系您的系统管理员。
org.apache.jasper.JasperException:java.lang.IllegalStateException:响应提交后无法转发
at java.lang.Thread.run(Thread.java:748)引起:java.lang.IllegalStateException:响应提交后无法转发
2018-02-01 10:06:15,807 ERROR HandlerExecutionChain,ajp-apr-8009-exec-11:173 - HandlerInterceptor.afterCompletion抛出异常 java.lang.IllegalStateException:在提交响应后无法调用sendError()
Tomcat日志:
201-Feb-2018 10:06:15.793严重[ajp-apr-8009-exec-11] org.apache.catalina.core.ApplicationDispatcher.invoke Servlet.service()for servlet jsp抛出异常
java.lang.IllegalStateException:在提交响应后无法转发
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]抛出异常[java.lang.IllegalStateException:在提交响应后无法转发]具有根本原因
的 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 -
我是否缺少任何配置,或者在从Laravel对Jasper进行API调用时是否需要进行任何其他设置?