山东做网站建设的好公司,内蒙古网络公司排名,煎蛋wordpress,做网站空间会招攻击Spring-amqp是对AMQP的一些概念的一些抽象#xff0c;Spring-rabbit是对RabbitMQ操作的封装实现。
主要有几个核心类RabbitAdmin、RabbitTemplate、SimpleMessageListenerContainer等
RabbitAdmin类完成对Exchange、Queue、Binding的操作#xff0c;在容器中管理 了RabbitA…Spring-amqp是对AMQP的一些概念的一些抽象Spring-rabbit是对RabbitMQ操作的封装实现。
主要有几个核心类RabbitAdmin、RabbitTemplate、SimpleMessageListenerContainer等
RabbitAdmin类完成对Exchange、Queue、Binding的操作在容器中管理 了RabbitAdmin类的时候可以对Exchange、Queue、Binding进行自动声明。
RabbitTemplate类是发送和接收消息的工具类。
SimpleMessageListenerContainer是消费消息的容器。
目前一些比较新的项目会使用基于注解的方式而比较老的一些项目可能还是基于配制文件的方式。
此处使用的Spring依赖为: dependencygroupIdorg.springframework.amqp/groupIdartifactIdspring-rabbit/artifactIdversion2.2.7.RELEASE/version/dependency消息的生产者
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.core.MessagePropertiesBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Product {public static void main(String[] args) throws Exception {AbstractApplicationContext context new ClassPathXmlApplicationContext(spring-rabbit.xml);RabbitTemplate template context.getBean(RabbitTemplate.class);MessagePropertiesBuilder propertiesBuilder MessagePropertiesBuilder.newInstance();propertiesBuilder.setContentEncoding(gbk);propertiesBuilder.setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN);Message msg MessageBuilder.withBody(hello world.getBytes(gbk)).andProperties(propertiesBuilder.build()).build();template.convertAndSend(ex.direct, routing.q1, msg);context.close();}
}
spring-rabbit.xml
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:rabbithttp://www.springframework.org/schema/rabbitxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/rabbithttp://www.springframework.org/schema/rabbit/spring-rabbit.xsd!--配制连接工厂--rabbit:connection-factory idconnectFactoryhostnode1 virtual-host/usernameroot password123456port5672/rabbit:connection-factory!--用于自动向RabbitMQ声明队列、交换器、绑定 等操作工具类--rabbit:admin idrabbitAdmin connection-factoryconnectFactory/rabbit:admin!--用于简化操作的模板类--rabbit:template connection-factoryconnectFactory idrabbitTemplate /!--声明队列队列--rabbit:queue idmsg1 namequeue.msg durablefalse exclusivefalse auto-deletefalse /rabbit:queue!--声明交换器--rabbit:direct-exchange nameex.direct durablefalse auto-deletefalse iddirectExchange rabbit:bindings!--key表示绑定键--!--queue表示将交换器绑定到哪个消息队列,使用队列换id不要使用Bean的name--!--exchange表示交接交换器绑定到哪个交换器。--rabbit:binding queuemsg1 keyrouting.q1 /rabbit:binding/rabbit:bindings/rabbit:direct-exchange/beans运行生产者的代码便可查看数据已经发送成功
[rootnullnull-os ~]# rabbitmqctl list_exchanges --formatter pretty_table
Listing exchanges for vhost / ...
┌────────────────────┬─────────┐
│ name │ type │
├────────────────────┼─────────┤
│ amq.fanout │ fanout │
├────────────────────┼─────────┤
│ ex.busi.topic │ topic │
├────────────────────┼─────────┤
│ amq.rabbitmq.trace │ topic │
├────────────────────┼─────────┤
│ amq.headers │ headers │
├────────────────────┼─────────┤
│ amq.topic │ topic │
├────────────────────┼─────────┤
│ amq.direct │ direct │
├────────────────────┼─────────┤
│ ex.direct │ direct │
├────────────────────┼─────────┤
│ │ direct │
├────────────────────┼─────────┤
│ ex.routing │ direct │
├────────────────────┼─────────┤
│ amq.match │ headers │
└────────────────────┴─────────┘
[rootnullnull-os ~]# rabbitmqctl list_bindings --formatter pretty_table
Listing bindings for vhost /...
┌─────────────┬─────────────┬──────────────────┬──────────────────┬─────────────┬───────────┐
│ source_name │ source_kind │ destination_name │ destination_kind │ routing_key │ arguments │
├─────────────┼─────────────┼──────────────────┼──────────────────┼─────────────┼───────────┤
│ │ exchange │ queue.msg │ queue │ queue.msg │ │
├─────────────┼─────────────┼──────────────────┼──────────────────┼─────────────┼───────────┤
│ ex.direct │ exchange │ queue.msg │ queue │ routing.q1 │ │
└─────────────┴─────────────┴──────────────────┴──────────────────┴─────────────┴───────────┘
[rootnullnull-os ~]# rabbitmqctl list_queues --formatter pretty_table
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
┌───────────┬──────────┐
│ name │ messages │
├───────────┼──────────┤
│ queue.msg │ 1 │
└───────────┴──────────┘
[rootnullnull-os ~]# 可以观察到数据已经成功的发送了。
遇到的问题
Exception in thread main org.springframework.beans.factory.BeanCreationException: Error creating bean with name org.springframework.amqp.rabbit.config.BindingFactoryBean#0: Cannot resolve reference to bean queue.msg while setting bean property destinationQueue; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named queue.msg availableat org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1699)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1444)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:876)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)at org.springframework.context.support.ClassPathXmlApplicationContext.init(ClassPathXmlApplicationContext.java:144)at org.springframework.context.support.ClassPathXmlApplicationContext.init(ClassPathXmlApplicationContext.java:85)at com.nullnull.learn.Product.main(Product.java:18)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named queue.msg availableat org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:814)at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1282)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:297)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330)... 15 more
问题原因 rabbit:direct-exchange nameex.direct durablefalse auto-deletefalse iddirectExchange rabbit:bindingsrabbit:binding queuequeue.msg keyrouting.q1 /rabbit:binding/rabbit:bindings/rabbit:direct-exchange此处要配制的是队列的id而不是队列的名称。
修改后: !--声明交换器--rabbit:direct-exchange nameex.direct durablefalse auto-deletefalse iddirectExchange rabbit:bindings!--key表示绑定键--!--queue表示将交换器绑定到哪个消息队列,使用队列换id不要使用Bean的name--!--exchange表示交接交换器绑定到哪个交换器。--rabbit:binding queuemsg1 keyrouting.q1 /rabbit:binding/rabbit:bindings/rabbit:direct-exchange