Switched from plain synchronized to ReadWrite locking

This commit is contained in:
selva.andre
2012-08-01 23:51:25 +02:00
parent f0dd3f1f2e
commit 41f03b2d3e
@@ -2,6 +2,8 @@ package org.dna.mqtt.moquette.messaging.spi.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.dna.mqtt.moquette.messaging.spi.IMessaging;
import org.dna.mqtt.moquette.messaging.spi.INotifier;
import org.dna.mqtt.moquette.proto.messages.AbstractMessage.QOSType;
@@ -12,6 +14,8 @@ import org.dna.mqtt.moquette.proto.messages.AbstractMessage.QOSType;
*/
public class SimpleMessaging implements IMessaging {
//TODO is poorly performace on concurrent load, use at least ReadWriteLock
private ReadWriteLock rwLock = new ReentrantReadWriteLock();
private List<Subscription> subscriptions = new ArrayList<Subscription>();
private INotifier m_notifier;
@@ -24,23 +28,27 @@ public class SimpleMessaging implements IMessaging {
//TODO for this moment no retain management and no qos > 0
//trivial implementation
QOSType defQos = QOSType.MOST_ONE;
synchronized(subscriptions) {
rwLock.readLock().lock();
try {
for (Subscription sub : subscriptions) {
if (sub.match(topic)) {
m_notifier.notify(sub.clientId, topic, defQos, message);
}
}
} finally {
rwLock.readLock().unlock();
}
}
public void subscribe(String clientId, String topic, QOSType qos) {
Subscription newSubscription = new Subscription(clientId, topic, qos);
synchronized(subscriptions) {
if (subscriptions.contains(newSubscription)) {
return;
}
subscriptions.add(newSubscription);
rwLock.writeLock().lock();
if (subscriptions.contains(newSubscription)) {
return;
}
subscriptions.add(newSubscription);
rwLock.writeLock().unlock();
}
protected List<Subscription> getSubscriptions() {