SSRS Job Traveler Mass Print Timeout

I am trying to setup a Job Stream to Mass print my Job Travelers every morning. However I come in to them erroring out. When I peel back to printing 30 at a time they run successfully under 5 minutes. I got the Timeout settings from Epicor Support and made the appropriate changes and am still seeing this error if I print more than 30 at a time. a Full print is probably around 200 Job Travelers. Below is the full error I am seeing, has anyone else experienced this?

Program Ice.Services.Lib.RunTask raised an unexpected exception with the following message: RunTask: Client found response content type of ‘text/html; charset=utf-8’, but expected ‘text/xml’.
The request failed with the error message:

Thread was being aborted. body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px} b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px} H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red } H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon } pre {font-family:"Lucida Console";font-size: .9em} .marker {font-weight: bold; color: black;text-decoration: none;} .version {color: gray;} .error {margin-bottom: 10px;} .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
<body bgcolor="white">

        <span><H1>Server Error in '/ReportServer' Application.<hr width=100% size=1 color=silver></H1>

        <h2> <i>Thread was being aborted.</i> </h2></span>

        <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">

        <b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

        <br><br>

        <b> Exception Details: </b>System.Threading.ThreadAbortException: Thread was being aborted.<br><br>

        <b>Source Error:</b> <br><br>

        <table width=100% bgcolor="#ffffcc">
           <tr>
              <td>
                  <code>

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

              </td>
           </tr>
        </table>

        <br>

        <b>Stack Trace:</b> <br><br>

        <table width=100% bgcolor="#ffffcc">
           <tr>
              <td>
                  <code><pre>

[ThreadAbortException: Thread was being aborted.]
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +312
System.Web.ApplicationStepManager.ResumeSteps(Exception error) +762
System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +256
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +444

              </td>
           </tr>
        </table>

        <br>

        <hr width=100% size=1 color=silver>

        <b>Version Information:</b> Microsoft .NET Framework Version:2.0.50727.8009; ASP.NET Version:2.0.50727.8015

        </font>

