Search in sources :

Example 36 with Topic

use of org.fusesource.mqtt.client.Topic in project activemq-artemis by apache.

the class MQTTTest method testRetainedMessageOnVirtualTopics.

@Ignore
@Test(timeout = 120 * 1000)
public void testRetainedMessageOnVirtualTopics() throws Exception {
    MQTT mqtt = createMQTTConnection();
    mqtt.setKeepAlive((short) 60);
    final String RETAIN = "RETAIN";
    final String TOPICA = "VirtualTopic/TopicA";
    final String[] clientIds = { null, "foo", "durable" };
    for (String clientId : clientIds) {
        LOG.info("Testing now with Client ID: {}", clientId);
        mqtt.setClientId(clientId);
        mqtt.setCleanSession(!"durable".equals(clientId));
        BlockingConnection connection = mqtt.blockingConnection();
        connection.connect();
        // set retained message and check
        connection.publish(TOPICA, RETAIN.getBytes(), QoS.EXACTLY_ONCE, true);
        connection.subscribe(new Topic[] { new Topic(TOPICA, QoS.AT_LEAST_ONCE) });
        Message msg = connection.receive(5000, TimeUnit.MILLISECONDS);
        assertNotNull("No retained message for " + clientId, msg);
        assertEquals(RETAIN, new String(msg.getPayload()));
        msg.ack();
        assertNull(connection.receive(500, TimeUnit.MILLISECONDS));
        // test duplicate subscription
        connection.subscribe(new Topic[] { new Topic(TOPICA, QoS.AT_LEAST_ONCE) });
        msg = connection.receive(15000, TimeUnit.MILLISECONDS);
        assertNotNull("No retained message on duplicate subscription for " + clientId, msg);
        assertEquals(RETAIN, new String(msg.getPayload()));
        msg.ack();
        assertNull(connection.receive(500, TimeUnit.MILLISECONDS));
        connection.unsubscribe(new String[] { TOPICA });
        // clear retained message and check that we don't receive it
        connection.publish(TOPICA, "".getBytes(), QoS.AT_MOST_ONCE, true);
        connection.subscribe(new Topic[] { new Topic(TOPICA, QoS.AT_LEAST_ONCE) });
        msg = connection.receive(500, TimeUnit.MILLISECONDS);
        assertNull("Retained message not cleared for " + clientId, msg);
        connection.unsubscribe(new String[] { TOPICA });
        // set retained message again and check
        connection.publish(TOPICA, RETAIN.getBytes(), QoS.EXACTLY_ONCE, true);
        connection.subscribe(new Topic[] { new Topic(TOPICA, QoS.AT_LEAST_ONCE) });
        msg = connection.receive(5000, TimeUnit.MILLISECONDS);
        assertNotNull("No reset retained message for " + clientId, msg);
        assertEquals(RETAIN, new String(msg.getPayload()));
        msg.ack();
        assertNull(connection.receive(500, TimeUnit.MILLISECONDS));
        // re-connect and check
        connection.disconnect();
        connection = mqtt.blockingConnection();
        connection.connect();
        connection.subscribe(new Topic[] { new Topic(TOPICA, QoS.AT_LEAST_ONCE) });
        msg = connection.receive(5000, TimeUnit.MILLISECONDS);
        assertNotNull("No reset retained message for " + clientId, msg);
        assertEquals(RETAIN, new String(msg.getPayload()));
        msg.ack();
        assertNull(connection.receive(500, TimeUnit.MILLISECONDS));
        LOG.info("Test now unsubscribing from: {} for the last time", TOPICA);
        connection.unsubscribe(new String[] { TOPICA });
        connection.disconnect();
    }
}
Also used : MQTT(org.fusesource.mqtt.client.MQTT) AmqpMessage(org.apache.activemq.transport.amqp.client.AmqpMessage) Message(org.fusesource.mqtt.client.Message) BytesMessage(javax.jms.BytesMessage) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) BlockingConnection(org.fusesource.mqtt.client.BlockingConnection) Topic(org.fusesource.mqtt.client.Topic) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 37 with Topic

use of org.fusesource.mqtt.client.Topic in project activemq-artemis by apache.

the class MQTTTest method testNoMessageReceivedAfterUnsubscribeMQTT.

