import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
private Map<ReadWriteTransaction,TransactionCommand> transactionToCommand
= new HashMap<ReadWriteTransaction,TransactionCommand>();
private List<ReadWriteTransaction> pendingTransactions = new ArrayList<ReadWriteTransaction>();
+ private final AtomicBoolean runTask = new AtomicBoolean( true );
public TransactionInvokerImpl(DataBroker db) {
this.db = db;
@Override
public void run() {
- while (true) {
+ while (runTask.get()) {
forgetSuccessfulTransactions();
try {
List<TransactionCommand> commands = extractCommands();
@Override
public void close() throws Exception {
this.executor.shutdown();
+ if (!this.executor.awaitTermination(1, TimeUnit.SECONDS)) {
+ runTask.set(false);
+ this.executor.shutdownNow();
+ }
}
}
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Before;
import org.junit.Test;
private BlockingQueue<AsyncTransaction<?, ?>> failedTransactionQueue
= new LinkedBlockingQueue<AsyncTransaction<?, ?>>(QUEUE_SIZE);
@Mock private ExecutorService executor;
+ @Mock private AtomicBoolean runTask;
private Map<ReadWriteTransaction,TransactionCommand> transactionToCommand
= new HashMap<ReadWriteTransaction,TransactionCommand>();
private List<ReadWriteTransaction> pendingTransactions = new ArrayList<ReadWriteTransaction>();
@Test
public void testClose() throws Exception {
MemberModifier.field(TransactionInvokerImpl.class, "executor").set(transactionInvokerImpl, executor);
+ MemberModifier.field(TransactionInvokerImpl.class, "runTask").set(transactionInvokerImpl, runTask);
doNothing().when(executor).shutdown();
transactionInvokerImpl.close();
verify(executor).shutdown();