Search in sources :

Example 11 with Topic

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

the class MQTTTest method testReceiveMessageSentWhileOffline.

@Test(timeout = 60 * 1000)
public void testReceiveMessageSentWhileOffline() throws Exception {
    final byte[] payload = new byte[1024 * 32];
    for (int i = 0; i < payload.length; i++) {
        payload[i] = '2';
    }
    int numberOfRuns = 100;
    int messagesPerRun = 2;
    final MQTT mqttPub = createMQTTConnection("MQTT-Pub-Client", true);
    final MQTT mqttSub = createMQTTConnection("MQTT-Sub-Client", false);
    final BlockingConnection connectionPub = mqttPub.blockingConnection();
    connectionPub.connect();
    BlockingConnection connectionSub = mqttSub.blockingConnection();
    connectionSub.connect();
    Topic[] topics = { new Topic("TopicA", QoS.EXACTLY_ONCE) };
    connectionSub.subscribe(topics);
    for (int i = 0; i < messagesPerRun; ++i) {
        connectionPub.publish(topics[0].name().toString(), payload, QoS.AT_LEAST_ONCE, false);
    }
    int received = 0;
    for (int i = 0; i < messagesPerRun; ++i) {
        Message message = connectionSub.receive(5, TimeUnit.SECONDS);
        assertNotNull(message);
        received++;
        assertTrue(Arrays.equals(payload, message.getPayload()));
        message.ack();
    }
    connectionSub.disconnect();
    for (int j = 0; j < numberOfRuns; j++) {
        for (int i = 0; i < messagesPerRun; ++i) {
            connectionPub.publish(topics[0].name().toString(), payload, QoS.AT_LEAST_ONCE, false);
        }
        connectionSub = mqttSub.blockingConnection();
        connectionSub.connect();
        connectionSub.subscribe(topics);
        for (int i = 0; i < messagesPerRun; ++i) {
            Message message = connectionSub.receive(5, TimeUnit.SECONDS);
            assertNotNull(message);
            received++;
            assertTrue(Arrays.equals(payload, message.getPayload()));
            message.ack();
        }
        connectionSub.disconnect();
    }
    assertEquals("Should have received " + (messagesPerRun * (numberOfRuns + 1)) + " messages", (messagesPerRun * (numberOfRuns + 1)), received);
}
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) BlockingConnection(org.fusesource.mqtt.client.BlockingConnection) Topic(org.fusesource.mqtt.client.Topic) Test(org.junit.Test)

Example 12 with Topic

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

the class MQTTTest method testPacketIdGeneratorCleanSession.

@Ignore
@Test(timeout = 90 * 1000)
public // If there is a good reason for this we should follow ActiveMQ.
void testPacketIdGeneratorCleanSession() throws Exception {
    final String[] cleanClientIds = new String[] { "", "clean-packetid", null };
    final Map<Short, PUBLISH> publishMap = new ConcurrentHashMap<>();
    MQTT[] mqtts = new MQTT[cleanClientIds.length];
    for (int i = 0; i < cleanClientIds.length; i++) {
        mqtts[i] = createMQTTConnection("", true);
        mqtts[i].setKeepAlive((short) 15);
        mqtts[i].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);
                        LOG.info("PUBLISH " + publish);
                    } catch (ProtocolException e) {
                        fail("Error decoding publish " + e.getMessage());
                    }
                    if (publishMap.get(publish.messageId()) != null) {
                        assertTrue(publish.dup());
                    }
                    publishMap.put(publish.messageId(), publish);
                }
            }

            @Override
            public void onSend(MQTTFrame frame) {
                LOG.info("Client sent:\n" + frame);
            }
        });
    }
    final Random random = new Random();
    for (short i = 0; i < 10; i++) {
        BlockingConnection connection = mqtts[random.nextInt(cleanClientIds.length)].blockingConnection();
        connection.connect();
        final String TOPIC = "TopicA/";
        connection.subscribe(new Topic[] { new Topic(TOPIC, QoS.EXACTLY_ONCE) });
        // publish non-retained message
        connection.publish(TOPIC, TOPIC.getBytes(), QoS.EXACTLY_ONCE, false);
        Message msg = connection.receive(1000, TimeUnit.MILLISECONDS);
        assertNotNull(msg);
        assertEquals(TOPIC, new String(msg.getPayload()));
        msg.ack();
        assertEquals(1, publishMap.size());
        final short id = (short) (i + 1);
        assertNotNull("No message for id " + id, publishMap.get(id));
        publishMap.clear();
        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) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) PUBLISH(org.fusesource.mqtt.codec.PUBLISH) BlockingConnection(org.fusesource.mqtt.client.BlockingConnection) MQTTFrame(org.fusesource.mqtt.codec.MQTTFrame) Random(java.util.Random) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Topic(org.fusesource.mqtt.client.Topic) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 13 with Topic

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

the class MQTTTest method testDuplicateSubscriptions.