@Test(timeout = 60 * 1000)
public void testNoMessageReceivedAfterUnsubscribeMQTT() throws Exception {
    Topic[] topics = { new Topic("TopicA", QoS.EXACTLY_ONCE) };
    MQTT mqttPub = createMQTTConnection("MQTTPub-Client", true);
    // mqttPub.setVersion("3.1.1");
    MQTT mqttSub = createMQTTConnection("MQTTSub-Client", false);
    // mqttSub.setVersion("3.1.1");
    BlockingConnection connectionPub = mqttPub.blockingConnection();
    connectionPub.connect();
    BlockingConnection connectionSub = mqttSub.blockingConnection();
    connectionSub.connect();
    connectionSub.subscribe(topics);
    connectionSub.disconnect();
    for (int i = 0; i < 5; i++) {
        String payload = "Message " + i;
        connectionPub.publish(topics[0].name().toString(), payload.getBytes(), QoS.EXACTLY_ONCE, false);
    }
    connectionSub = mqttSub.blockingConnection();
    connectionSub.connect();
    int received = 0;
    for (int i = 0; i < 5; ++i) {
        Message message = connectionSub.receive(5, TimeUnit.SECONDS);
        assertNotNull("Missing message " + i, message);
        LOG.info("Message is " + new String(message.getPayload()));
        received++;
        message.ack();
    }
    assertEquals(5, received);
    // unsubscribe from topic
    connectionSub.unsubscribe(new String[] { "TopicA" });
    // send more messages
    for (int i = 0; i < 5; i++) {
        String payload = "Message " + i;
        connectionPub.publish(topics[0].name().toString(), payload.getBytes(), QoS.EXACTLY_ONCE, false);
    }
    // these should not be received
    assertNull(connectionSub.receive(5, TimeUnit.SECONDS));
    connectionSub.disconnect();
    connectionPub.disconnect();
}
Also used : MQTT(org.fusesource.mqtt.client.MQTT) AmqpMessage(org.apache.activemq.transport.amqp.client.AmqpMessage) Message(org.fusesource.mqtt.client.Message) BytesMessage(javax.jms.BytesMessage) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) Topic(org.fusesource.mqtt.client.Topic) BlockingConnection(org.fusesource.mqtt.client.BlockingConnection) Test(org.junit.Test)

Example 38 with Topic

use of org.fusesource.mqtt.client.Topic in project activemq-artemis by apache.

the class MQTTTest method testMQTTRetainQoS.

@Test(timeout = 60 * 1000)
public void testMQTTRetainQoS() throws Exception {
    String[] topics = { "AT_MOST_ONCE", "AT_LEAST_ONCE", "EXACTLY_ONCE" };
    for (int i = 0; i < topics.length; i++) {
        final String topic = topics[i];
        MQTT mqtt = createMQTTConnection();
        mqtt.setClientId("foo");
        mqtt.setKeepAlive((short) 2);
        final int[] actualQoS = { -1 };
        mqtt.setTracer(new Tracer() {

            @Override
            public void onReceive(MQTTFrame frame) {
                // validate the QoS
                if (frame.messageType() == PUBLISH.TYPE) {
                    actualQoS[0] = frame.qos().ordinal();
                }
            }
        });
        final BlockingConnection connection = mqtt.blockingConnection();
        connection.connect();
        connection.publish(topic, topic.getBytes(), QoS.EXACTLY_ONCE, true);
        connection.subscribe(new Topic[] { new Topic(topic, QoS.valueOf(topic)) });
        final Message msg = connection.receive(5000, TimeUnit.MILLISECONDS);
        assertNotNull(msg);
        assertEquals(topic, new String(msg.getPayload()));
        int waitCount = 0;
        while (actualQoS[0] == -1 && waitCount < 10) {
            Thread.sleep(1000);
            waitCount++;
        }
        assertEquals(i, actualQoS[0]);
        msg.ack();
        connection.unsubscribe(new String[] { topic });
        connection.disconnect();
    }
}
Also used : MQTT(org.fusesource.mqtt.client.MQTT) AmqpMessage(org.apache.activemq.transport.amqp.client.AmqpMessage) Message(org.fusesource.mqtt.client.Message) BytesMessage(javax.jms.BytesMessage) Tracer(org.fusesource.mqtt.client.Tracer) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) BlockingConnection(org.fusesource.mqtt.client.BlockingConnection) Topic(org.fusesource.mqtt.client.Topic) MQTTFrame(org.fusesource.mqtt.codec.MQTTFrame) Test(org.junit.Test)

Example 39 with Topic

use of org.fusesource.mqtt.client.Topic in project activemq-artemis by apache.

the class MQTTTest method testUniqueMessageIds.

