本指南将引导您完成设置发布和订阅消息的RabbitMQAMQP服务器以及创建SpringBoot应用程序以与该RabbitMQ服务器交互的过程。您将构建什么您将构建一个使用SpringAMQPRabbitTemplate和MessageListenerAdapter发布消息的应用程序。您需要什么大约15分钟最喜欢的文本编辑器或IDEJDK11或更高版本Gradle4+或Maven3.2+您还可以将代码直接导入IDE:SpringToolSuite(STS)IntelliJIDEASetupRabbitMQServer。请参阅设置RabbitMQ代理。如何完成本指南与大多数Spring入门指南一样,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。要从头开始,请继续设置RabbitMQ代理。要跳过基础知识:下载并解压缩本指南的源代码存储库,或使用Git克隆它:gitclonehttps://github.com/spring-guides/gs-messaging-rabbitmq.gitcdintogs-messaging-rabbitmq/initial跳转到开始使用SpringInitializr。完成后,您可以根据gs-messaging-rabbitmq/complete中的代码检查结果。设置RabbitMQ代理在构建消息传递应用程序之前,您需要设置一个服务器来处理接收和发送消息。RabbitMQ是一个AMQP服务器。该服务器可在https://www.rabbitmq.com/download.html免费获得。您可以手动下载它,或者,如果您使用带有Homebrew的Mac,则可以在终端窗口中运行以下命令:brewinstallrabbitmq解压缩服务器并通过在终端窗口中运行以下命令以默认设置启动它:rabbitmq-server您应该会看到类似于以下内容的输出:RabbitMQ3.1.3。版权所有(C)2007-2013VMware,Inc.####根据MPL获得许可。请参阅https://www.rabbitmq.com/##############日志:/usr/local/var/log/rabbitmq/rabbit@localhost.log########/usr/local/var/log/rabbitmq/rabbit@localhost-sasl.log##########启动代理...完成6个插件。如果您在本地运行Docker,您还可以使用DockerCompose快速启动RabbitMQ服务器。Github项目的根目录中有一个docker-compose.yml。complete这很简单,如下清单所示:rabbitmq:image:rabbitmq:managementports:-"5672:5672"-"15672:15672"有了当前目录下的这个文件,你可以运行docker-compose到使RabbitMQ在容器中运行。从SpringInitializr开始,您可以使用这个预初始化的项目并单击生成以下载ZIP文件。该项目配置为适合本教程中的示例。手动初始化项目:导航到https://start.spring.io。该服务会引入您的应用程序所需的所有依赖项,并为您完成大部分设置。选择Gradle或Maven以及您要使用的语言。本指南假设您选择了Java。单击Dependencies并为RabbitMQ选择Spring。单击生成。下载生成的ZIP文件,它是根据您的选择配置的Web应用程序的存档。如果您的IDE集成了SpringInitializr,您可以从IDE中完成此过程。您还可以从Github中fork项目并在您的IDE或其他编辑器中打开它。创建RabbitMQ消息接收器与任何基于消息传递的应用程序一样,您需要创建一个接收器来响应已发布的消息。以下清单(来自src/main/java/com.example.messagingrabbitmq/Receiver.java)显示了如何执行此操作:packagecom.example.messagingrabbitmq;导入java.util.concurrent.CountDownLatch;导入org.springframework.stereotype。Component;@ComponentpublicclassReceiver{privateCountDownLatchlatch=newCountDownLatch(1);publicvoidreceiveMessage(Stringmessage){System.out.println("收到<"+message+">");latch.countDown();}publicCountDownLatchgetLatch(){返回闩锁;}}这个Receiver是一个POJO,定义了接收消息的方法。当您注册它以接收消息时,您可以随意命名它。为了方便起见,这个POJO还有一个CountDownLatch。这让它发出消息已收到的信号。这是您不太可能在生产应用程序中实现的东西。注册监听器和发送消息SpringAMQPRabbitTemplate提供了使用RabbitMQ发送和接收消息所需的一切。但是,您需要:配置消息侦听器容器。声明队列、交换器和它们之间的绑定。配置一个组件发送一些消息来测试监听器。SpringBoot自动创建一个连接工厂和一个RabbitTemplate,减少您必须编写的代码量。您将使用RabbitTemplate发送消息,并向消息侦听器容器注册一个Receiver以接收消息。连接工厂驱动两者,允许它们连接到RabbitMQ服务器。以下清单(来自src/main/java/com.example.messagingrabbitmq/MessagingRabbitApplication.java)显示了如何创建应用程序类:packagecom.example.messagingrabbitmq;importorg.springframework.amqp.core.Binding;importorg.springframework.amqp.core.BindingBuilder;导入org.springframework.amqp.core.Queue;导入org.springframework.amqp.core.TopicExchange;导入org.springframework.amqp.rabbit.connection.ConnectionFactory;导入org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;导入org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;导入org.springframework.boot.SpringApplication;导入org.springframework.boot.autoconfigure.SpringBootApplication;导入org.springframework.context.annotation.Bean;@SpringBootApplicationpublicclassMessagingRabbitmqApplication{staticfinalStringtopicExchangeName="spring-boot-exchange";staticfinalStringqueueName="spring-boot";@BeanQueuequeue(){returnnewQueue(queueName,false);}@BeanTopicExchangeexchange(){返回新的TopicExchange(topicExchangeName);}@BeanBinding绑定(队列队列,TopicExchange交换){returnBindingBuilder.bind(queue).to(exchange).with("foo.bar.#");}@BeanSimpleMessageListenerContainercontainer(ConnectionFactoryconnectionFactory,MessageListenerAdapterlistenerAdapter){SimpleMessageListenerContainercontainer=newSimpleMessageListenerContainer();container.setConnectionFactory(connectionFactory);container.setQueueNames(queueName);container.setMessageListener(listenerAdapter);返回容器;}@BeanMessageListenerAdapterlistenerAdapter(Receiverreceiver){returnnewMessageListenerAdapter(receiver,"receiveMessage");}publicstaticvoidmain(String[]args)throwsInterruptedException{SpringApplication.run(MessagingRabbitmqApplication.class,args).close();}}@SpringBootApplication是一个方便的注释,它添加了以下所有内容:@Configuration:将类标记为应具有应用程序上下文的Bean定义源@EnableAutoConfiguration:告诉SpringBoot开始添加基于类路径设置、其他bean和各种属性设置的bean。例如,如果spring-webmvc在classpath上,则此注解将应用程序标记为Web应用程序并激活关键行为,例如设置DispatcherServlet。@ComponentScan:告诉Spring在包com/example中查找其他组件、配置和服务,让它找到控制器。main()方法使用SpringBoot的SpringApplication.run()方法来启动应用程序。您是否注意到没有一行XML?也没有web.xml文件。Web应用程序是100%纯Java,您无需处理任何管道或基础设施配置。方法中定义的beanlistenerAdapter()注册为容器中的消息监听器(在container()中定义)。它监听spring-boot队列中的消息。因为Receiver类是一个POJO,所以它需要包装在一个MessageListenerAdapter中,您可以在其中指定它调用receiveMessage。JMS队列和AMQP队列具有不同的语义。例如,JMS只将排队的消息发送给一个消费者。虽然AMQP队列做同样的事情,但AMQP生产者不直接向队列发送消息。相反,消息被发送到交换器,交换器可以发送到单个队列或散开到多个队列,模拟JMS主题的概念。一个消息侦听器容器和一个接收者bean就是您侦听消息所需要的全部。要发送消息,您还需要一个Rabbit模板。queue()方法创建一个AMQP队列。exchange()方法创建主题交换。此方法将两者绑定在一起,定义了发布到交换binding()时发生的行为。RabbitTemplateSpringAMQP需要将Queue、TopicExchange和Binding声明为顶级Springbean,以便正确设置。在这种情况下,我们使用的是主题交换器,队列与路由键foo.bar.#绑定,这意味着任何消息都使用以foo.bar开头的路由键发送。将被路由到队列。发送测试消息在此示例中,测试消息由CommandLineRunner发送,它还在接收器中等待闩锁并关闭应用程序上下文。以下清单(来自src/main/java/com.example.messagingrabbitmq/Runner.java)显示了它是如何工作的:packagecom.example.messagingrabbitmq;导入java.util.concurrent.TimeUnit;importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.boot.CommandLineRunner;importorg.springframework.stereotype.Component;@ComponentpublicclassRunnerimplementsCommandLineRunner{privatefinalRabbitTemplaterabbitTemplate;私有最终接收者接收者;publicRunner(Receiverreceiver,RabbitTemplaterabbitTemplate){this.receiver=receiver;this.rabbitTemplate=rabbitTemplate;}@Overridepublicvoidrun(String...args)throwsException{System.out.println("Sendingmessage...");rabbitTemplate.convertAndSend(MessagingRabbitmqApplication.topicExchangeName,"foo.bar.baz","来自RabbitMQ的问候!");receiver.getLatch().await(10000,TimeUnit.MILLISECONDS);}}foo.bar.baz请注意,模板用法与绑定A路由键相匹配,以将消息路由到交换。在测试中,您可以模拟运行器,以便可以单独测试接收器。运行应用程序main()方法通过创建Spring应用程序上下文来启动进程。这将启动消息侦听器容器,该容器开始侦听消息。有一个Runnerbean,它会自动运行。它从应用程序上下文中检索并从RabbitMQ发送Hello!队列RabbitTemplate中的消息。spring-boot最后关闭Spring应用上下文,应用结束。构建一个可执行JAR,您可以使用Gradle或Maven从命令行运行应用程序。您还可以构建一个包含所有必要依赖项、类和资源的可执行JAR文件并运行它。构建可执行jar使得在整个开发生命周期、跨不同环境等的应用程序中交付、版本化和部署服务变得容易。如果你使用Gradle,你可以使用./gradlewbootRun。或者,您可以使用./gradlewbuild构建JAR文件,然后按如下方式运行JAR文件:java-jarbuild/libs/gs-messaging-rabbitmq-0.1。0.jar如果你使用Maven,你可以使用./mvnwspring-boot:run。或者,您可以使用./mvnwcleanpackage构建JAR文件,然后运行??JAR文件,如下所示:java-jartarget/gs-messaging-rabbitmq-0.1.0.jar此处描述的步骤创建一个可运行的JAR。您还可以构建经典WAR文件。您应该看到以下输出:Sendingmessage...Received
