Archived
This forum has been archived. Please start a new discussion on GitHub.
ICE in JAVA. exception in `Ice.Thread Pool.Client'
Hi:
When I study ICE, found some errors. anybody can help me?thanks.
I implemented a server in C#,implemented a client in java.
In client, there is a thread named 'StationWatcher' execute the run method every 10 seconds:
@Override
public void run() {
ArrayList<Station> temp = new ArrayList<Station>();
for (Station s : Config.getAllStation()) {
int[] errCircuits = isNormal(s);
if (errCircuits.length > 0) {
temp.add(s);
}
}
}
private int[] isNormal(Station s) {
IntBuffer temp = IntBuffer.allocate(s.getAllCircuit().size());
for (Circuit c : s.getAllCircuit()) {
if (c.isHasStealProof()) {
String sProof = DBCommProxy.getInstance().getValue(
c.getVariable(VariableTemplete.StealProof));
if (sProof != null) {
if (!sProof.equals("1")) {
temp.put(c.getID());
}
}
}
}
temp.flip();
int[] rtn = new int[temp.limit()];
temp.get(rtn);
return rtn;
}
The DBCommProxy is a class extends from Ice.ObjectPrx. when DBCommProxy.getInstance().getValue catch any exception , it will stop the thread StationWatcher.
when the server is closed, client console will throw the follow exception continuously 。buy when the server is closed, the exception will raise in DBCommProxy.getInstance().getValue, and the StationWatcher thread will be stoped. but why It seems that the ice client is try to connect the server again and again.
!! 10-7-23 22:04:35:522 error: Ice.ThreadPool.Client-0: exception in `Ice.Thread
Pool.Client':
Ice.SocketException
error = 0
at IceInternal.ThreadPoolWorkQueue.postMessage(ThreadPoolWorkQueue.java:
166)
at IceInternal.ThreadPoolWorkQueue.message(ThreadPoolWorkQueue.java:114)
at IceInternal.ThreadPool.run(ThreadPool.java:302)
at IceInternal.ThreadPool.access$300(ThreadPool.java:12)
at IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:643)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.nio.channels.ClosedChannelException
at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:1
26)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:324)
at sun.nio.ch.SinkChannelImpl.write(SinkChannelImpl.java:96)
at IceInternal.ThreadPoolWorkQueue.postMessage(ThreadPoolWorkQueue.java:
162)
... 5 more
event handler: work queue
!! 10-7-23 22:04:35:537 error: Ice.ThreadPool.Client-0: exception in `Ice.Thread
Pool.Client':
Ice.SocketException
error = 0
at IceInternal.ThreadPoolWorkQueue.postMessage(ThreadPoolWorkQueue.java:
166)
at IceInternal.ThreadPoolWorkQueue.message(ThreadPoolWorkQueue.java:114)
at IceInternal.ThreadPool.run(ThreadPool.java:302)
at IceInternal.ThreadPool.access$300(ThreadPool.java:12)
at IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:643)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.nio.channels.ClosedChannelException
at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:1
26)
is there some wrong in client JAVA code ?
When I study ICE, found some errors. anybody can help me?thanks.
I implemented a server in C#,implemented a client in java.
In client, there is a thread named 'StationWatcher' execute the run method every 10 seconds:
@Override
public void run() {
ArrayList<Station> temp = new ArrayList<Station>();
for (Station s : Config.getAllStation()) {
int[] errCircuits = isNormal(s);
if (errCircuits.length > 0) {
temp.add(s);
}
}
}
private int[] isNormal(Station s) {
IntBuffer temp = IntBuffer.allocate(s.getAllCircuit().size());
for (Circuit c : s.getAllCircuit()) {
if (c.isHasStealProof()) {
String sProof = DBCommProxy.getInstance().getValue(
c.getVariable(VariableTemplete.StealProof));
if (sProof != null) {
if (!sProof.equals("1")) {
temp.put(c.getID());
}
}
}
}
temp.flip();
int[] rtn = new int[temp.limit()];
temp.get(rtn);
return rtn;
}
The DBCommProxy is a class extends from Ice.ObjectPrx. when DBCommProxy.getInstance().getValue catch any exception , it will stop the thread StationWatcher.
when the server is closed, client console will throw the follow exception continuously 。buy when the server is closed, the exception will raise in DBCommProxy.getInstance().getValue, and the StationWatcher thread will be stoped. but why It seems that the ice client is try to connect the server again and again.
!! 10-7-23 22:04:35:522 error: Ice.ThreadPool.Client-0: exception in `Ice.Thread
Pool.Client':
Ice.SocketException
error = 0
at IceInternal.ThreadPoolWorkQueue.postMessage(ThreadPoolWorkQueue.java:
166)
at IceInternal.ThreadPoolWorkQueue.message(ThreadPoolWorkQueue.java:114)
at IceInternal.ThreadPool.run(ThreadPool.java:302)
at IceInternal.ThreadPool.access$300(ThreadPool.java:12)
at IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:643)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.nio.channels.ClosedChannelException
at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:1
26)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:324)
at sun.nio.ch.SinkChannelImpl.write(SinkChannelImpl.java:96)
at IceInternal.ThreadPoolWorkQueue.postMessage(ThreadPoolWorkQueue.java:
162)
... 5 more
event handler: work queue
!! 10-7-23 22:04:35:537 error: Ice.ThreadPool.Client-0: exception in `Ice.Thread
Pool.Client':
Ice.SocketException
error = 0
at IceInternal.ThreadPoolWorkQueue.postMessage(ThreadPoolWorkQueue.java:
166)
at IceInternal.ThreadPoolWorkQueue.message(ThreadPoolWorkQueue.java:114)
at IceInternal.ThreadPool.run(ThreadPool.java:302)
at IceInternal.ThreadPool.access$300(ThreadPool.java:12)
at IceInternal.ThreadPool$EventHandlerThread.run(ThreadPool.java:643)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.nio.channels.ClosedChannelException
at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:1
26)
is there some wrong in client JAVA code ?
0
Comments
-
Please provide the following information:
- Ice version
- Java JDK version
- Operating system version
Regards,
Mark0 -
Please provide the following information:
- Ice version
- Java JDK version
- Operating system version
Regards,
Mark
The enviroment is:- ICE version:3.4.1
- JDK Version:build 16.0-b13
- OS:Windows XP SP3
DBCommProxy class is responsible for communicate by ICE. StationWatcher is a scan thread. while DBCommProxy established connection with ICE server, it will launch the StationWatcher thread.
thanks again!0 -
any body can help me ?
any body can help me ?0 -
The problem is caused by this line:
future.cancel(true);
When you pass true to the cancel method, you are allowing it to interrupt a thread if necessary. This interrupt causes a socket used internally by the Ice thread pool to be closed and results in the infinite loop that follows.
Change the argument to false and everything works as expected. As a general rule, Ice for Java does not work well in the presence of thread interrupts.
Regards,
Mark0 -
The problem is caused by this line:
future.cancel(true);
When you pass true to the cancel method, you are allowing it to interrupt a thread if necessary. This interrupt causes a socket used internally by the Ice thread pool to be closed and results in the infinite loop that follows.
Change the argument to false and everything works as expected. As a general rule, Ice for Java does not work well in the presence of thread interrupts.
Regards,
Mark0