{"id":3564,"date":"2016-04-06T01:25:54","date_gmt":"2016-04-06T01:25:54","guid":{"rendered":"http:\/\/www.garysieling.com\/blog\/?p=3564"},"modified":"2016-04-06T01:25:54","modified_gmt":"2016-04-06T01:25:54","slug":"using-rabbitmq-scala-futures","status":"publish","type":"post","link":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/","title":{"rendered":"Using RabbitMQ with Scala Futures"},"content":{"rendered":"<p>RabbitMQ and Futures provide related, but different functionality: RabbitMQ allows persistent storage for a queue of events, and Futures allow you to delegate lambda functions to a thread pool.<\/p>\n<p>To make this concrete, lets say we make a function that reads a task from RabbitMQ:<\/p>\n<pre lang=\"scala\">\ndef doSomething {\n  val factory = new ConnectionFactory()\n  factory.setHost(\"127.0.0.1\")\n  factory.setUsername(\"guest\")\n  factory.setPassword(\"guest\")\n  factory.setPort(5672)\n\n  val message = \n    new String(\n      factory\n        .newConnection\n        .createChannel\n        .basicGet(\"queueName\", true)\n        .getBody(),\n     \"UTF-8\")\n\n  println(message)\n}\n<\/pre>\n<p>Here we&#8217;re automatically acknowledging the task, if you want to guarantee the work is done before removing it from the queue, you can take control:<\/p>\n<pre lang=\"scala\">\nval deliveryTag =  \n  response\n    .getEnvelope()\n    .getDeliveryTag();\n\nchannel.basicAck(deliveryTag, false);\n<\/pre>\n<p>Now that we can retrieve a task from RabbitMQ, we can process it, and back new messages, and repeat &#8211; if notice that this resembles Akka, you may be interested to know that there are <a href=\"https:\/\/github.com\/thenewmotion\/akka-rabbitmq\">Akka-RabbitMQ connectors<\/a>.<\/p>\n<p>Without Akka, we have a single threaded application, so we can start several processes to handle tasks, if we want to parallelize it.<\/p>\n<p>Think this is a pain? Enter futures.<\/p>\n<p>Futures are just functions (like doSomething above), which we can create many of and queue. They are handled by an implicit thread queue.<\/p>\n<p>If you want to make your own, you can (this helps see how it works, and you can define the number of threads):<\/p>\n<pre lang=\"scala\">\nimplicit val ec = new ExecutionContext {\n   val threadPool = Executors.newFixedThreadPool(25)\n\n   def execute(runnable: Runnable) {\n     threadPool.submit(runnable)\n   }\n\n  def reportFailure(t: Throwable) {}\n}\n<\/pre>\n<p>I find that it can also be helpful to add code to your queued task to pull several RabbitMQ tasks in sequence, complete them, and then end. This gives you another point of control, as any used resources can be freed and re-allocated after a specified number of tasks or elapsed time. This is similar to how IIS worker processes operate, except in Scala you can do it yourself in ~20-30 lines of code.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>RabbitMQ and Futures provide related, but different functionality: RabbitMQ allows persistent storage for a queue of events, and Futures allow you to delegate lambda functions to a thread pool. To make this concrete, lets say we make a function that reads a task from RabbitMQ: def doSomething { val factory = new ConnectionFactory() factory.setHost(&#8220;127.0.0.1&#8221;) factory.setUsername(&#8220;guest&#8221;) &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Using RabbitMQ with Scala Futures&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[4],"tags":[453,480],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"RabbitMQ and Futures provide related, but different functionality: RabbitMQ allows persistent storage for a queue of events, and Futures allow you to delegate lambda functions to a thread pool. To make this concrete, lets say we make a function that reads a task from RabbitMQ: def doSomething { val factory = new ConnectionFactory() factory.setHost(&quot;127.0.0.1&quot;) factory.setUsername(&quot;guest&quot;)\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"gary\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Gary Sieling - Software Engineer\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Using RabbitMQ with Scala Futures - Gary Sieling\" \/>\n\t\t<meta property=\"og:description\" content=\"RabbitMQ and Futures provide related, but different functionality: RabbitMQ allows persistent storage for a queue of events, and Futures allow you to delegate lambda functions to a thread pool. To make this concrete, lets say we make a function that reads a task from RabbitMQ: def doSomething { val factory = new ConnectionFactory() factory.setHost(&quot;127.0.0.1&quot;) factory.setUsername(&quot;guest&quot;)\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2016-04-06T01:25:54+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2016-04-06T01:25:54+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Using RabbitMQ with Scala Futures - Gary Sieling\" \/>\n\t\t<meta name=\"twitter:description\" content=\"RabbitMQ and Futures provide related, but different functionality: RabbitMQ allows persistent storage for a queue of events, and Futures allow you to delegate lambda functions to a thread pool. To make this concrete, lets say we make a function that reads a task from RabbitMQ: def doSomething { val factory = new ConnectionFactory() factory.setHost(&quot;127.0.0.1&quot;) factory.setUsername(&quot;guest&quot;)\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-rabbitmq-scala-futures\\\/#blogposting\",\"name\":\"Using RabbitMQ with Scala Futures - Gary Sieling\",\"headline\":\"Using RabbitMQ with Scala Futures\",\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"},\"datePublished\":\"2016-04-06T01:25:54+00:00\",\"dateModified\":\"2016-04-06T01:25:54+00:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-rabbitmq-scala-futures\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-rabbitmq-scala-futures\\\/#webpage\"},\"articleSection\":\"Code Examples, rabbitmq, scala\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-rabbitmq-scala-futures\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"name\":\"Code Examples\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"position\":2,\"name\":\"Code Examples\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-rabbitmq-scala-futures\\\/#listItem\",\"name\":\"Using RabbitMQ with Scala Futures\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-rabbitmq-scala-futures\\\/#listItem\",\"position\":3,\"name\":\"Using RabbitMQ with Scala Futures\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/code-examples\\\/#listItem\",\"name\":\"Code Examples\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/\",\"name\":\"gary\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-rabbitmq-scala-futures\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"gary\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-rabbitmq-scala-futures\\\/#webpage\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-rabbitmq-scala-futures\\\/\",\"name\":\"Using RabbitMQ with Scala Futures - Gary Sieling\",\"description\":\"RabbitMQ and Futures provide related, but different functionality: RabbitMQ allows persistent storage for a queue of events, and Futures allow you to delegate lambda functions to a thread pool. To make this concrete, lets say we make a function that reads a task from RabbitMQ: def doSomething { val factory = new ConnectionFactory() factory.setHost(\\\"127.0.0.1\\\") factory.setUsername(\\\"guest\\\")\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-rabbitmq-scala-futures\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"datePublished\":\"2016-04-06T01:25:54+00:00\",\"dateModified\":\"2016-04-06T01:25:54+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Using RabbitMQ with Scala Futures - Gary Sieling","description":"RabbitMQ and Futures provide related, but different functionality: RabbitMQ allows persistent storage for a queue of events, and Futures allow you to delegate lambda functions to a thread pool. To make this concrete, lets say we make a function that reads a task from RabbitMQ: def doSomething { val factory = new ConnectionFactory() factory.setHost(\"127.0.0.1\") factory.setUsername(\"guest\")","canonical_url":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/#blogposting","name":"Using RabbitMQ with Scala Futures - Gary Sieling","headline":"Using RabbitMQ with Scala Futures","author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"},"datePublished":"2016-04-06T01:25:54+00:00","dateModified":"2016-04-06T01:25:54+00:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/#webpage"},"isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/#webpage"},"articleSection":"Code Examples, rabbitmq, scala"},{"@type":"BreadcrumbList","@id":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.garysieling.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","name":"Code Examples"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","position":2,"name":"Code Examples","item":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/#listItem","name":"Using RabbitMQ with Scala Futures"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/#listItem","position":3,"name":"Using RabbitMQ with Scala Futures","previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/#listItem","name":"Code Examples"}}]},{"@type":"Organization","@id":"https:\/\/www.garysieling.com\/blog\/#organization","name":"Gary Sieling","description":"Software Engineer","url":"https:\/\/www.garysieling.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author","url":"https:\/\/www.garysieling.com\/blog\/author\/gary\/","name":"gary","image":{"@type":"ImageObject","@id":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g","width":96,"height":96,"caption":"gary"}},{"@type":"WebPage","@id":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/#webpage","url":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/","name":"Using RabbitMQ with Scala Futures - Gary Sieling","description":"RabbitMQ and Futures provide related, but different functionality: RabbitMQ allows persistent storage for a queue of events, and Futures allow you to delegate lambda functions to a thread pool. To make this concrete, lets say we make a function that reads a task from RabbitMQ: def doSomething { val factory = new ConnectionFactory() factory.setHost(\"127.0.0.1\") factory.setUsername(\"guest\")","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/#breadcrumblist"},"author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"creator":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"datePublished":"2016-04-06T01:25:54+00:00","dateModified":"2016-04-06T01:25:54+00:00"},{"@type":"WebSite","@id":"https:\/\/www.garysieling.com\/blog\/#website","url":"https:\/\/www.garysieling.com\/blog\/","name":"Gary Sieling","description":"Software Engineer","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Gary Sieling - Software Engineer","og:type":"article","og:title":"Using RabbitMQ with Scala Futures - Gary Sieling","og:description":"RabbitMQ and Futures provide related, but different functionality: RabbitMQ allows persistent storage for a queue of events, and Futures allow you to delegate lambda functions to a thread pool. To make this concrete, lets say we make a function that reads a task from RabbitMQ: def doSomething { val factory = new ConnectionFactory() factory.setHost(&quot;127.0.0.1&quot;) factory.setUsername(&quot;guest&quot;)","og:url":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/","article:published_time":"2016-04-06T01:25:54+00:00","article:modified_time":"2016-04-06T01:25:54+00:00","twitter:card":"summary_large_image","twitter:title":"Using RabbitMQ with Scala Futures - Gary Sieling","twitter:description":"RabbitMQ and Futures provide related, but different functionality: RabbitMQ allows persistent storage for a queue of events, and Futures allow you to delegate lambda functions to a thread pool. To make this concrete, lets say we make a function that reads a task from RabbitMQ: def doSomething { val factory = new ConnectionFactory() factory.setHost(&quot;127.0.0.1&quot;) factory.setUsername(&quot;guest&quot;)"},"aioseo_meta_data":{"post_id":"3564","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"created":"2023-02-04 16:46:35","updated":"2026-07-06 01:42:51","ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/\" title=\"Code Examples\">Code Examples<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tUsing RabbitMQ with Scala Futures\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.garysieling.com\/blog"},{"label":"Code Examples","link":"https:\/\/www.garysieling.com\/blog\/category\/code-examples\/"},{"label":"Using RabbitMQ with Scala Futures","link":"https:\/\/www.garysieling.com\/blog\/using-rabbitmq-scala-futures\/"}],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/3564"}],"collection":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/comments?post=3564"}],"version-history":[{"count":0,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/3564\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/media?parent=3564"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/categories?post=3564"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/tags?post=3564"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}