From ee0fc266780c0090244c7cfcf5e24c31d0b875fd Mon Sep 17 00:00:00 2001 From: SirWayne Date: Wed, 13 Apr 2016 14:10:28 +0200 Subject: [PATCH 1/5] TTL Signed-off-by: SirWayne --- .../simulator/amqp/AmqpProperties.java | 14 ++++ .../hawkbit/amqp/AmqpConfiguration.java | 30 ++++---- .../amqp/AmqpDeadletterProperties.java | 69 +++++++++++++++++++ 3 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java diff --git a/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/amqp/AmqpProperties.java b/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/amqp/AmqpProperties.java index f58355980..8fba3ac5b 100644 --- a/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/amqp/AmqpProperties.java +++ b/examples/hawkbit-device-simulator/src/main/java/org/eclipse/hawkbit/simulator/amqp/AmqpProperties.java @@ -39,6 +39,12 @@ public class AmqpProperties { */ private String deadLetterExchange = "simulator.deadletter"; + /** + * Message time to live (ttl) for the deadletter queue. Default ttl is 1 + * hour. + */ + private int deadLetterTtl = 60_000; + public String getReceiverConnectorQueueFromSp() { return receiverConnectorQueueFromSp; } @@ -70,4 +76,12 @@ public class AmqpProperties { public void setSenderForSpExchange(final String senderForSpExchange) { this.senderForSpExchange = senderForSpExchange; } + + public int getDeadLetterTtl() { + return deadLetterTtl; + } + + public void setDeadLetterTtl(final int deadLetterTtl) { + this.deadLetterTtl = deadLetterTtl; + } } diff --git a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java index acbcb453b..1e25e3717 100644 --- a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java +++ b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java @@ -8,9 +8,6 @@ */ package org.eclipse.hawkbit.amqp; -import java.util.HashMap; -import java.util.Map; - import org.eclipse.hawkbit.dmf.amqp.api.AmqpSettings; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; @@ -31,15 +28,29 @@ import org.springframework.context.annotation.Bean; * {@code amqp} to use a AMQP for communication with SP enabled devices. * */ -@EnableConfigurationProperties(AmqpProperties.class) +@EnableConfigurationProperties({ AmqpProperties.class, AmqpDeadletterProperties.class }) public class AmqpConfiguration { @Autowired protected AmqpProperties amqpProperties; + @Autowired + protected AmqpDeadletterProperties amqpDeadletterProperties; + @Autowired private ConnectionFactory connectionFactory; + // /** + // * Method to set the Jackson2JsonMessageConverter. + // * + // * @return the Jackson2JsonMessageConverter + // */ + // @Bean + // public RabbitAdmin rabbitAdmin(final RabbitAdmin rabbitAdmin) { + // rabbitAdmin.setIgnoreDeclarationExceptions(true); + // return rabbitAdmin; + // } + /** * Method to set the Jackson2JsonMessageConverter. * @@ -59,7 +70,8 @@ public class AmqpConfiguration { */ @Bean public Queue receiverQueue() { - return new Queue(amqpProperties.getReceiverQueue(), true, false, false, getDeadLetterExchangeArgs()); + return new Queue(amqpProperties.getReceiverQueue(), true, false, false, + amqpDeadletterProperties.getDeadLetterExchangeArgs(amqpProperties.getDeadLetterExchange())); } /** @@ -79,7 +91,7 @@ public class AmqpConfiguration { */ @Bean public Queue deadLetterQueue() { - return new Queue(amqpProperties.getDeadLetterQueue()); + return amqpDeadletterProperties.createDeadletterQueue(amqpProperties.getDeadLetterQueue()); } /** @@ -149,10 +161,4 @@ public class AmqpConfiguration { return containerFactory; } - private Map getDeadLetterExchangeArgs() { - final Map args = new HashMap<>(); - args.put("x-dead-letter-exchange", amqpProperties.getDeadLetterExchange()); - return args; - } - } diff --git a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java new file mode 100644 index 000000000..8e988ff16 --- /dev/null +++ b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2015 Bosch Software Innovations GmbH and others. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.eclipse.hawkbit.amqp; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.amqp.core.Queue; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Bean which holds the necessary properties for configuring the AMQP deadletter + * queue. + */ +@ConfigurationProperties("hawkbit.dmf.rabbitmq.deadLetter") +public class AmqpDeadletterProperties { + + /** + * Message time to live (ttl) for the deadletter queue. Default ttl is 3 + * weeks. + */ + private int ttl = 1_814_400_000; + + /** + * Return the deadletter arguments. + * + * @param exchange + * the deadletter exchange + * @return map which holds the properties + */ + public Map getDeadLetterExchangeArgs(final String exchange) { + final Map args = new HashMap<>(); + args.put("x-dead-letter-exchange", exchange); + return args; + } + + /** + * Create a deadletter queue with ttl for messages + * + * @param queueName + * the deadlette queue name + * @return the deadletter queue + */ + public Queue createDeadletterQueue(final String queueName) { + // getTTLArgs() + return new Queue(queueName, true, false, false, null); + } + + private Map getTTLArgs() { + final Map args = new HashMap<>(); + args.put("x-message-ttl", getTtl()); + return args; + } + + public int getTtl() { + return ttl; + } + + public void setTtl(final int ttl) { + this.ttl = ttl; + } + +} From 30ba98ff8e2d7fa7386460bfa2e25fa47dba2c52 Mon Sep 17 00:00:00 2001 From: SirWayne Date: Wed, 13 Apr 2016 17:27:49 +0200 Subject: [PATCH 2/5] TTL Signed-off-by: SirWayne --- .../eclipse/hawkbit/amqp/AmqpConfiguration.java | 17 +++++++---------- .../hawkbit/amqp/AmqpDeadletterProperties.java | 3 +-- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java index 1e25e3717..448206924 100644 --- a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java +++ b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java @@ -15,6 +15,7 @@ import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; @@ -40,16 +41,12 @@ public class AmqpConfiguration { @Autowired private ConnectionFactory connectionFactory; - // /** - // * Method to set the Jackson2JsonMessageConverter. - // * - // * @return the Jackson2JsonMessageConverter - // */ - // @Bean - // public RabbitAdmin rabbitAdmin(final RabbitAdmin rabbitAdmin) { - // rabbitAdmin.setIgnoreDeclarationExceptions(true); - // return rabbitAdmin; - // } + @Bean + public RabbitAdmin rabbitAdmin() { + final RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); + rabbitAdmin.setIgnoreDeclarationExceptions(true); + return rabbitAdmin; + } /** * Method to set the Jackson2JsonMessageConverter. diff --git a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java index 8e988ff16..e9ad60a1c 100644 --- a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java +++ b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java @@ -48,8 +48,7 @@ public class AmqpDeadletterProperties { * @return the deadletter queue */ public Queue createDeadletterQueue(final String queueName) { - // getTTLArgs() - return new Queue(queueName, true, false, false, null); + return new Queue(queueName, true, false, false, getTTLArgs()); } private Map getTTLArgs() { From 702decee621284b3a0504e85bbcee7b5cb0c557c Mon Sep 17 00:00:00 2001 From: SirWayne Date: Tue, 19 Apr 2016 10:42:29 +0200 Subject: [PATCH 3/5] Rename deadletter queue and add ttl Signed-off-by: SirWayne --- .../src/main/resources/hawkbitdefaults.properties | 2 +- .../java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java | 6 ++++++ .../main/java/org/eclipse/hawkbit/amqp/AmqpProperties.java | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/hawkbit-autoconfigure/src/main/resources/hawkbitdefaults.properties b/hawkbit-autoconfigure/src/main/resources/hawkbitdefaults.properties index 198fce255..488777b8d 100644 --- a/hawkbit-autoconfigure/src/main/resources/hawkbitdefaults.properties +++ b/hawkbit-autoconfigure/src/main/resources/hawkbitdefaults.properties @@ -42,6 +42,6 @@ hawkbit.controller.minPollingTime=00:00:30 # Configuration for RabbitMQ integration -hawkbit.dmf.rabbitmq.deadLetterQueue=dmf_connector_deadletter +hawkbit.dmf.rabbitmq.deadLetterQueue=dmf_connector_deadletter_ttl hawkbit.dmf.rabbitmq.deadLetterExchange=dmf.connector.deadletter hawkbit.dmf.rabbitmq.receiverQueue=dmf_receiver \ No newline at end of file diff --git a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java index 448206924..20a11713f 100644 --- a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java +++ b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpConfiguration.java @@ -41,6 +41,12 @@ public class AmqpConfiguration { @Autowired private ConnectionFactory connectionFactory; + /** + * Create a {@link RabbitAdmin} and ignore declaration exceptions. + * {@link RabbitAdmin#setIgnoreDeclarationExceptions(boolean)} + * + * @return the bean + */ @Bean public RabbitAdmin rabbitAdmin() { final RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); diff --git a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpProperties.java b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpProperties.java index 38c6d34b3..ce6068ce8 100644 --- a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpProperties.java +++ b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpProperties.java @@ -21,7 +21,7 @@ public class AmqpProperties { /** * DMF API dead letter queue. */ - private String deadLetterQueue = "dmf_connector_deadletter"; + private String deadLetterQueue = "dmf_connector_deadletter_ttl"; /** * DMF API dead letter exchange. From 5437f36c7507048354df2021a2a72cc43e9bbca8 Mon Sep 17 00:00:00 2001 From: SirWayne Date: Tue, 19 Apr 2016 10:42:56 +0200 Subject: [PATCH 4/5] Rename deadletter queue and add ttl Signed-off-by: SirWayne --- .../src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/hawkbit-example-app/src/main/resources/application.properties b/examples/hawkbit-example-app/src/main/resources/application.properties index 7864087c8..64661d2ec 100644 --- a/examples/hawkbit-example-app/src/main/resources/application.properties +++ b/examples/hawkbit-example-app/src/main/resources/application.properties @@ -21,7 +21,7 @@ spring.rabbitmq.password=guest spring.rabbitmq.virtualHost=/ spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 -hawkbit.dmf.rabbitmq.deadLetterQueue=dmf_connector_deadletter +hawkbit.dmf.rabbitmq.deadLetterQueue=dmf_connector_deadletter_ttl hawkbit.dmf.rabbitmq.deadLetterExchange=dmf.connector.deadletter hawkbit.dmf.rabbitmq.receiverQueue=dmf_receiver From 9dd51e710544a58134ceb7d40981e3b0f0191c7e Mon Sep 17 00:00:00 2001 From: SirWayne Date: Wed, 27 Apr 2016 15:37:54 +0200 Subject: [PATCH 5/5] Use java 8 duration to calculate ttl Signed-off-by: SirWayne --- .../org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java index e9ad60a1c..7ed5e90c1 100644 --- a/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java +++ b/hawkbit-dmf-amqp/src/main/java/org/eclipse/hawkbit/amqp/AmqpDeadletterProperties.java @@ -8,6 +8,7 @@ */ package org.eclipse.hawkbit.amqp; +import java.time.Duration; import java.util.HashMap; import java.util.Map; @@ -25,7 +26,7 @@ public class AmqpDeadletterProperties { * Message time to live (ttl) for the deadletter queue. Default ttl is 3 * weeks. */ - private int ttl = 1_814_400_000; + private long ttl = Duration.ofDays(21).toMillis(); /** * Return the deadletter arguments. @@ -57,11 +58,11 @@ public class AmqpDeadletterProperties { return args; } - public int getTtl() { + public long getTtl() { return ttl; } - public void setTtl(final int ttl) { + public void setTtl(final long ttl) { this.ttl = ttl; }