Исключение Crystal Reports: достигнуто максимальное ограничение заданий обработки отчетов, настроенное системным администратором

я сталкиваюсь с очень багги вопрос, в ASP.NET приложение после просмотра одного и того же отчета много раз одновременно я получил это исключение:

максимальное ограничение заданий обработки отчетов, настроенное вашей системой администратор был достигнут.

Подождите, я знаю, что есть множество решений, но все они не работают со мной.

  1. ставлю ReportDocument.Close (); ReportDocument.Dispose (); in CrystalReportViewer_Unload событие, и по-прежнему выбрасывать исключение.

    Private Sub CrystalReportViewer1_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles CrystalReportViewer1.Unload reportFile.Close() reportFile.Dispose() GC.Collect() End Sub

  2. я редактирую реестр PrintJobLimit в HKEY_LOCAL_MACHINESOFTWARESAP BusinessObjectsCrystal Reports for .NET Framework 4.0Report Application ServerInprocServer и HKEY_LOCAL_MACHINESOFTWARESAP BusinessObjectsCrystal Reports for .NET Framework 4.0Report Application ServerServer до -1 даже до 9999, и все равно выбросить исключение.

вот фрагмент кода, где я называю мой отчет:

 Table_Infos = New TableLogOnInfos()
                Table_Info = New TableLogOnInfo()
                Con_Info = New ConnectionInfo()

                With Con_Info
                    .ServerName = ConfigurationManager.AppSettings("server_name")
                    .DatabaseName = ConfigurationManager.AppSettings("DB")
                    .UserID = user_name
                    .Password = pass_word
                    .Type = ConnectionInfoType.SQL
                    .IntegratedSecurity = False
                End With

                Table_Info.ConnectionInfo = Con_Info

                If Session("recpt_lang") = "Arabic" Then
                    reportFile.Load(Server.MapPath("/Reports/") & "collectrecpt_new_ar.rpt")
                ElseIf Session("recpt_lang") = "English" Then
                    reportFile.Load(Server.MapPath("/Reports/") & "collectrecpt_new.rpt")
                End If

                For Each mytable In reportFile.Database.Tables

                    mytable.ApplyLogOnInfo(Table_Info)

                Next

                CrystalReportViewer1.ReportSource = reportFile
                CrystalReportViewer1.SelectionFormula = Session("SelectionForumla")
                CrystalReportViewer1 = Nothing

10 ответов


Я бы рекомендовал переместить ваш close / dispose / gc.сбор кода вне этого процесса выгрузки. Другими словами:

  1. загрузить отчет
  2. назначить для просмотра управления
  3. показать отчет в Viewer Control
  4. закрыть контроль просмотра и выгрузить (полностью)
  5. затем закройте/dispose / gc.соберите вне любого кода управления viewer

Я предполагаю, что элемент управления viewer не полностью закрыт, когда отчет находится очищенный.

Кристалл очень интенсивный процесс памяти и очень привередливы.


в конце концов, вы должны избавиться от экземпляра отчета. Если вы удалите отчет после его отображения, вы больше никогда не увидите ошибку "достигнут максимальный предел заданий обработки отчетов, настроенный системным администратором".

  Dim report1 As rptBill = clsBill.GetReport(billNumber)

  rpt.Print()

  'Cleanup the report after that!
  rpt.Close()
  rpt.Dispose()

приветствия я слишком поздно, чтобы ответить на него, все ответы работают, и я видел, но в случае, если вы все еще сталкиваетесь с той же проблемой и ошибкой, пожалуйста, один раз зайдите во временную папку в каталоге "windows" и удалите все экземпляры crystal report. Я говорю это, потому что все вышеперечисленные опции будут работать, но вы все еще находитесь в максимальном досягаемости, поэтому прежде всего удалите все экземпляры, а затем примените все вышеизложенное предложение. спасибо


Crystal Report документ реализует IDisposable интерфейс. Поэтому все, что вам нужно сделать, это заключить экземпляр отчета в using заявление. Он будет автоматически закрыт и утилизирован после утверждение. Вы можете написать что-то вроде этого:

using(var report = GetInvoiceReport())
{
     // your logic here
}

или (зависит от контекста):

using(var report = new ReportDocument())
{
     // your logic here
}

Я работал на локальном сервере отчетов. Я разместил свое веб-приложение на другом ПК. Когда я получил такую ошибку, я просто сделал команду iisreset и теперь работает нормально.

попробуйте это, это может помочь вам.


убедитесь, что вы используете PUSH-модель для отображения отчетов. Затем вам нужно внести одно изменение в реестр вашего сервера: следуйте по пути:

"HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer" 

и вы увидите элемент "PrintJobLimit", и вы увидите, что его значение по умолчанию равно 75. это означает, что сервер может обрабатывать только 75 докладов одновременно. Не беспокойтесь об этом и просто измените значение на -1


вы должны Dispose ваш экземпляр отчета в конце концов. Если ты ... --1--> отчет после его показа вы никогда не увидите ошибку:

достигнут максимальный предел заданий обработки отчетов, настроенный системным администратором

код:

Dim report1 As rptBill = clsBill.GetReport(billNumber)

rpt.Print()

'Cleanup the report after that!
rpt.Close()
rpt.Dispose()

в моем случае в отчете было 4 вложенных отчета...