</body>
--. Stack Trace: at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) at Ice.Core.SsrsReportService.ReportExecutionService.Render(String Format, String DeviceInfo, String& Extension, String& MimeType, String& Encoding, Warning[]& Warnings, String[]& StreamIds) in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\Web References\SsrsReportService\Reference.cs:line 633 at Ice.Core.SsrsReporting.SsrsRendererBase.Render(SsrsRenderInformationBase renderInformation) in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\SsrsReporting\SsrsRendererBase.cs:line 142 at Ice.Core.SsrsReporting.SsrsRendererBase.<>c__DisplayClass12_0.b__0() in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\SsrsReporting\SsrsRendererBase.cs:line 87 at Epicor.Hosting.Trace.TraceHandle.TimeAction(Action actionToTime) in C:\_Releases\ICE\3.1.600.11\Source\Framework\Epicor.System\Hosting\Trace\TraceHandle.cs:line 92 at Epicor.Hosting.Trace.TraceHandle.AddTimedIfEnabled(String traceFlag, Action actionToTime, Func`2 messageBuilder) in C:\_Releases\ICE\3.1.600.11\Source\Framework\Epicor.System\Hosting\Trace\TraceHandle.cs:line 39 at Ice.Core.SsrsReporting.SsrsRendererBase.TraceReportRendered(String printProgram, String ssrsRenderFormat, Func`1 timedAction) in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\SsrsReporting\SsrsRendererBase.cs:line 95 at Ice.Core.SsrsReporting.ReportProcessorBase.RenderReportForPreviewOrGenerate(RenderedSsrsReport renderedReport) in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\SsrsReporting\ReportProcessorBase.cs:line 256 at Ice.Core.SsrsReporting.ReportProcessorBase.ProcessReportPart(String reportLocation) in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\SsrsReporting\ReportProcessorBase.cs:line 150 at Ice.Core.SsrsReporting.StandardReportProcessor.ProcessReportParts() in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\SsrsReporting\StandardReportProcessor.cs:line 31 at Ice.Core.RoutingAndBreaking.ReportPersister.Persist(ReportInstanceInformation reportInstance, Func`2 reportsRenderer, Action`1 fillSysRptLstRow, Action`2 processReport) in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\RoutingAndBreaking\ReportPersister.cs:line 50 at Ice.Core.RptBase.ReportSsrsDatabaseBuilder.RenderUnroutedSsrsReport() in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\RptBase\ReportSsrsDatabaseBuilder.cs:line 301 at Ice.Core.RptBase.ReportSsrsDatabaseBuilder.RunSsrsReportIfEnabled() in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\RptBase\ReportSsrsDatabaseBuilder.cs:line 226 at Ice.Core.RptBase.ReportSsrsDatabaseBuilder.ProcessReportWithDataInPlace(Func`2 executeCommand, Func`2 executeReader, SqlObjectsCreated sqlObjectsCreated) in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\RptBase\ReportSsrsDatabaseBuilder.cs:line 109 at Ice.Core.RptBase.ReportDatabaseBuilder.XMLClose() in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\RptBase\ReportDatabaseBuilder.cs:line 76 at Ice.Core.RptTaskBase`1.XMLClose() in C:\_Releases\ICE\3.1.600.11\Source\Server\Internal\Lib\TaskLib\RptBase\RptTaskBase.cs:line 158 at Erp.Internal.JC.JobTrav.RunProcess(Int64 instanceTaskNum, String outputFileName) in c:\_Releases\ERP\RL10.1.600.0\Source\Server\Internal\JC\JobTrav\JobTrav.cs:line 689 at Ice.Hosting.TaskCaller.InnerExecuteTask(IceDataContext newContext) in C:\_Releases\ICE\3.1.600.11\Source\Framework\Epicor.Ice\Hosting\TaskCaller\TaskCaller.cs:line 93 at Ice.Hosting.TaskCaller.ExecuteTask() in C:\_Releases\ICE\3.1.600.11\Source\Framework\Epicor.Ice\Hosting\TaskCaller\TaskCaller.cs:line 54 at Ice.Lib.RunTask.BpmFriendlyTaskLauncher.Run(String sessionIdPrefix, IceContext db, Action taskRunner) in c:\_Releases\ICE\3.1.600.0\Source\Server\Services\Lib\RunTask\BpmFriendlyTaskLauncher.cs:line 63 at Ice.Services.Lib.RunTaskSvc.InnerRunTask(Int64 ipTaskNum, Boolean suppressTransaction) in c:\_Releases\ICE\3.1.600.0\Source\Server\Services\Lib\RunTask\RunTask.cs:line 535 at Ice.Services.Lib.RunTaskSvc.InnerRunTask(Int64 ipTaskNum, Boolean suppressTransaction) in c:\_Releases\ICE\3.1.600.0\Source\Server\Services\Lib\RunTask\RunTask.cs:line 535 at Ice.Services.Lib.RunTaskSvcFacade.RunTask(Int64 ipTaskNum) in c:\_Releases\ICE\3.1.600.0\Source\Server\Services\Lib\RunTask\RunTaskSvcFacade.cs:line 87 at SyncInvokeRunTask(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at Epicor.Hosting.OperationBoundInvoker.InnerInvoke(Object instance, Func`2 func) in C:\_Releases\ICE\3.1.600.11\Source\Framework\Epicor.System\Hosting\OperationBoundInvoker.cs:line 59 at Epicor.Hosting.OperationBoundInvoker.Invoke(Object instance, Func`2 func) in C:\_Releases\ICE\3.1.600.11\Source\Framework\Epicor.System\Hosting\OperationBoundInvoker.cs:line 28 at Epicor.Hosting.Wcf.EpiOperationInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) in C:\_Releases\ICE\3.1.600.11\Source\Framework\Epicor.System\Hosting\Wcf\EpiOperationInvoker.cs:line 23 at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) at System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(RequestContext request, Boolean cleanThread, OperationContext currentOperationContext) at System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext) at System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult result) at System.ServiceModel.Dispatcher.ChannelHandler.OnAsyncReceiveComplete(IAsyncResult result) at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result) at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously) at System.ServiceModel.Channels.TransportDuplexSessionChannel.TryReceiveAsyncResult.OnReceive(IAsyncResult result) at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result) at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously) at System.ServiceModel.Channels.SynchronizedMessageSource.ReceiveAsyncResult.OnReceiveComplete(Object state) at System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state) at System.Runtime.Fx.AsyncThunk.UnhandledExceptionFrame(IAsyncResult result) at System.Net.LazyAsyncResult.Complete(IntPtr userToken) at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken) at System.Net.Security.NegotiateStream.ProcessFrameBody(Int32 readBytes, Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest) at System.Net.Security.NegotiateStream.ReadCallback(AsyncProtocolRequest asyncRequest) at System.Net.AsyncProtocolRequest.CompleteRequest(Int32 result) at System.Net.FixedSizeReader.CheckCompletionBeforeNextRead(Int32 bytes) at System.Net.FixedSizeReader.ReadCallback(IAsyncResult transportResult) at System.Runtime.AsyncResult.Complete(Boolean completedSynchronously) at System.ServiceModel.Channels.ConnectionStream.IOAsyncResult.OnAsyncIOComplete(Object state) at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted(SocketAsyncEventArgs e) at System.Net.Sockets.SocketAsyncEventArgs.FinishOperationSuccess(SocketError socketError, Int32 bytesTransferred, SocketFlags flags) at System.Net.Sockets.SocketAsyncEventArgs.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

