[
https://issues.apache.org/jira/browse/AXIS-2935?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Hazem Kunhamarakam Mammu updated AXIS-2935:
-------------------------------------------
Description:
The following exception is thrown when setting client handlers in a Call object
simultaneously from multiple threads. All these call objects are created from a
single Service object.
{code:java}
org.apache.axis.ConfigurationException: java.io.IOException: Stream
closedorg.apache.axis.ConfigurationException: java.io.IOException: Stream closed
java.io.IOException: Stream closed at
java.util.zip.InflaterInputStream.ensureOpen(InflaterInputStream.java:67) at
java.util.zip.InflaterInputStream.read(InflaterInputStream.java:121) at
java.io.FilterInputStream.read(FilterInputStream.java:83) at
org.apache.xerces.impl.XMLEntityManager$RewindableInputStream.readAndBuffer(Unknown
Source) at
org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) at
org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at
org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at
org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at
org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at
org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at
org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) at
org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:369) at
org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:388) at
org.apache.axis.configuration.FileProvider.configureEngine(FileProvider.java:179)
at
org.apache.axis.AxisEngine.init(AxisEngine.java:172) at
org.apache.axis.AxisEngine.<init>(AxisEngine.java:156) at
org.apache.axis.client.AxisClient.<init>(AxisClient.java:52) at
org.apache.axis.client.Service.getAxisClient(Service.java:104) at
org.apache.axis.client.Call.setSOAPService(Call.java:2910) at
org.apache.axis.client.Call.setClientHandlers(Call.java:2924) at
com.fisc.common.axis.TempFileProviderTest.lambda$0(TempFileProviderTest.java:28)
at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at
java.util.concurrent.FutureTask.run(FutureTask.java:266) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at
java.lang.Thread.run(Thread.java:748)
{code}
How to recreate?
{code:java}
public static void main( String[] args) throws ServiceException
{
ExecutorService executorService = Executors.newCachedThreadPool();
Service service = new Service();
service.setMaintainSession( true);
for (int i = 0; i < 50; i++)
{
executorService.submit( () -> {
Call call;
try
{
call = (Call) service.createCall();
call.setClientHandlers( new SomeClientRequestHandler(),
new AnotherClientResponseHandler());
}
catch (ServiceException e)
{
throw new RuntimeException( e);
}
}); }
}
{code}
Reason:
org.apache.axis.configuration.FileProvider.configureEngine(AxisEngine) uses
getInputStream() and setInputStream() methods to load the client config wsdd.
These getter and setter methods read or modify the 'myInputStream' class member
variable and is not thread-safe
Fix:
Use a local InputStream method local variable to load the client config file.
The stream is loaded and consumed in this method, so a local variable is
appropriate here. Please find attached the unified diff file with the proposed
fix.
was:
The following exception is thrown when setting client handlers in a Call object
simultaneously from multiple threads. All these call objects are created from a
single Service object.
{code:java}
org.apache.axis.ConfigurationException: java.io.IOException: Stream
closedorg.apache.axis.ConfigurationException: java.io.IOException: Stream
closedjava.io.IOException: Stream closed at
java.util.zip.InflaterInputStream.ensureOpen(InflaterInputStream.java:67) at
java.util.zip.InflaterInputStream.read(InflaterInputStream.java:121) at
java.io.FilterInputStream.read(FilterInputStream.java:83) at
org.apache.xerces.impl.XMLEntityManager$RewindableInputStream.readAndBuffer(Unknown
Source) at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown
Source) at
org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at
org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at
org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at
org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at
org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) at
org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:369) at
org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:388) at
org.apache.axis.configuration.FileProvider.configureEngine(FileProvider.java:179)
at org.apache.axis.AxisEngine.init(AxisEngine.java:172) at
org.apache.axis.AxisEngine.<init>(AxisEngine.java:156) at
org.apache.axis.client.AxisClient.<init>(AxisClient.java:52) at
org.apache.axis.client.Service.getAxisClient(Service.java:104) at
org.apache.axis.client.Call.setSOAPService(Call.java:2910) at
org.apache.axis.client.Call.setClientHandlers(Call.java:2924) at
com.fisc.common.axis.TempFileProviderTest.lambda$0(TempFileProviderTest.java:28)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at
java.util.concurrent.FutureTask.run(FutureTask.java:266) at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
{code}
How to recreate?
{code:java}
public static void main( String[] args) throws ServiceException
{
ExecutorService executorService = Executors.newCachedThreadPool();
Service service = new Service();
service.setMaintainSession( true);
for (int i = 0; i < 50; i++)
{
executorService.submit( () -> {
Call call;
try
{
call = (Call) service.createCall();
call.setClientHandlers( new SomeClientRequestHandler(),
new AnotherClientResponseHandler());
}
catch (ServiceException e)
{
throw new RuntimeException( e);
}
}); }
}
{code}
Reason:
org.apache.axis.configuration.FileProvider.configureEngine(AxisEngine) uses
getInputStream() and setInputStream() methods to load the client config wsdd.
These getter and setter methods read or modify the 'myInputStream' class member
variable and is not thread-safe
Fix:
Use a local InputStream method local variable to load the client config file.
The stream is loaded and consumed in this method, so a local variable is
appropriate here. Please find attached the unified diff file with the proposed
fix.
> java.io.IOException: Stream closed when setting client handlers in Call object
> ------------------------------------------------------------------------------
>
> Key: AXIS-2935
> URL: https://issues.apache.org/jira/browse/AXIS-2935
> Project: Axis
> Issue Type: Bug
> Components: Basic Architecture
> Affects Versions: 1.4.1
> Environment: openjdk version "1.8.0_212"
> OpenJDK Runtime Environment (Zulu 8.38.0.13-CA-win64) (build 1.8.0_212-b04)
> OpenJDK 64-Bit Server VM (Zulu 8.38.0.13-CA-win64) (build 25.212-b04, mixed
> mode)
> Reporter: Hazem Kunhamarakam Mammu
> Priority: Major
> Labels: patch
> Fix For: 1.4.1
>
> Attachments: axis_patch.txt
>
> Original Estimate: 2h
> Remaining Estimate: 2h
>
> The following exception is thrown when setting client handlers in a Call
> object simultaneously from multiple threads. All these call objects are
> created from a single Service object.
> {code:java}
> org.apache.axis.ConfigurationException: java.io.IOException: Stream
> closedorg.apache.axis.ConfigurationException: java.io.IOException: Stream
> closed
> java.io.IOException: Stream closed at
> java.util.zip.InflaterInputStream.ensureOpen(InflaterInputStream.java:67) at
> java.util.zip.InflaterInputStream.read(InflaterInputStream.java:121) at
> java.io.FilterInputStream.read(FilterInputStream.java:83) at
> org.apache.xerces.impl.XMLEntityManager$RewindableInputStream.readAndBuffer(Unknown
> Source) at
> org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) at
> org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
> at
> org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at
> org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at
> org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at
> org.apache.xerces.parsers.DOMParser.parse(Unknown Source) at
> org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source) at
> org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:369) at
> org.apache.axis.utils.XMLUtils.newDocument(XMLUtils.java:388) at
> org.apache.axis.configuration.FileProvider.configureEngine(FileProvider.java:179)
> at
> org.apache.axis.AxisEngine.init(AxisEngine.java:172) at
> org.apache.axis.AxisEngine.<init>(AxisEngine.java:156) at
> org.apache.axis.client.AxisClient.<init>(AxisClient.java:52) at
> org.apache.axis.client.Service.getAxisClient(Service.java:104) at
> org.apache.axis.client.Call.setSOAPService(Call.java:2910) at
> org.apache.axis.client.Call.setClientHandlers(Call.java:2924) at
> com.fisc.common.axis.TempFileProviderTest.lambda$0(TempFileProviderTest.java:28)
> at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at
> java.util.concurrent.FutureTask.run(FutureTask.java:266) at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at
> java.lang.Thread.run(Thread.java:748)
> {code}
> How to recreate?
> {code:java}
> public static void main( String[] args) throws ServiceException
> {
> ExecutorService executorService = Executors.newCachedThreadPool();
> Service service = new Service();
> service.setMaintainSession( true);
> for (int i = 0; i < 50; i++)
> {
> executorService.submit( () -> {
> Call call;
> try
> {
> call = (Call) service.createCall();
> call.setClientHandlers( new SomeClientRequestHandler(),
> new AnotherClientResponseHandler());
> }
> catch (ServiceException e)
> {
> throw new RuntimeException( e);
> }
> }); }
> }
> {code}
> Reason:
> org.apache.axis.configuration.FileProvider.configureEngine(AxisEngine) uses
> getInputStream() and setInputStream() methods to load the client config wsdd.
> These getter and setter methods read or modify the 'myInputStream' class
> member variable and is not thread-safe
>
> Fix:
> Use a local InputStream method local variable to load the client config file.
> The stream is loaded and consumed in this method, so a local variable is
> appropriate here. Please find attached the unified diff file with the
> proposed fix.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]