nag
nag

Reputation: 667

Error 504 white running invokeAll in executor service

I am executing the bulk database operation around 500-1000(each one processed around 30 milliseconds) so i chosen for executor service.

when i have processed 100 records its executed properly. when i have processed 500 records, i have received Error 504 but records are processed background because of i am not able to display alert message.

could you please help how to resolve this?

 ThreadPoolExecutor executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
 List<Employee> futureList = new ArrayList<Employee>();

for(int i = 0; i < empList.length; i++){
    String empNo = empList\[i\].split("\\|")\[0\];
    EmployeeSave employeeSave = new EmployeeSave(empNo);//Callable Class
    futureList.add(employeeSave);   

}

List<Future<Boolean>> resultList = executorService.invokeAll(futureList);  
List<Boolean> result= new ArrayList<>();
for(Future<Boolean> future : resultList)
 {
    try
    {
        result.add(future.get());
    }
        catch (InterruptedException | ExecutionException e)
    {
     e.printStackTrace();
    }finally{
         //shut down the executor service now
          executorService.shutdown();
         try {
            if (!executorService.awaitTermination(800, TimeUnit.MILLISECONDS)) {
                   executorService.shutdownNow();
            } 
            } catch (InterruptedException e) {
                   executorService.shutdownNow();
            }
       }
}

java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:118)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
    at weblogic.servlet.internal.ChunkOutput.writeChunkTransfer(ChunkOutput.java:568)
    at weblogic.servlet.internal.ChunkOutput.writeChunks(ChunkOutput.java:539)
    at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java:427)
    at weblogic.servlet.internal.CharsetChunkOutput.flush(CharsetChunkOutput.java:298)
    at weblogic.servlet.internal.ChunkOutput$2.checkForFlush(ChunkOutput.java:648)
    at weblogic.servlet.internal.CharsetChunkOutput.print(CharsetChunkOutput.java:280)
    at weblogic.servlet.internal.ChunkOutputWrapper.print(ChunkOutputWrapper.java:171)
    at weblogic.servlet.jsp.JspWriterImpl.write(JspWriterImpl.java:259)
    at com.crimsonlogic.trade.common.taglib.TablePrintTag.doEndTag(TablePrintTag.java:868)
    at jsp_servlet._aci._highway._tile.__arrivalcertmesgsearchsummaryview._jspService(__arrivalcertmesgsearchsummaryview.java:611)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:184)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:526)
    at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:447)
    at weblogic.servlet.jsp.PageContextImpl.include(PageContextImpl.java:163)
    at jsp_servlet._aci._highway._screen.__searcharrivalcertmesgscreen._jspService(__searcharrivalcertmesgscreen.java:195)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:184)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:526)
    at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:447)
    at weblogic.servlet.jsp.PageContextImpl.include(PageContextImpl.java:163)
    at jsp_servlet._common._ifx.__popup._jspService(__popup.java:132)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:184)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:526)
    at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:447)
    at jsp_servlet._pfk.__pfkmain._jspService(__pfkmain.java:532)
    at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:184)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:526)
    at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:447)
    at com.sns.pfk.servlet.PfkMainServlet.doGet(PfkMainServlet.java:234)
    at com.sns.pfk.servlet.PfkMainServlet.doPost(PfkMainServlet.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:184)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:526)
    at weblogic.servlet.internal.RequestDispatcherImpl.include(RequestDispatcherImpl.java:447)
    at com.crimsonlogic.trade.servlet.ITABaseServlet.dispatch(ITABaseServlet.java:569)
    at com.crimsonlogic.trade.common.ifx.servlet.ControllerServlet.doPost(ControllerServlet.java:162)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at com.sns.ana.ui.servlet.AuthorisationBaseServlet.service(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:184)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:526)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:253)
    at com.crimsonlogic.trade.common.ifx.servlet.ControllerServlet.doForward(ControllerServlet.java:241)
    at com.crimsonlogic.trade.common.ifx.servlet.ControllerServlet.doPost(ControllerServlet.java:131)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at com.sns.ana.ui.servlet.AuthorisationBaseServlet.service(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at com.crimsonlogic.trade.common.ifx.filter.NAXSSFilter.doFilter(NAXSSFilter.java:66)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at com.sns.pfk.filter.PFKCSRFLoadSaltFilter.doFilter(PFKCSRFLoadSaltFilter.java:51)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3730)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3696)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2273)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1490)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
java.net.SocketException: Connection reset
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:118)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
    at weblogic.servlet.internal.ChunkOutput.writeChunkTransfer(ChunkOutput.java:568)
    at weblogic.servlet.internal.ChunkOutput.writeChunks(ChunkOutput.java:539)
    at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java:427)
    at weblogic.servlet.internal.CharsetChunkOutput.flush(CharsetChunkOutput.java:298)
    at weblogic.servlet.internal.ChunkOutput$2.checkForFlush(ChunkOutput.java:648)
    at weblogic.servlet.internal.CharsetChunkOutput.print(CharsetChunkOutput.java:280)
    at weblogic.servlet.internal.ChunkOutputWrapper.print(ChunkOutputWrapper.java:171)
    at weblogic.servlet.jsp.JspWriterImpl.write(JspWriterImpl.java:259)

enter image description here

Upvotes: 0

Views: 257

Answers (1)

M. Prokhorov
M. Prokhorov

Reputation: 3993

From the javadoc of ExecutorService class:

Executes the given tasks, returning a list of Futures holding their status and results when all complete.

This means that if you have a list large enough, execution of all the tasks may indeed time-out the waiting external system. You can either make your save faster, or require more generous timeouts.

Another possible solution: actually do an async computation, and do not wait for all tasks to finish. Have other means of verifying whether operations was successful.

Example code that would convert this to a fully asynchronous code:

// This now has to be external to processing code, and possibly shared as well.
ExecutorService service = Executors.newFixedThreadPool(5);

// and the processing code goes like this:
List<CompletableFuture<Boolean>> futures = new ArrayList<>();
for (EmployeeSave save : empList) {
  futures.add(CompletableFuture.supplyAsync(save::call, service));
}

// If you do actually need a notification, then you need to store identify the running request somehow. For example, using Id or parameters
String processId = generateSaveProcessId();
runningSaveProcesses.store(
    processId,
    CompletableFuture.allOf(
        futures.toArray(new CompletableFuture[0]);
    )
);
// return the process identifier with "Ack" response
return <...Response( processId )...>

Upvotes: 0

Related Questions