Just an FYI…
I remembered the thread below while I was reading your post:
Similar?

this post is a bit old, but, based on some cases I’ve been seeing with the exact same error message presented and what I saw in the Report Server log, adjusting the httpRuntime executionTimeout in the ReportServer’s web.config file may need to be increased. I made this one adjustment to the web.config, and it completed.

If you have a long running report with the exact same error message above, you may wish to make this adjustment and try to execute the report again.

~REPORT SERVER WEB.CONFIG:

  1. On your SQL server, navigate to your ReportServer folder. For example, c:\Program Files\Microsoft SQL Server\MSRS13\Reporting Services\ReportServer.
  2. Create a backup of your existing web.config file.
  3. Open your existing web.config file in a text editor.
  4. Search for “httpRuntime executionTimeout” without quotes.
  5. Change the value between the double quotes to 90000. For example,
    <httpRuntime executionTimeout="90000" requestValidationMode="2.0" />
  6. Save your changes and close the text editor.
  7. Restart your Reporting Services service in Windows services.

The default is
<httpRuntime executionTimeout="9000" />

Those of you doing the math, the 90,000 second timeout works out to 25 hours, which is, I admit, a long time and can’t imagine it would ever be common for a report to take that long. The report I was working with took 7.5 hours to process after the Epicor ERP bits were completed. Keep in mind that timeouts are very good and you do want processes to time out at a certain point if they haven’t completed yet.

NOTE: when changing a timeout, make sure to adjust it to a value that is unusual, and not used elsewhere to make it easier to determine which setting is causing a particular timeout in the future. If everything is set to timeout at 60 minutes, which one of the 9084 IIS/SQL/ASP.NET related timeouts is it?!

@joegollakner did you ever resolve? We upgraded from 10.1.500 to 10.2.300 - same Issue only during Multi-Job Select, do we see some ridiculous exeuction times.

It might be the LEFT JOINS… What does one do hmm…

Can someone like @jgiese.wci or @ERPSysAdmin run go to Job Traveler Print and in Filter Select 30 jobs, just to see if it’s me or a common problem. Please! Pretty Please… If not then Ill just ping @Banderson and @Mark_Wonsil maybe even @ckrusen

