Reputation: 667
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)
Upvotes: 0
Views: 257
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