Jasper API调用在Laravel

时间:2018-02-01 06:55:50

标签: laravel laravel-5.3 jasperserver

我正在使用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调用时是否需要进行任何其他设置?

0 个答案:

没有答案