1 Like

No problem here but these jobs don’t have very many material or operation lines on them.

I think so far I got it down to Epicor basically LEFT JOINING on JobMtl with:

 LEFT OUTER JOIN JobMtl_GUID T5 ON  T1.[Company] = T5.[Company] AND T1.[JobNum] = T5.[JobNum] 

If you have 100 Materials and 20 Operations that Means, 2000 rows are duplicated, because its wide open and not tied to RelatedOperation. Furthermore…

ResourceTimeUsed doubles all that so 2000 x 2 = 4000 because It shows WhatIf 0 and 1

LEFT OUTER JOIN ResourceTimeUsed_GUID T11 ON  T10.[Company] = T11.[Company] AND T10.[JobNum] = T11.[JobNum] AND T10.[AssemblySeq] = T11.[AssemblySeq] AND T10.[OprSeq] = T11.[OprSeq] AND T10.[OpDtlSeq] = T11.[OpDtlSeq]

Now if you have 8000 rows Per Job and you pick 10 Jobs that is 80000


So would I miss something if I modified the base and threw in a Extra JOIN on JobMtl to go to also consider RelatedOperation.

This is what the Query ends-up looking like:

SELECT count(*) 
FROM JobHead_9AF538DA5C204CB789B8484DBD896931 T1 
          LEFT OUTER JOIN JobAsmbl_9AF538DA5C204CB789B8484DBD896931 T2  ON T1.Company = T2.Company AND T1.JobNum = T2.JobNum 
          LEFT OUTER JOIN JobProd_9AF538DA5C204CB789B8484DBD896931 T3 ON  T1.[Company] = T3.[Company] AND T1.[JobNum] = T3.[JobNum] 
          LEFT OUTER JOIN OrderRel_9AF538DA5C204CB789B8484DBD896931 T4 ON  T3.[Company] = T4.[Company] AND T3.[OrderNum] = T4.[OrderNum] AND T3.[OrderLine] = T4.[OrderLine] AND T3.[OrderRelNum] = T4.[OrderRelNum] 
          LEFT OUTER JOIN JobMtl_9AF538DA5C204CB789B8484DBD896931 T5 ON  T1.[Company] = T5.[Company] AND T1.[JobNum] = T5.[JobNum] 
          LEFT OUTER JOIN Part_9AF538DA5C204CB789B8484DBD896931 T6 ON  T5.[Company] = T6.[Company] AND T5.[smSourcePartNum_c] = T6.[PartNum] 
          LEFT OUTER JOIN TTJobPartMtl_9AF538DA5C204CB789B8484DBD896931 T7 ON  T5.[Company] = T7.[Company] AND T5.[JobNum] = T7.[JobNum] AND T5.[MtlSeq] = T7.[MtlSeq] 
          LEFT OUTER JOIN SubAsmbl_9AF538DA5C204CB789B8484DBD896931 T8 ON  T2.[Company] = T8.[Company] AND T2.[JobNum] = T8.[JobNum] AND T2.[AssemblySeq] = T8.[Parent] 
/* x10 */ LEFT OUTER JOIN JobOper_9AF538DA5C204CB789B8484DBD896931 T9 ON  T2.[Company] = T9.[Company] AND T2.[JobNum] = T9.[JobNum] AND T2.[AssemblySeq] = T9.[AssemblySeq]
          LEFT OUTER JOIN JobOpDtl_9AF538DA5C204CB789B8484DBD896931 T10 ON  T9.[Company] = T10.[Company] AND T9.[JobNum] = T10.[JobNum] AND T9.[AssemblySeq] = T10.[AssemblySeq] AND T9.[OprSeq] = T10.[OprSeq] 
