I marked this issue OT because i think is a conceptual issue and not related to
any application per se.
I have 2 main issues with concurrency, one class is a queue
public class Queue {
private static org.apache.log4j.Logger log = Logger.getLogger(Queue.class);
private Command command;
private boolean valueSet = false;
public synchronized void put(Command c) {
if (valueSet) {
try {
wait();
} catch (InterruptedException ie) {
}
}
this.command = c;
log.info("put : "+c.getCommand());
valueSet = true;
notify();
}
public synchronized Command get() {
if (!valueSet) {
try {
wait();
} catch (InterruptedException ie) {
}
}
valueSet = false;
notify();
log.info("get : "+this.command.getCommand());
return command;
}
}
Then i have 1 class that reads and execute the command property. only one.
Also, i have n classes trying constantly to "put" commands in the queue.
Usually it works ok, but i have situations like this
[xcall3] 2011-08-21 11:04:00,589 INFO Queue:39 - get : list trunk
[xcall3] 2011-08-21 11:04:00,589 INFO Queue:24 - put : list agent-loginID
[xcall3] 2011-08-21 11:04:00,589 INFO Queue:24 - put : list bcms agent 5116 day
list agent-loginID get lost and never is executed.
all clases trying to put uses the same code
new Producer(Queue q, Command c).start();
and
public class Producer extends Thread {
private static org.apache.log4j.Logger log =
Logger.getLogger(Producer.class);
private Queue q;
private Command c;
public Producer(Queue q, Command c) {
this.q = q;
this.c = c;
}
@Override
public void run() {
try {
while (true) {
q.put(c);
break;
}
} catch (Exception e) {
log.error(c.getCommand());
} finally {
}
}
}
The second issue is, when the webapp is running, beside this problem,
everything goes ok, but when i call to stop the thread that "gets" from queue,
the last command is executed once again. So, the Consumer class, reach a wait
on get operation because there's no command to execute, but when i interrupt
this consumer class, get returns the last command stored in the queue. a clue?
Thanks in advance.