@Test(timeout = 60 * 1000)
public void testDuplicateSubscriptions() throws Exception {
    MQTT mqtt = createMQTTConnection();
    mqtt.setClientId("foo");
    mqtt.setKeepAlive((short) 20);
    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();
    final String RETAIN = "RETAIN";
    connection.publish("TopicA", RETAIN.getBytes(), QoS.EXACTLY_ONCE, true);
    QoS[] qoss = { QoS.AT_MOST_ONCE, QoS.AT_MOST_ONCE, QoS.AT_LEAST_ONCE, QoS.EXACTLY_ONCE };
    for (QoS qos : qoss) {
        connection.subscribe(new Topic[] { new Topic("TopicA", qos) });
        final Message msg = connection.receive(5000, TimeUnit.MILLISECONDS);
        assertNotNull("No message for " + qos, msg);
        assertEquals(RETAIN, new String(msg.getPayload()));
        msg.ack();
        int waitCount = 0;
        while (actualQoS[0] == -1 && waitCount < 10) {
            Thread.sleep(1000);
            waitCount++;
        }
        assertEquals(qos.ordinal(), actualQoS[0]);
        actualQoS[0] = -1;
    }
    connection.unsubscribe(new String[] { "TopicA" });
    connection.disconnect();
}
Also used : MQTT(org.fusesource.mqtt.client.MQTT) QoS(org.fusesource.mqtt.client.QoS) 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 14 with Topic

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

the class MQTTTest method testAnycastPrefixWorksWithMQTT.

@Test(timeout = 60 * 1000)
public void testAnycastPrefixWorksWithMQTT() throws Exception {
    String clientId = "testMqtt";
    String anycastAddress = "anycast:foo/bar";
    String sendAddress = "foo/bar";
    Topic[] mqttSubscription = new Topic[] { new Topic(anycastAddress, QoS.AT_LEAST_ONCE) };
    MQTT mqtt = createMQTTConnection();
    mqtt.setClientId(clientId);
    BlockingConnection connection1 = mqtt.blockingConnection();
    connection1.connect();
    connection1.subscribe(mqttSubscription);
    MQTT mqtt2 = createMQTTConnection();
    mqtt2.setClientId(clientId + "2");
    BlockingConnection connection2 = mqtt2.blockingConnection();
    connection2.connect();
    connection2.subscribe(mqttSubscription);
    String message1 = "TestMessage1";
    String message2 = "TestMessage2";
    connection1.publish(sendAddress, message1.getBytes(), QoS.AT_LEAST_ONCE, false);
    connection2.publish(sendAddress, message2.getBytes(), QoS.AT_LEAST_ONCE, false);
    assertNotNull(connection1.receive(1000, TimeUnit.MILLISECONDS));
    assertNull(connection1.receive(1000, TimeUnit.MILLISECONDS));
    assertNotNull(connection2.receive(1000, TimeUnit.MILLISECONDS));
    assertNull(connection2.receive(1000, TimeUnit.MILLISECONDS));
}
Also used : MQTT(org.fusesource.mqtt.client.MQTT) 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 15 with Topic

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

the class MQTTTest method testBrokerRestartAfterSubHashWithConfigurationQueues.

@Test(timeout = 60 * 1000)
public void testBrokerRestartAfterSubHashWithConfigurationQueues() throws Exception {
    // Add some pre configured queues
    CoreQueueConfiguration coreQueueConfiguration = new CoreQueueConfiguration();
    coreQueueConfiguration.setName("DLQ");
    coreQueueConfiguration.setRoutingType(RoutingType.ANYCAST);
    coreQueueConfiguration.setAddress("DLA");
    CoreAddressConfiguration coreAddressConfiguration = new CoreAddressConfiguration();
    coreAddressConfiguration.setName("DLA");
    coreAddressConfiguration.addRoutingType(RoutingType.ANYCAST);
    coreAddressConfiguration.addQueueConfiguration(coreQueueConfiguration);
    getServer().getConfiguration().getAddressConfigurations().add(coreAddressConfiguration);
    getServer().stop();
    getServer().start();
    getServer().waitForActivation(10, TimeUnit.SECONDS);
    for (int i = 0; i < 2; i++) {
        MQTT mqtt = createMQTTConnection("myClient", false);
        BlockingConnection connection = mqtt.blockingConnection();
        connection.connect();
        connection.subscribe(new Topic[] { new Topic("#", QoS.AT_MOST_ONCE) });
        connection.disconnect();
        getServer().stop();
        getServer().start();
        getServer().waitForActivation(10, TimeUnit.SECONDS);
    }
}
Also used : MQTT(org.fusesource.mqtt.client.MQTT) CoreAddressConfiguration(org.apache.activemq.artemis.core.config.CoreAddressConfiguration) CoreQueueConfiguration(org.apache.activemq.artemis.core.config.CoreQueueConfiguration) BlockingConnection(org.fusesource.mqtt.client.BlockingConnection) Topic(org.fusesource.mqtt.client.Topic) Test(org.junit.Test)

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