/* x2  */ LEFT OUTER JOIN ResourceTimeUsed_9AF538DA5C204CB789B8484DBD896931 T11 ON  T10.[Company] = T11.[Company] AND T10.[JobNum] = T11.[JobNum] AND T10.[AssemblySeq] = T11.[AssemblySeq] AND T10.[OprSeq] = T11.[OprSeq] AND T10.[OpDtlSeq] = T11.[OpDtlSeq]

If I limit the JobMtl to JobOper by considering RelatedOperation then it goes smooth and doesnt query JobMtl over and over and over again for each Operation. (duplicating it 175x).

But I dont think I can do that, Epicor allows Operation 0, so it’ll cause gaps in Job Trav…

It looks like its just a Mess in their RDD and .Internal. DLL.

1 Like

Basically this is the Output for only 1 OPERATION, Let alone 20 or 50…

Lets Limit WhatIf to 1 or 0 (pick one or the other)

Let’s go away from SSRS Let’s go to Database and run this scenario


1720 :o

Now lets add a join on RelatedOperation


172 - much better.


Any Thoughts on adding the RelatedOperation join to JobMtl in RDD? (Anything im missing from a business perspective, will I lose out on some Mtls) ?

Is there ever a scenario you wouldn’t have a RelatedOperation?

1 Like

We don’t even print out job travelers for most of our jobs, a single job pukes for us when it get’s big.

Well I guess we do have RelatedOperation 0’s

Not sure what my other options are to seperate JobMtl into like a CTE on RDD or something, so it stops taking 2hrs lol, the RDD is so unflexible - I cant even add JobMtl 2x and say this one is joined by RelatedOperation and this one is joined by RelatedOperaton = 0 and then do a UNION in RDL…

argh.

what would be the downside of preventing users from leaving related operations at zero? That alone should help.

1 Like

Agreed, Epicor does state that if 0 is used, it’s related to the first operation anyways, 10… So maybe even put in a BPM that defaults 0 to 10.

1 Like

that’s where my head is at…not to mention it fundamentally better to issue/backflush whatever where you actually USE the material anyhow.

If you have materials not related (or related to 0) I don’t believe they will backflush. We force everything to be related, not programmatically, but by process definition.

Is the issue with the DLL generating the data or with SSRS rendering the data?

If it’s in the rendering you can change the SQL Query to be anything that you want as long as the fields on the report are included in the Dataset. That means you can use CTE’s or subqueries in the dataset CommandText.

Issue is in their RDD I assume for now, I’ll fix the JOINs and do JobOper -> JobMtl and not JobHead -> JobMtl which becomes a LEFT JOIN and quadruple-monster-sizes the row count

I should prob join from JobOper and by Company, JobNum, AssemblySeq and RelatedOperation

Ill modify the RDD and see where that takes me :slight_smile:

Is there any reason you couldn’t add the table directly in the dataset query within the report?

Its an Epicor RDD, typically most of the data is gathered in their Internal .DLL – Not sure I have much flexibility on actual DataSet, unless I go make this a BAQ Report. Unless you meant modify their RDD and make my own, which I am going to do…

IF I CAN Thinking about it gives me a heavy sigh…

Because you can’t in RDD JOIN a Parent Table 2x… So JobOper is already used by JobOpDtl so I need to piggy back of JobOpDtl -> JobMtl and I bet you JobOpDtl doesn’t have the Keys… so I’ll end up restructuring it all:

JobOper -> JobMtl -> JobOpDtl, what could possibly go wrong :smiley:

The way I understand it Epicor executes Internal Lib and RDD and then writes to your SSRS Database:

  1. SomeTable_GUID

Your RDL just queries the SSRS Database and those _GUID Tables… but if the Pre-Processing from Epicor->TaskAgent to SSRS uses RDD and is slow as snails it won’t make it faster on the SSRS/RDL end, I have to add it to the RDD as well I assume. Unless they changed something since 10.1.400 :slight_smile:

Of course ill add it to the RDL. Is that what you perceived how it works as well?