diff --git a/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java b/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java index b23741cf..b6e78d60 100644 --- a/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java +++ b/parser/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java @@ -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 subscriptions = new ArrayList(); 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 getSubscriptions() {