@Test(timeout = 60 * 1000)
public void testUniqueMessageIds() throws Exception {
    MQTT mqtt = createMQTTConnection();
    mqtt.setClientId("foo");
    mqtt.setKeepAlive((short) 2);
    mqtt.setCleanSession(true);
    final List<PUBLISH> publishList = new ArrayList<>();
    mqtt.setTracer(new Tracer() {

        @Override
        public void onReceive(MQTTFrame frame) {
            LOG.info("Client received:\n" + frame);
            if (frame.messageType() == PUBLISH.TYPE) {
                PUBLISH publish = new PUBLISH();
                try {
                    publish.decode(frame);
                } catch (ProtocolException e) {
                    fail("Error decoding publish " + e.getMessage());
                }
                publishList.add(publish);
            }
        }

        @Override
        public void onSend(MQTTFrame frame) {
            LOG.info("Client sent:\n" + frame);
        }
    });
    final BlockingConnection connection = mqtt.blockingConnection();
    connection.connect();
    // create overlapping subscriptions with different QoSs
    QoS[] qoss = { QoS.AT_MOST_ONCE, QoS.AT_LEAST_ONCE, QoS.EXACTLY_ONCE };
    final String TOPIC = "TopicA/";
    // publish retained message
    connection.publish(TOPIC, TOPIC.getBytes(), QoS.EXACTLY_ONCE, true);
    String[] subs = { TOPIC, "TopicA/#", "TopicA/+" };
    for (int i = 0; i < qoss.length; i++) {
        connection.subscribe(new Topic[] { new Topic(subs[i], qoss[i]) });
    }
    // publish non-retained message
    connection.publish(TOPIC, TOPIC.getBytes(), QoS.EXACTLY_ONCE, false);
    int received = 0;
    Message msg = connection.receive(5000, TimeUnit.MILLISECONDS);
    do {
        assertNotNull(msg);
        assertEquals(TOPIC, new String(msg.getPayload()));
        msg.ack();
        int waitCount = 0;
        while (publishList.size() <= received && waitCount < 10) {
            Thread.sleep(1000);
            waitCount++;
        }
        msg = connection.receive(5000, TimeUnit.MILLISECONDS);
    } while (msg != null && received++ < subs.length * 2);
    assertEquals("Unexpected number of messages", subs.length * 2, received + 1);
    // AT_MOST_ONCE
    for (int i = 0; i < publishList.size(); i++) {
        for (int j = i + 1; j < publishList.size(); j++) {
            final PUBLISH publish1 = publishList.get(i);
            final PUBLISH publish2 = publishList.get(j);
            boolean qos0 = false;
            if (publish1.qos() == QoS.AT_MOST_ONCE) {
                qos0 = true;
                assertEquals(0, publish1.messageId());
            }
            if (publish2.qos() == QoS.AT_MOST_ONCE) {
                qos0 = true;
                assertEquals(0, publish2.messageId());
            }
            if (!qos0) {
                assertNotEquals(publish1.messageId(), publish2.messageId());
            }
        }
    }
    connection.unsubscribe(subs);
    connection.disconnect();
}
Also used : MQTT(org.fusesource.mqtt.client.MQTT) ProtocolException(java.net.ProtocolException) AmqpMessage(org.apache.activemq.transport.amqp.client.AmqpMessage) Message(org.fusesource.mqtt.client.Message) BytesMessage(javax.jms.BytesMessage) Tracer(org.fusesource.mqtt.client.Tracer) ArrayList(java.util.ArrayList) PUBLISH(org.fusesource.mqtt.codec.PUBLISH) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) BlockingConnection(org.fusesource.mqtt.client.BlockingConnection) MQTTFrame(org.fusesource.mqtt.codec.MQTTFrame) QoS(org.fusesource.mqtt.client.QoS) Topic(org.fusesource.mqtt.client.Topic) Test(org.junit.Test)

Example 40 with Topic

use of org.fusesource.mqtt.client.Topic in project activemq-artemis by apache.

the class FuseMQTTClientProvider method subscribe.

@Override
public void subscribe(String topic, int qos) throws Exception {
    Topic[] topics = { new Topic(utf8(topic), QoS.values()[qos]) };
    connection.subscribe(topics);
}
Also used : Topic(org.fusesource.mqtt.client.Topic)

Aggregations

Topic (org.fusesource.mqtt.client.Topic)52 BlockingConnection (org.fusesource.mqtt.client.BlockingConnection)48 Test (org.junit.Test)41 MQTT (org.fusesource.mqtt.client.MQTT)39 Message (org.fusesource.mqtt.client.Message)36 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)21 AmqpMessage (org.apache.activemq.transport.amqp.client.AmqpMessage)18 BytesMessage (javax.jms.BytesMessage)17 Tracer (org.fusesource.mqtt.client.Tracer)6 MQTTFrame (org.fusesource.mqtt.codec.MQTTFrame)6 ProtocolException (java.net.ProtocolException)5 QoS (org.fusesource.mqtt.client.QoS)4 PUBLISH (org.fusesource.mqtt.codec.PUBLISH)4 Ignore (org.junit.Ignore)4 ArrayList (java.util.ArrayList)3 CountDownLatch (java.util.concurrent.CountDownLatch)3 AddressInfo (org.apache.activemq.artemis.core.server.impl.AddressInfo)3 URI (java.net.URI)2 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)2 WildcardConfiguration (org.apache.activemq.artemis.core.config.WildcardConfiguration)2