для меня было решено изменить значение "PrintJobLimit" с 75 на 500 в следующих путях Regedit:

  • \HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\сервер приложений отчетов\InprocServer

  • \HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\SAP BusinessObjects\Crystal отчеты для .NET Framework 4.0\отчет \Сервер Приложений-Сервер


убедитесь, что пользователь IIS имеет достаточное разрешение на удаление файлов, присутствующих в "c:/windows/temp-папка.

Я сталкиваюсь с той же проблемой, как только я предоставляю разрешение на запись в эту папку, то она решила мою проблему.Также убедитесь, что dispose этот объект после создания файла


Я закончил использование GC.WaitForPendingFinalizers в дополнение к GC.Соберите, закройте и утилизируйте. Я считаю, что моя веб-страница, возможно, выгружала и останавливала обработку потоков преждевременно, прежде чем мусор был правильно обработан (действительно?)

Это на сервере 2012, SQL 2012, CR 13.0.2000.0

вот мой код:

#Region "Cleanup"

Private Sub crCleanup(Optional blnForce As Boolean = False)
    Try
        ' Crystal(code Is Not managed, i.e.it) 's COM interop => you have to manually
        ' release any objects instantiated. Make sure you set the ref to nothing and
        ' also call the dispose method if it has one.

        ' under some conditions, we don't want to destroy the ReportDocument (e.g. report page-to-page navigation)
        If blnForce OrElse Me.blnPageHasFatalError OrElse (Not Me.CrystalUseCache) Then ' do not release when using cache! (unless forced)
            If Not crReportDocument Is Nothing Then Me.crReportDocument.Close()
            If Not crReportDocument Is Nothing Then Me.crReportDocument.Dispose()
            If Not thisWebAppUser Is Nothing Then Me.thisWebAppUser.Dispose()
            Me.thisWebAppUser.ClearReportCache() ' we are using HttpContext.Current.Cache.Item instead of sessions to save CR document
        End If

        ' the rest of the items, we'll always want to clean up
        If Not crParameterFieldDefinitions Is Nothing Then crParameterFieldDefinitions.Dispose()
        If Not crParameterFieldDefinition Is Nothing Then crParameterFieldDefinition.Dispose()

        crParameterFields = Nothing
        crParameterField = Nothing
        crParameterFieldName = Nothing
        crParameterValues = Nothing
        crParameterDiscreteValue = Nothing
        crParameterDefaultValue = Nothing
        crParameterRangeValue = Nothing

        '
        If Not crSections Is Nothing Then crSections.Dispose()
        If Not crSection Is Nothing Then crSection.Dispose()
        If Not crReportObjects Is Nothing Then crReportObjects.Dispose()
        If Not crReportObject Is Nothing Then crReportObject.Dispose()
        If Not crSubreportObject Is Nothing Then crSubreportObject.Dispose()
        If Not crDatabase Is Nothing Then crDatabase.Dispose()
        If Not crTables Is Nothing Then crTables.Dispose()
        If Not crTable Is Nothing Then crTable.Dispose()
        crLogOnInfo = Nothing
        crConnInfo = Nothing

        crDiskFileDestinationOptions = Nothing
        ConnParam = Nothing

        If Not subRepDoc Is Nothing Then subRepDoc.Dispose()
    Catch ex As Exception
        Me.thisWebAppUser.SendSysAdminMessage("Failed CR cleanup", ex.ToString)
    End Try


    ' yes, use of the GC.Collect (and even more the GC.WaitForPendingFinalizers) is highly controversial
    ' 
    ' the reality is that rendering crystal reports is rather slow compared to most web operations
    ' so it is expected that waiting for GC will have relatively little performance impact
    ' and will in fact, help tremendously with memory management.
    '
    ' try setting these values to 1 and confirm for yourself by instantiating multiple crDocuments in different browsers if you don't believe it:
    '
    '   HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\InprocServer 
    '   HKEY_LOCAL_MACHINE\SOFTWARE\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Report Application Server\Server 
    '
    ' or google this error: The maximum report processing jobs limit configured by your system administrator has been reached
    ' 
    ' I believe the problem is that on very fast servers, the page unloads and stops processing code to properly cleanup the Crystal Report objects
    ' 
    ' This is done in 3 places: 
    '   Report Viewer (Page_Unload and CrystalReportViewer1_Unload) rendering a report will of course always using a processing job
    '   Report Parameter Selector (Page_Unload) loading a crDocument without rendering a report still counts towards CR processing job limit.
    '   Custom Control crReportParameterSelectionTable (Public Overrides Sub dispose())

    GC.Collect()
    GC.WaitForPendingFinalizers()

End Sub
'***********************************************************************************************************************************
' 
'***********************************************************************************************************************************
Private Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Unload
    'If Me.IsCallback Then Exit Sub ' the menutree causes callbacks, but we are not interested

    crCleanup()
    ' response object not available here, so cannot redirect (such as in the case of XLS opeing in a separate window)

    ' if for some crazy reason there is STILL a crReportDocument, set it to nothing
    '        If Not crReportDocument Is Nothing Then Me.crReportDocument = Nothing
    '        Me.CrystalReportViewer1 = Nothing
End Sub

Private Sub CrystalReportViewer1_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles CrystalReportViewer1.Unload
    'If Me.IsCallback Then Exit Sub ' the menutree causes callbacks, but we are not interested

    crCleanup()
End Sub

Конец Области