diff --git a/broker/pom.xml b/broker/pom.xml index 6910e0ee..304d3a7a 100644 --- a/broker/pom.xml +++ b/broker/pom.xml @@ -33,9 +33,9 @@ - com.googlecode.disruptor + com.lmax disruptor - 2.7.1 + 3.3.0 diff --git a/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/ProtocolProcessor.java b/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/ProtocolProcessor.java index abeebe5f..cbe77030 100644 --- a/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/ProtocolProcessor.java +++ b/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/ProtocolProcessor.java @@ -15,10 +15,9 @@ */ package org.dna.mqtt.moquette.messaging.spi.impl; -import com.lmax.disruptor.BatchEventProcessor; import com.lmax.disruptor.EventHandler; import com.lmax.disruptor.RingBuffer; -import com.lmax.disruptor.SequenceBarrier; +import com.lmax.disruptor.dsl.Disruptor; import java.nio.ByteBuffer; import java.util.Collection; import java.util.HashMap; @@ -110,7 +109,6 @@ class ProtocolProcessor implements EventHandler { private Map m_willStore = new HashMap(); private ExecutorService m_executor; - BatchEventProcessor m_eventProcessor; private RingBuffer m_ringBuffer; ProtocolProcessor() {} @@ -135,13 +133,12 @@ class ProtocolProcessor implements EventHandler { //init the output ringbuffer m_executor = Executors.newFixedThreadPool(1); - m_ringBuffer = new RingBuffer(ValueEvent.EVENT_FACTORY, 1024 * 32); + Disruptor disruptor = new Disruptor(ValueEvent.EVENT_FACTORY, 1024 * 32, m_executor); + disruptor.handleEventsWith(this); + disruptor.start(); - SequenceBarrier barrier = m_ringBuffer.newBarrier(); - m_eventProcessor = new BatchEventProcessor(m_ringBuffer, barrier, this); - //TODO in a presentation is said to don't do the followinf line!! - m_ringBuffer.setGatingSequences(m_eventProcessor.getSequence()); - m_executor.submit(m_eventProcessor); + // Get the ring buffer from the Disruptor to be used for publishing. + m_ringBuffer = disruptor.getRingBuffer(); } @MQTTMessage(message = ConnectMessage.class) @@ -228,7 +225,7 @@ class ProtocolProcessor implements EventHandler { } LOG.debug("processConnect sent OK ConnAck"); session.write(okResp); - LOG.info("Connected client ID <{}> with clean session {}", msg.getClientID(), msg.isCleanSession()); + LOG.warn("Connected client ID <{}> with clean session {}", msg.getClientID(), msg.isCleanSession()); LOG.info("Create persistent session for clientID {}", msg.getClientID()); m_sessionsStore.addNewSubscription(Subscription.createEmptySubscription(msg.getClientID(), true), msg.getClientID()); //null means EmptySubscription @@ -525,7 +522,7 @@ class ProtocolProcessor implements EventHandler { //cleanup the will store m_willStore.remove(clientID); - LOG.info("Disconnected client <{}> with clean session {}", clientID, cleanSession); + LOG.warn("Disconnected client <{}> with clean session {}", clientID, cleanSession); } void proccessConnectionLost(String clientID) { diff --git a/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java b/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java index a0e44b1f..47bc7f25 100644 --- a/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java +++ b/broker/src/main/java/org/dna/mqtt/moquette/messaging/spi/impl/SimpleMessaging.java @@ -15,10 +15,11 @@ */ package org.dna.mqtt.moquette.messaging.spi.impl; -import com.lmax.disruptor.BatchEventProcessor; +import com.lmax.disruptor.BusySpinWaitStrategy; import com.lmax.disruptor.EventHandler; import com.lmax.disruptor.RingBuffer; -import com.lmax.disruptor.SequenceBarrier; +import com.lmax.disruptor.SleepingWaitStrategy; +import com.lmax.disruptor.dsl.Disruptor; import java.util.List; import java.util.Properties; @@ -26,6 +27,8 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; + +import com.lmax.disruptor.dsl.ProducerType; import org.dna.mqtt.moquette.messaging.spi.IMessaging; import org.dna.mqtt.moquette.messaging.spi.ISessionsStore; import org.dna.mqtt.moquette.messaging.spi.IMessagesStore; @@ -61,7 +64,6 @@ public class SimpleMessaging implements IMessaging, EventHandler { private ISessionsStore m_sessionsStore; private ExecutorService m_executor; - BatchEventProcessor m_eventProcessor; private static SimpleMessaging INSTANCE; @@ -83,15 +85,15 @@ public class SimpleMessaging implements IMessaging, EventHandler { public void init(Properties configProps) { subscriptions = new SubscriptionsStore(); m_executor = Executors.newFixedThreadPool(1); + Disruptor disruptor = new Disruptor(ValueEvent.EVENT_FACTORY, 1024 * 32, m_executor); + /*Disruptor disruptor = new Disruptor(ValueEvent.EVENT_FACTORY, 1024 * 32, m_executor, + ProducerType.MULTI, new BusySpinWaitStrategy());*/ + disruptor.handleEventsWith(this); + disruptor.start(); - m_ringBuffer = new RingBuffer(ValueEvent.EVENT_FACTORY, 1024 * 32); + // Get the ring buffer from the Disruptor to be used for publishing. + m_ringBuffer = disruptor.getRingBuffer(); - SequenceBarrier barrier = m_ringBuffer.newBarrier(); - m_eventProcessor = new BatchEventProcessor(m_ringBuffer, barrier, this); - //TODO in a presentation is said to don't do the following line!! - m_ringBuffer.setGatingSequences(m_eventProcessor.getSequence()); - m_executor.submit(m_eventProcessor); - annotationSupport.processAnnotations(m_processor); processInit(configProps); // disruptorPublish(new InitEvent(configProps)); diff --git a/broker/src/test/resources/log4j.properties b/broker/src/test/resources/log4j.properties index ccdb6fc4..12d1d3f9 100644 --- a/broker/src/test/resources/log4j.properties +++ b/broker/src/test/resources/log4j.properties @@ -5,7 +5,7 @@ log4j.rootLogger=ERROR, stdout, file log4j.logger.org.dna.mqtt=INFO log4j.logger.org.dna.mqtt.moquette.server.ServerIntegrationFuseTest=DEBUG log4j.logger.org.dna.mqtt.moquette.server.ServerIntegrationQoSValidationTest=INFO -log4j.logger.org.dna.mqtt.moquette.messaging.spi.impl.ProtocolProcessor=INFO +log4j.logger.org.dna.mqtt.moquette.messaging.spi.impl.ProtocolProcessor=WARN #log4j.logger.org.dna.mqtt.moquette.messaging.spi.impl.ProtocolProcessor=DEBUG #log4j.logger.org.dna.mqtt.moquette.messaging.spi.impl.ProtocolProcessor=TRACE log4j.logger.org.dna.mqtt.moquette.messaging.spi.impl.SimpleMessaging=WARN @@ -25,7 +25,8 @@ log4j.appender.stdout.Threshold=DEBUG # for debug trace #log4j.appender.stdout.Threshold=TRACE log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n +#log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n +log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%t] %-5p %c{1} %L %x - %m%n #file appender log4j.appender.file=org.apache.log4j.RollingFileAppender @@ -34,4 +35,5 @@ log4j.appender.file.File=moquette.log log4j.appender.file.MaxFileSize=1MB log4j.appender.file.MaxBackupIndex=1 log4j.appender.file.layout=org.apache.log4j.PatternLayout -log4j.appender.file.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n \ No newline at end of file +#log4j.appender.file.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n +log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss,SSS} [%t] %-5p %c{1} %L %x - %m%n diff --git a/bundle/pom.xml b/bundle/pom.xml index 63ef6a76..0444d4e0 100644 --- a/bundle/pom.xml +++ b/bundle/pom.xml @@ -37,12 +37,11 @@ moquette-broker ${project.version} - + - com.googlecode.disruptor + com.lmax disruptor - 2.7.1 - + 3.3.0 diff --git a/tools_scripts/publisher_client.groovy b/tools_scripts/publisher_client.groovy index 98915e00..8f4797ca 100644 --- a/tools_scripts/publisher_client.groovy +++ b/tools_scripts/publisher_client.groovy @@ -17,7 +17,7 @@ MqttMessage message = new MqttMessage('Hello world!!'.bytes) message.setQos(0) print "publishing.." long startTime = System.currentTimeMillis() -(1..10).each { +(1..1000000).each { client.publish('topic', 'Hello world!!'.bytes, 0, false) } client.publish('/exit', 'Exit'.bytes, 0, false)