Java Web服务具有随机ClosedByInterruptException
我听说有一个Java文件通道错误,但我在web服务中遇到了这个错误 我得到以下例外情况:Java Web服务具有随机ClosedByInterruptException,java,oracle,web-services,exception,glassfish,Java,Oracle,Web Services,Exception,Glassfish,我听说有一个Java文件通道错误,但我在web服务中遇到了这个错误 我得到以下例外情况: java.nio.channels.ClosedByInterruptException at java.nio.channels.spi.AbstractInterruptibleChannel.end (AbstractInterruptibleChannel.java:202) at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:4
java.nio.channels.ClosedByInterruptException
at java.nio.channels.spi.AbstractInterruptibleChannel.end
(AbstractInterruptibleChannel.java:202)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:473)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.flushByteBuffer
(TCPNIOTransport.java:1252)
at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0
(TCPNIOAsyncQueueWriter.java:107)
at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:296)
at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:203)
at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.write(AbstractNIOAsyncQueueWriter.java:73)
at org.glassfish.grizzly.nio.transport.TCPNIOTransportFilter.handleWrite(TCPNIOTransportFilter.java:128)
at org.glassfish.grizzly.filterchain.TransportFilter.handleWrite(TransportFilter.java:191)
at org.glassfish.grizzly.filterchain.ExecutorResolver$8.execute(ExecutorResolver.java:111)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:853)
at org.glassfish.grizzly.filterchain.FilterChainContext.write(FilterChainContext.java:822)
at org.glassfish.grizzly.http.io.OutputBuffer.flushBuffer(OutputBuffer.java:1011)
at org.glassfish.grizzly.http.io.OutputBuffer.flushBinaryBuffers(OutputBuffer.java:996)
at org.glassfish.grizzly.http.io.OutputBuffer.flushAllBuffers(OutputBuffer.java:967)
at org.glassfish.grizzly.http.io.OutputBuffer.flush(OutputBuffer.java:732)
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:291)
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:275)
at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:175)
at com.ctc.wstx.io.UTF8Writer.flush(UTF8Writer.java:103)
at com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:225)
at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:261)
at com.sun.xml.ws.util.xml.XMLStreamWriterFilter.flush(XMLStreamWriterFilter.java:71)
at com.sun.xml.ws.streaming.XMLStreamWriterUtil.getOutputStream(XMLStreamWriterUtil.java:103)
at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:392)
有时,我会在日志中看到它。
问题是,当我的web服务应该返回它的值时,这种情况就会发生。我有以下代码:
cs = con.prepareCall (" { call charge_subscriber (?,?,?,?,?,?)} ");
cs.registerOutParameter(4, java.sql.Types.INTEGER);
cs.registerOutParameter(5, java.sql.Types.VARCHAR);
cs.registerOutParameter(6, java.sql.Types.NUMERIC);
cs.setInt(1, anum);
cs.setInt(2, product_id);
cs.setString(3, identifier);
cs.execute();
resultCode = cs.getInt(4);
resultMessage = cs.getString(5);
transNo = cs.getLong(6);
System.out.println("\n ANUM : "+anum+
"\n Product ID : "+product_id+
"\n Identifier : "+identifier+
"\n resultCode : "+resultCode+
"\n resultMessage : "+resultMessage+
"\n transNo : "+transNo);
return new ApiResponse(resultCode,resultMessage,transNo);
} catch(Exception e){
System.out.println("Exception while charging : "+e.getMessage());
}
finally {
if(!con.isClosed())
con.close();
con = null;
if(cs != null)
cs.close();
cs = null;
return new ApiResponse(resultCode,resultMessage,transNo);
}
在异常的正上方,我看到println有正确的数据,有几毫秒的差异,所以过程似乎运行正常
我已经读到线程中断可能导致ClosedByInterruptException
,所以我检查了我的管理控制台(我使用的是Glassfish),它似乎也没问题,我允许200个线程,超时时间为900秒
这个web服务大部分时间都在工作,有时它会这样做。webservice本身正在调用Oracle 11g数据库中的一个过程,我想这可能与数据库中的某个瓶颈有关,但我猜它不会用正确的数据显示println,而且当发生此错误时,该过程会执行它所支持的操作
所以我的问题是,这个错误可能是什么,或者我怎样才能抓住它?我试图捕获它,但没有成功。从stacktrace判断,在编写响应时会发生异常。这表明真正的原因要么是网络问题,要么是客户端没有读取响应
在这两种情况下,最好的做法是允许异常传播,或者捕获异常并放弃处理请求。几乎不可能执行任何允许服务器向客户端发送响应的操作。好的,但如何捕获响应?上述捕获不起作用,它仍然会发生。我的异常问题是它已经在数据库中执行了操作,我想回滚该过程