{"id":260947,"date":"2015-07-08T14:28:02","date_gmt":"2015-07-08T10:28:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=260947"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=260947","title":{"rendered":"RabbitMQ Spring tutorial"},"content":{"rendered":"<p>             \u041d\u0430 \u0441\u0430\u0439\u0442\u0435 <a href=\"http:\/\/www.rabbitmq.com\/\">rabbitmq.com<\/a> \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f java. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0440\u0438\u043d\u0433, \u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"http:\/\/projects.spring.io\/spring-amqp\/\">Spring AMQP<\/a>. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <a href=\"http:\/\/www.rabbitmq.com\/getstarted.html\">\u0432\u0441\u0435\u0445 \u0448\u0435\u0441\u0442\u0438<\/a> \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 RabbitMQ. <br \/>  <a name=\"habracut\"><\/a><br \/>  \u0421\u0440\u0430\u0437\u0443 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 <a href=\"https:\/\/github.com\/Dmitry-Shweikus\/rabbitmq-examples\">GitHub<\/a>.<\/p>\n<p>  \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u043f\u0440\u0438\u043d\u0433\u0435. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u0442 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435, \u0432 RabbitMQ \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0438\u0437 \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u043e\u0432. \u041b\u0438\u0441\u0442\u0435\u043d\u0435\u0440 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043b\u043e\u0433. \u041d\u0430 \u0445\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432 \u043d\u0430 php \u0438 python, \u0438 \u044f \u0434\u0443\u043c\u0430\u044e \u043c\u043d\u043e\u0433\u0438\u0435 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u044b rabbitmq, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u0443\u044e\u0441\u044c \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 Spring AMQP.<\/p>\n<h1>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430<\/h1>\n<p>  <\/p>\n<h2>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 RabbitMQ<\/h2>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 RabbitMQ \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0430 <a href=\"http:\/\/www.rabbitmq.com\/download.html\">\u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435<\/a>. \u0422\u0443\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e. <\/p>\n<h2>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Spring<\/h2>\n<p>  \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <a href=\"http:\/\/projects.spring.io\/spring-boot\/\">Spring Boot<\/a>. \u041e\u043d \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u043f\u0440\u0438\u043d\u0433\u0435 \u0438 \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0435\u0433\u043e \u0434\u043e\u043b\u0433\u0438\u043c \u043a\u043e\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u0430\u043c Spring AMQP \u044f \u0431\u0443\u0434\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c\u00bb \u2014 \u0442.\u0435. \u0442\u0430\u043a, \u043a\u0430\u043a \u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0435\u0437 Spring Boot (\u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u0432 ConnectionFactory \u043d\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f heroku \u0432\u0435\u0449\u0438).<\/p>\n<p>  C\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e pom.xml \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u043d\u0430\u043c \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c Spring boot \u0438 Spring AMQP.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;project xmlns=&quot;http:\/\/maven.apache.org\/POM\/4.0.0&quot;          xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;          xsi:schemaLocation=&quot;http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd&quot;&gt;     &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;      &lt;groupId&gt;rabbitmq&lt;\/groupId&gt;     &lt;artifactId&gt;example-1&lt;\/artifactId&gt;     &lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt;     &lt;parent&gt;         &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;         &lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;         &lt;version&gt;1.2.4.RELEASE&lt;\/version&gt;     &lt;\/parent&gt;     &lt;dependencies&gt;         &lt;dependency&gt;             &lt;groupId&gt;org.springframework.amqp&lt;\/groupId&gt;             &lt;artifactId&gt;spring-rabbit&lt;\/artifactId&gt;             &lt;version&gt;1.4.5.RELEASE&lt;\/version&gt;         &lt;\/dependency&gt;         &lt;dependency&gt;             &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;             &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;         &lt;\/dependency&gt;     &lt;\/dependencies&gt; &lt;\/project&gt; <\/code><\/pre>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041a\u0440\u043e\u043c\u0435 \u0438\u043c\u0435\u043d\u0438 \u043a\u043b\u0430\u0441\u0441\u0430, \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432.<\/p>\n<pre><code class=\"java\">package com.rabbitmq.example1;  import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import;  @EnableAutoConfiguration @ComponentScan @Import(RabbitConfiguration.class) public class Example1Configuration {     public static void main(String[] args) throws Exception {         SpringApplication.run(Example1Configuration.class, args);     } } <\/code><\/pre>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 1. \u00abHello World!\u00bb<\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/b3c\/acd\/477\/b3cacd47781f4493a1018275b1b003bb.png\"\/><\/p>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 RabbitMQ \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0431\u0438\u043d\u044b:<br \/>   \u2014 \u0441onnectionFactory \u2014 \u0434\u043b\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 RabbitMQ;<br \/>   \u2014 rabbitAdmin \u2014 \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438\/\u043e\u0442\u043c\u0435\u043d\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0438 \u0442.\u043f.;<br \/>   \u2014 rabbitTemplate \u2014 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (producer);<br \/>   \u2014 myQueue1 \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043a\u0443\u0434\u0430 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f;<br \/>   \u2014 messageListenerContainer \u2014 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (consumer).<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0431\u0438\u043d\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.rabbitmq.example1;  import org.apache.log4j.Logger; import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageListener; import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; 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.context.annotation.Bean;  public class RabbitConfiguration {     Logger logger = Logger.getLogger(RabbitConfiguration.class);      \/\/\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 RabbitMQ     @Bean     public ConnectionFactory connectionFactory() {         CachingConnectionFactory connectionFactory =                 new CachingConnectionFactory(&quot;localhost&quot;);         return connectionFactory;     }      @Bean     public AmqpAdmin amqpAdmin() {         return new RabbitAdmin(connectionFactory());     }      @Bean     public RabbitTemplate rabbitTemplate() {         return new RabbitTemplate(connectionFactory());     }      \/\/\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u0438\u043c\u0435\u043d\u0435\u043c queue1     @Bean     public Queue myQueue1() {         return new Queue(&quot;queue1&quot;);     }      \/\/\u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440 \u0434\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439     @Bean     public SimpleMessageListenerContainer messageListenerContainer1() {         SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();         container.setConnectionFactory(connectionFactory());         container.setQueueNames(&quot;queue1&quot;);         container.setMessageListener(new MessageListener() {         \t\/\/\u0442\u0443\u0442 \u043b\u043e\u0432\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 queue1             public void onMessage(Message message) {                 logger.info(&quot;received from queue1 : &quot; + new String(message.getBody()));             }         });         return container;     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0434\u044e\u0441\u0441\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 rabbitmq. <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example1;  import org.apache.log4j.Logger; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;  @Controller public class SampleController {     Logger logger = Logger.getLogger(SampleController.class);      @Autowired     AmqpTemplate template;      @RequestMapping(&quot;\/emit&quot;)     @ResponseBody     String queue1() {         logger.info(&quot;Emit to queue1&quot;);         template.convertAndSend(&quot;queue1&quot;,&quot;Message to queue&quot;);         return &quot;Emit to queue&quot;;     } } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Example1Configuration \u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <a href=\"http:\/\/localhost:8080\/emit\">http:\/\/localhost:8080\/emit<\/a>, \u0442\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre> 2015-06-23 21:16:26.250  INFO 6460 --- [nio-8080-exec-2] com.rabbitmq.example1.SampleController   : Emit to queue1 2015-06-23 21:16:26.252  INFO 6460 --- [cTaskExecutor-1] c.rabbitmq.example1.RabbitConfiguration  : received from queue 1: Message to queue <\/pre>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0422\u0443\u0442 \u043c\u044b \u0432 SampleController.java \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"java\">template.convertAndSend(&quot;queue1&quot;,&quot;Message to queue&quot;); <\/code><\/pre>\n<p>  \u0410 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre><code class=\"java\">public void onMessage(Message message) {     logger.info(&quot;received from queue 1: &quot; + new String(message.getBody())); } <\/code><\/pre>\n<p>  \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u044b \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0438\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e. \u0413\u043e\u0440\u0430\u0437\u0434\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u044b \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438. <\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 1.1. \u00abHello World!\u00bb \u043d\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u0445<\/h2>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u0430 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441 RabbitMqListener, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e messageListenerContainer1 \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d.<\/p>\n<p>  RabbitMqListener \u2014 \u044d\u0442\u043e \u043e\u0431\u044b\u043a\u043d\u043e\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442(@Component) \u0441\u043f\u0440\u0438\u043d\u0433\u0430 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u043c \u0430\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439  @RabbitListener. \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 <a href=\"http:\/\/docs.spring.io\/autorepo\/docs\/spring-amqp-dist\/1.4.2.M1\/api\/org\/springframework\/amqp\/core\/Message.html\">Message<\/a> \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c\u0438 \u0438 \u0442\u0435\u043b\u043e\u043c \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442, \u0442\u0430\u043a \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u0432 \u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u0432 \u043a\u0430\u043a\u043e\u043c \u043c\u044b \u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438.<\/p>\n<pre><code class=\"java\">    @RabbitListener(queues = &quot;queue1&quot;)     public void processQueue1(String message) {         logger.info(&quot;Received from queue 1: &quot; + message);     } <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 RabbitMqListener.java \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e RabbitConfiguration.java<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.rabbitmq.example1annotated;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.annotation.EnableRabbit; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;  @EnableRabbit \/\/\u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 @RabbitListener @Component public class RabbitMqListener {     Logger logger = Logger.getLogger(RabbitMqListener.class);      @RabbitListener(queues = &quot;queue1&quot;)     public void processQueue1(String message) {         logger.info(&quot;Received from queue 1: &quot; + message);     } }  <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example1annotated;  import org.apache.log4j.Logger; import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  @Configuration public class RabbitConfiguration {     Logger logger = Logger.getLogger(RabbitConfiguration.class);     @Bean     public ConnectionFactory connectionFactory() {         CachingConnectionFactory connectionFactory =                 new CachingConnectionFactory(&quot;localhost&quot;);         return connectionFactory;     }      @Bean     public AmqpAdmin amqpAdmin() {         return new RabbitAdmin(connectionFactory());     }      @Bean     public RabbitTemplate rabbitTemplate() {         return new RabbitTemplate(connectionFactory());     }      @Bean     public Queue myQueue1() {         return new Queue(&quot;queue1&quot;);     }  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 2. Work Queues<\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d77\/b67\/9d3\/d77b679d32204eafaa8dc2b7d78cd1c6.png\"\/><\/p>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043e\u0434\u043d\u0443 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u043b\u0443\u0448\u0430\u044e\u0442 \u0443\u0436\u0435 \u0434\u0432\u0430 \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u0430. \u0414\u043b\u044f \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Thread.sleep. \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u043b\u0438\u0441\u0442\u0435\u043d\u0435\u0440\u044b \u043e\u0434\u043d\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432 \u0438\u043b\u0438 \u043d\u043e\u0434 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435.<\/p>\n<pre><code class=\"java\">    @RabbitListener(queues = &quot;query-example-2&quot;)     public void worker1(String message) throws InterruptedException {         logger.info(&quot;worker 1 : &quot; + message);         Thread.sleep(100 * random.nextInt(20));     }      @RabbitListener(queues = &quot;query-example-2&quot;)     public void worker2(String message) throws InterruptedException {         logger.info(&quot;worker 2 : &quot; + message);         Thread.sleep(100 * random.nextInt(20));     } <\/code><\/pre>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:  <\/p>\n<pre> 2015-06-23 22:03:48.018  INFO 6784 --- [nio-8080-exec-1] com.rabbitmq.example2.SampleController   : Emit to queue 2015-06-23 22:03:48.029  INFO 6784 --- [cTaskExecutor-1] com.rabbitmq.example2.RabbitMqListener   : worker 2 : Message 1 2015-06-23 22:03:48.029  INFO 6784 --- [cTaskExecutor-1] com.rabbitmq.example2.RabbitMqListener   : worker 1 : Message 0 2015-06-23 22:03:48.830  INFO 6784 --- [cTaskExecutor-1] com.rabbitmq.example2.RabbitMqListener   : worker 2 : Message 2 2015-06-23 22:03:49.331  INFO 6784 --- [cTaskExecutor-1] com.rabbitmq.example2.RabbitMqListener   : worker 2 : Message 3 2015-06-23 22:03:49.432  INFO 6784 --- [cTaskExecutor-1] com.rabbitmq.example2.RabbitMqListener   : worker 2 : Message 4 2015-06-23 22:03:49.634  INFO 6784 --- [cTaskExecutor-1] com.rabbitmq.example2.RabbitMqListener   : worker 1 : Message 5 2015-06-23 22:03:49.733  INFO 6784 --- [cTaskExecutor-1] com.rabbitmq.example2.RabbitMqListener   : worker 2 : Message 6 2015-06-23 22:03:49.735  INFO 6784 --- [cTaskExecutor-1] com.rabbitmq.example2.RabbitMqListener   : worker 1 : Message 7 2015-06-23 22:03:50.236  INFO 6784 --- [cTaskExecutor-1] com.rabbitmq.example2.RabbitMqListener   : worker 1 : Message 8 2015-06-23 22:03:50.537  INFO 6784 --- [cTaskExecutor-1] com.rabbitmq.example2.RabbitMqListener   : worker 1 : Message 9 <\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 RabbitMqListener.java \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e SampleController.java<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.rabbitmq.example2;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;  import java.util.Random;  @Component public class RabbitMqListener {     Logger logger = Logger.getLogger(RabbitMqListener.class);     Random random = new Random();      @RabbitListener(queues = &quot;query-example-2&quot;)     public void worker1(String message) throws InterruptedException {         logger.info(&quot;worker 1 : &quot; + message);         Thread.sleep(100 * random.nextInt(20));     }      @RabbitListener(queues = &quot;query-example-2&quot;)     public void worker2(String message) throws InterruptedException {         logger.info(&quot;worker 2 : &quot; + message);         Thread.sleep(100 * random.nextInt(20));     }  }\t <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example2;  import org.apache.log4j.Logger; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;   @Controller public class SampleController {     Logger logger = Logger.getLogger(SampleController.class);      @Autowired     AmqpTemplate template;      @RequestMapping(&quot;\/queue&quot;)     @ResponseBody     String queue1() {         logger.info(&quot;Emit to queue&quot;);         for(int i = 0;i&lt;10;i++)             template.convertAndSend(&quot;query-example-2&quot;,&quot;Message &quot; + i);         return &quot;Emit to queue&quot;;     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 3. Publish\/Subscribe<\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/551\/02c\/5a3\/55102c5a339845ed973eb1418f825543.png\"\/><\/p>\n<p>  \u0422\u0443\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0443\u043c \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430\u043c.<\/p>\n<pre> 2015-06-23 22:12:24.669  INFO 1664 --- [nio-8080-exec-1] com.rabbitmq.example3.SampleController   : Emit to exchange-example-3 2015-06-23 22:12:24.684  INFO 1664 --- [cTaskExecutor-1] com.rabbitmq.example3.RabbitMqListener   : accepted on worker 1 : Fanout message 2015-06-23 22:12:24.684  INFO 1664 --- [cTaskExecutor-1] com.rabbitmq.example3.RabbitMqListener   : accepted on worker 2 : Fanout message <\/pre>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043e\u0431\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043a FanoutExchange:<\/p>\n<pre><code class=\"java\">    @Bean     public FanoutExchange fanoutExchangeA(){         return new FanoutExchange(&quot;exchange-example-3&quot;);     }      @Bean     public Binding binding1(){         return BindingBuilder.bind(myQueue1()).to(fanoutExchangeA());     }      @Bean     public Binding binding2(){         return BindingBuilder.bind(myQueue2()).to(fanoutExchangeA());     } <\/code><\/pre>\n<p>  \u0418 \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0430 \u0432 exchange exchange-example-3:<\/p>\n<pre><code class=\"java\">    template.setExchange(&quot;exchange-example-3&quot;);     template.convertAndSend(&quot;Fanout message&quot;); <\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c exchange \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 RabbitTemplate.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.rabbitmq.example3;  import org.apache.log4j.Logger; import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.annotation.EnableRabbit; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  @EnableRabbit @Configuration public class RabbitConfiguration {     Logger logger = Logger.getLogger(RabbitConfiguration.class);      @Bean     public ConnectionFactory connectionFactory() {         CachingConnectionFactory connectionFactory =                 new CachingConnectionFactory(&quot;localhost&quot;);         return connectionFactory;     }      @Bean     public AmqpAdmin amqpAdmin() {         RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());         return rabbitAdmin;     }      @Bean     public RabbitTemplate rabbitTemplate() {         RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());         return rabbitTemplate;     }       @Bean     public Queue myQueue1() {         return new Queue(&quot;query-example-3-1&quot;);     }      @Bean     public Queue myQueue2() {         return new Queue(&quot;query-example-3-2&quot;);     }      @Bean     public FanoutExchange fanoutExchangeA(){         return new FanoutExchange(&quot;exchange-example-3&quot;);     }      @Bean     public Binding binding1(){         return BindingBuilder.bind(myQueue1()).to(fanoutExchangeA());     }      @Bean     public Binding binding2(){         return BindingBuilder.bind(myQueue2()).to(fanoutExchangeA());     }  } <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example3;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;  import java.util.Random;  @Component public class RabbitMqListener {     Logger logger = Logger.getLogger(RabbitMqListener.class);     Random random = new Random();      @RabbitListener(queues = &quot;query-example-3-1&quot;)     public void worker1(String message) {         logger.info(&quot;accepted on worker 1 : &quot; + message);     }      @RabbitListener(queues = &quot;query-example-3-2&quot;)     public void worker2(String message) {         logger.info(&quot;accepted on worker 2 : &quot; + message);     }  } <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example3;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;   @Controller public class SampleController {     Logger logger = Logger.getLogger(SampleController.class);      @Autowired     RabbitTemplate template;      @RequestMapping(&quot;\/&quot;)     @ResponseBody     String home() {         return &quot;Empty mapping&quot;;     }      @RequestMapping(&quot;\/emit&quot;)     @ResponseBody     String emit() {         logger.info(&quot;Emit to exchange-example-3&quot;);         template.setExchange(&quot;exchange-example-3&quot;);         template.convertAndSend(&quot;Fanout message&quot;);         return &quot;Emit to exchange-example-3&quot;;     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 4. Routing<\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/804\/21c\/1cf\/80421c1cfaa54a789bf388f11a10a1a8.png\"\/><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f routing key, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u043e\u0434\u043d\u0443 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0438\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0432 \u043e\u0431\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043c\u0435\u0441\u0442\u043e FanoutExchange \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c DirectExchange:<\/p>\n<pre><code class=\"java\">    @Bean     public DirectExchange directExchange(){         return new DirectExchange(&quot;exchange-example-4&quot;);     }      @Bean     public Binding errorBinding1(){         return BindingBuilder.bind(myQueue1()).to(directExchange()).with(&quot;error&quot;);     }      @Bean     public Binding errorBinding2(){         return BindingBuilder.bind(myQueue2()).to(directExchange()).with(&quot;error&quot;);     }      @Bean     public Binding infoBinding(){         return BindingBuilder.bind(myQueue2()).to(directExchange()).with(&quot;info&quot;);     }      @Bean     public Binding warningBinding(){         return BindingBuilder.bind(myQueue2()).to(directExchange()).with(&quot;warning&quot;);     } <\/code><\/pre>\n<p>  \u0418 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c Routing key, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">    template.convertAndSend(&quot;info&quot;, &quot;Info&quot;); <\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre> 2015-06-23 22:29:24.480  INFO 5820 --- [nio-8080-exec-2] com.rabbitmq.example4.SampleController   : Emit as info 2015-06-23 22:29:24.483  INFO 5820 --- [cTaskExecutor-1] com.rabbitmq.example4.RabbitMqListener   : accepted on worker 2 : Info 2015-06-23 22:29:29.721  INFO 5820 --- [nio-8080-exec-4] com.rabbitmq.example4.SampleController   : Emit as error 2015-06-23 22:29:29.727  INFO 5820 --- [cTaskExecutor-1] com.rabbitmq.example4.RabbitMqListener   : accepted on worker 2 : Error 2015-06-23 22:29:29.731  INFO 5820 --- [cTaskExecutor-1] com.rabbitmq.example4.RabbitMqListener   : accepted on worker 1 : Error 2015-06-23 22:29:36.779  INFO 5820 --- [nio-8080-exec-5] com.rabbitmq.example4.SampleController   : Emit as warning 2015-06-23 22:29:36.781  INFO 5820 --- [cTaskExecutor-1] com.rabbitmq.example4.RabbitMqListener   : accepted on worker 2 : Warning <\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.rabbitmq.example4;  import org.apache.log4j.Logger; import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.annotation.EnableRabbit; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  @EnableRabbit @Configuration public class RabbitConfiguration {     Logger logger = Logger.getLogger(RabbitConfiguration.class);      @Bean     public ConnectionFactory connectionFactory() {         CachingConnectionFactory connectionFactory =                 new CachingConnectionFactory(&quot;localhost&quot;);         return connectionFactory;     }      @Bean     public AmqpAdmin amqpAdmin() {         RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());         return rabbitAdmin;     }      @Bean     public RabbitTemplate rabbitTemplate() {         RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());         rabbitTemplate.setExchange(&quot;exchange-example-4&quot;);         return rabbitTemplate;     }      @Bean     public Queue myQueue1() {         return new Queue(&quot;query-example-4-1&quot;);     }      @Bean     public Queue myQueue2() {         return new Queue(&quot;query-example-4-2&quot;);     }      @Bean     public DirectExchange directExchange(){         return new DirectExchange(&quot;exchange-example-4&quot;);     }      @Bean     public Binding errorBinding1(){         return BindingBuilder.bind(myQueue1()).to(directExchange()).with(&quot;error&quot;);     }      @Bean     public Binding errorBinding2(){         return BindingBuilder.bind(myQueue2()).to(directExchange()).with(&quot;error&quot;);     }      @Bean     public Binding infoBinding(){         return BindingBuilder.bind(myQueue2()).to(directExchange()).with(&quot;info&quot;);     }      @Bean     public Binding warningBinding(){         return BindingBuilder.bind(myQueue2()).to(directExchange()).with(&quot;warning&quot;);     }  } <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example4;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;  import java.util.Random;  @Component public class RabbitMqListener {     Logger logger = Logger.getLogger(RabbitMqListener.class);     Random random = new Random();      @RabbitListener(queues = &quot;query-example-4-1&quot;)     public void worker1(String message) {         logger.info(&quot;accepted on worker 1 : &quot; + message);     }      @RabbitListener(queues = &quot;query-example-4-2&quot;)     public void worker2(String message) {         logger.info(&quot;accepted on worker 2 : &quot; + message);     }  } <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example4;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;  @Controller public class SampleController {     Logger logger = Logger.getLogger(SampleController.class);      @Autowired     RabbitTemplate template;      @RequestMapping(&quot;\/&quot;)     @ResponseBody     String home() {         return &quot;Empty mapping&quot;;     }      @RequestMapping(&quot;\/emit\/error&quot;)     @ResponseBody     String error() {         logger.info(&quot;Emit as error&quot;);         template.convertAndSend(&quot;error&quot;, &quot;Error&quot;);         return &quot;Emit as error&quot;;     }      @RequestMapping(&quot;\/emit\/info&quot;)     @ResponseBody     String info() {         logger.info(&quot;Emit as info&quot;);         template.convertAndSend(&quot;info&quot;, &quot;Info&quot;);         return &quot;Emit as info&quot;;     }      @RequestMapping(&quot;\/emit\/warning&quot;)     @ResponseBody     String warning() {         logger.info(&quot;Emit as warning&quot;);         template.convertAndSend(&quot;warning&quot;, &quot;Warning&quot;);         return &quot;Emit as warning&quot;;     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 5. Topics<\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/73f\/c40\/d68\/73fc40d68dae4bd1a470e178a7747813.png\"\/><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u043c\u0435\u0441\u0442\u043e DirectExchange \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c TopicExchange  <\/p>\n<pre><code class=\"java\">    @Bean     public TopicExchange topicExchange(){         return new TopicExchange(&quot;exchange-example-5&quot;);     }      @Bean     public Binding binding1(){         return BindingBuilder.bind(myQueue1()).to(topicExchange()).with(&quot;*.orange.*&quot;);     }      @Bean     public Binding binding2(){         return BindingBuilder.bind(myQueue2()).to(topicExchange()).with(&quot;*.*.rabbit&quot;);     }      @Bean     public Binding binding3(){         return BindingBuilder.bind(myQueue2()).to(topicExchange()).with(&quot;lazy.#&quot;);     } <\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre> 2015-06-23 22:42:28.414  INFO 6560 --- [nio-8080-exec-1] com.rabbitmq.example5.SampleController   : Emit 'to 1 and 2' to 'quick.orange.rabbit' 2015-06-23 22:42:28.428  INFO 6560 --- [cTaskExecutor-1] com.rabbitmq.example5.RabbitMqListener   : accepted on worker 2 : to 1 and 2 2015-06-23 22:42:28.428  INFO 6560 --- [cTaskExecutor-1] com.rabbitmq.example5.RabbitMqListener   : accepted on worker 1 : to 1 and 2 2015-06-23 22:42:55.802  INFO 6560 --- [nio-8080-exec-2] com.rabbitmq.example5.SampleController   : Emit 'to 2' to 'lazy.black.cat' 2015-06-23 22:42:55.805  INFO 6560 --- [cTaskExecutor-1] com.rabbitmq.example5.RabbitMqListener   : accepted on worker 2 : to 2 <\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.rabbitmq.example5;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;   @Controller public class SampleController {     Logger logger = Logger.getLogger(SampleController.class);      @Autowired     RabbitTemplate template;      @RequestMapping(&quot;\/&quot;)     @ResponseBody     String home() {         return &quot;Empty mapping&quot;;     }      @RequestMapping(&quot;\/emit\/{key}\/{message}&quot;)     @ResponseBody     String error(@PathVariable(&quot;key&quot;) String key, @PathVariable(&quot;message&quot;) String message) {         logger.info(String.format(&quot;Emit '%s' to '%s'&quot;,message,key));         template.convertAndSend(key, message);         return String.format(&quot;Emit '%s' to '%s'&quot;,message,key);     } } <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example5;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;  import java.util.Random;  @Component public class RabbitMqListener {     Logger logger = Logger.getLogger(RabbitMqListener.class);     Random random = new Random();      @RabbitListener(queues = &quot;query-example-5-1&quot;)     public void worker1(String message) {         logger.info(&quot;accepted on worker 1 : &quot; + message);     }      @RabbitListener(queues = &quot;query-example-5-2&quot;)     public void worker2(String message) {         logger.info(&quot;accepted on worker 2 : &quot; + message);     }  } <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example5;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;   @Controller public class SampleController {     Logger logger = Logger.getLogger(SampleController.class);      @Autowired     RabbitTemplate template;      @RequestMapping(&quot;\/&quot;)     @ResponseBody     String home() {         return &quot;Empty mapping&quot;;     }      @RequestMapping(&quot;\/emit\/{key}\/{message}&quot;)     @ResponseBody     String error(@PathVariable(&quot;key&quot;) String key, @PathVariable(&quot;message&quot;) String message) {         logger.info(String.format(&quot;Emit '%s' to '%s'&quot;,message,key));         template.convertAndSend(key, message);         return String.format(&quot;Emit '%s' to '%s'&quot;,message,key);     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 6. Remote procedure call (RPC)<\/h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/7da\/867\/303\/7da8673033db407aa58c3e02fc7fa711.png\"\/><\/p>\n<p>  Spring AMQP \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c convertSendAndReceive, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043f\u0440\u0438 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 RabbitMQ \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043e 3.4.0, \u0442\u043e \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u042d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0440\u0443\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443 \u0442\u0430\u043a\u0436\u0435 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0451 \u043a\u0430\u043a ReplyQueue \u0443 RabbitTemplate. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0443 \u043d\u0430\u0441 RabbitMQ \u0432\u0435\u0440\u0441\u0438\u0438 3.4.0 \u0438 \u0432\u044b\u0448\u0435, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c Direct reply-to, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 <a href=\"http:\/\/docs.spring.io\/spring-amqp\/docs\/1.4.5.RELEASE\/reference\/html\/amqp.html#direct-reply-to\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e Spring AMQP<\/a>.<\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439:<\/p>\n<pre><code class=\"java\">    String response = (String) template.convertSendAndReceive(&quot;query-example-6&quot;,message); <\/code><\/pre>\n<p>  \u0410 \u0442\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0435:<\/p>\n<pre><code class=\"java\">    @RabbitListener(queues = &quot;query-example-6&quot;)     public String worker1(String message) throws InterruptedException {         logger.info(&quot;received on worker : &quot; + message);         Thread.sleep(3000); \/\/\u044d\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443         return &quot;received on worker : &quot; + message;     } <\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre> 2015-06-23 23:12:36.677  INFO 6536 --- [nio-8080-exec-5] com.rabbitmq.example6.SampleController   : Emit 'Hello world' 2015-06-23 23:12:36.679  INFO 6536 --- [cTaskExecutor-1] com.rabbitmq.example6.RabbitMqListener   : Received on worker : Hello world 2015-06-23 23:12:39.681  INFO 6536 --- [nio-8080-exec-5] com.rabbitmq.example6.SampleController   : Received on producer 'Received on worker : Hello world' <\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.rabbitmq.example6;  import org.apache.log4j.Logger; import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Queue; import org.springframework.amqp.rabbit.annotation.EnableRabbit; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitAdmin; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  @EnableRabbit @Configuration public class RabbitConfiguration {     Logger logger = Logger.getLogger(RabbitConfiguration.class);      @Bean     public ConnectionFactory connectionFactory() {         CachingConnectionFactory connectionFactory =                 new CachingConnectionFactory(&quot;localhost&quot;);         return connectionFactory;     }      @Bean     public AmqpAdmin amqpAdmin() {         RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());         return rabbitAdmin;     }      @Bean     public RabbitTemplate rabbitTemplate() {         RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());         rabbitTemplate.setQueue(&quot;query-example-6&quot;);         rabbitTemplate.setReplyTimeout(60 * 1000);         \/\/no reply to - we use direct-reply-to         return rabbitTemplate;     }      @Bean     public Queue myQueue() {         return new Queue(&quot;query-example-6&quot;);     } } <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example6;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;  import java.util.Random;  @Component public class RabbitMqListener {     Logger logger = Logger.getLogger(RabbitMqListener.class);      @RabbitListener(queues = &quot;query-example-6&quot;)     public String worker1(String message) throws InterruptedException {         logger.info(&quot;Received on worker : &quot; + message);         Thread.sleep(3000);         return &quot;Received on worker : &quot; + message;     } } <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">package com.rabbitmq.example6;  import org.apache.log4j.Logger; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;   @Controller public class SampleController {     Logger logger = Logger.getLogger(SampleController.class);      @Autowired     RabbitTemplate template;      @RequestMapping(&quot;\/&quot;)     @ResponseBody     String home() {         return &quot;Empty mapping&quot;;     }      @RequestMapping(&quot;\/process\/{message}&quot;)     @ResponseBody     String error(@PathVariable(&quot;message&quot;) String message) {         logger.info(String.format(&quot;Emit '%s'&quot;,message));         String response = (String) template.convertSendAndReceive(&quot;query-example-6&quot;,message);         logger.info(String.format(&quot;Received on producer '%s'&quot;,response));         return String.valueOf(&quot;returned from worker : &quot; + response);     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0423 \u0441\u0435\u0431\u044f \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b RabbitMQ \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u043c \u0445\u043e\u0441\u0442\u0438\u043d\u0433\u0435 heroku. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c RabbitMQ \u0432 heroku \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 RabbitMQ \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u0440\u043e\u043b\u0438\u043a\u0443. \u042d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 connectionFactory.<\/p>\n<pre><code class=\"java\">\t@Bean \tpublic ConnectionFactory connectionFactory() \t{ \t\t\/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 AMQP \u0443 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \t\tString uri = System.getenv(&quot;CLOUDAMQP_URL&quot;); \t\tif (uri == null) \/\/\u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u044b \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 rabbitmq \t\t\turi = &quot;amqp:\/\/guest:guest@localhost&quot;; \t\tURI url = null; \t\ttry \t\t{ \t\t\turl = new URI(uri); \t\t} catch (URISyntaxException e) \t\t{ \t\t\te.printStackTrace(); \/\/\u0442\u0443\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u0440\u0430\u0439\u043d\u0435 \u043c\u0430\u043b\u043e\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0430 \t\t}  \t\tCachingConnectionFactory connectionFactory = new CachingConnectionFactory(); \t\tconnectionFactory.setHost(url.getHost()); \t\tconnectionFactory.setUsername(url.getUserInfo().split(&quot;:&quot;)[0]); \t\tconnectionFactory.setPassword(url.getUserInfo().split(&quot;:&quot;)[1]); \t\tif (StringUtils.isNotBlank(url.getPath())) \t\t\tconnectionFactory.setVirtualHost(url.getPath().replace(&quot;\/&quot;, &quot;&quot;)); \t\tconnectionFactory.setConnectionTimeout(3000); \t\tconnectionFactory.setRequestedHeartBeat(30); \t\treturn connectionFactory; \t} <\/code><\/pre>\n<p>  \u0412 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434 \u043c\u0430\u043b\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 4(Routing).<\/p>\n<h2>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438<\/h2>\n<p>  \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"http:\/\/projects.spring.io\/spring-amqp\/\">Spring AMQP<\/a><br \/>  \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <a href=\"http:\/\/projects.spring.io\/spring-boot\/\">Spring Boot<\/a><br \/>  \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 <a href=\"http:\/\/www.rabbitmq.com\/getstarted.html\">RabbitMQ<\/a>             <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/262069\/\"> http:\/\/habrahabr.ru\/post\/262069\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>             \u041d\u0430 \u0441\u0430\u0439\u0442\u0435 <a href=\"http:\/\/www.rabbitmq.com\/\">rabbitmq.com<\/a> \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f java. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0440\u0438\u043d\u0433, \u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"http:\/\/projects.spring.io\/spring-amqp\/\">Spring AMQP<\/a>. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <a href=\"http:\/\/www.rabbitmq.com\/getstarted.html\">\u0432\u0441\u0435\u0445 \u0448\u0435\u0441\u0442\u0438<\/a> \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 RabbitMQ.   <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-260947","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/260947","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=260947"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/260947\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=260947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=260947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=260947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}