Spring-amqp是對AMQP的一些概念的一些抽象,Spring-rabbit是對RabbitMQ操作的封裝實(shí)現(xiàn)。
主要有幾個(gè)核心類RabbitAdmin
、RabbitTemplate
、SimpleMessageListenerContainer
等
RabbitAdmin
類完成對Exchange、Queue、Binding的操作,在容器中管理 了RabbitAdmin
類的時(shí)候,可以對Exchange、Queue、Binding進(jìn)行自動聲明。
RabbitTemplate
類是發(fā)送和接收消息的工具類。
SimpleMessageListenerContainer
是消費(fèi)消息的容器。
目前一些比較新的項(xiàng)目會使用基于注解的方式,而比較老的一些項(xiàng)目可能還是基于配制文件的方式。
此處使用的Spring依賴為:
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.2.7.RELEASE</version>
</dependency>
消息的生產(chǎn)者
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 version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
<!--配制連接工廠-->
<rabbit:connection-factory id="connectFactory"
host="node1" virtual-host="/"
username="root" password="123456"
port="5672"
></rabbit:connection-factory>
<!--用于自動向RabbitMQ聲明隊(duì)列、交換器、綁定 等操作工具類-->
<rabbit:admin id="rabbitAdmin" connection-factory="connectFactory"></rabbit:admin>
<!--用于簡化操作的模板類-->
<rabbit:template connection-factory="connectFactory" id="rabbitTemplate" />
<!--聲明隊(duì)列隊(duì)列-->
<rabbit:queue id="msg1" name="queue.msg" durable="false" exclusive="false" auto-delete="false" ></rabbit:queue>
<!--聲明交換器-->
<rabbit:direct-exchange name="ex.direct" durable="false" auto-delete="false" id="directExchange" >
<rabbit:bindings>
<!--key表示綁定鍵-->
<!--queue表示將交換器綁定到哪個(gè)消息隊(duì)列,使用隊(duì)列換id,不要使用Bean的name-->
<!--exchange表示交接交換器綁定到哪個(gè)交換器。-->
<rabbit:binding queue="msg1" key="routing.q1" ></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>
</beans>
運(yùn)行生產(chǎn)者的代碼,便可查看數(shù)據(jù)已經(jīng)發(fā)送成功
[root@nullnull-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 │
└────────────────────┴─────────┘
[root@nullnull-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 │ │
└─────────────┴─────────────┴──────────────────┴──────────────────┴─────────────┴───────────┘
[root@nullnull-os ~]# rabbitmqctl list_queues --formatter pretty_table
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
┌───────────┬──────────┐
│ name │ messages │
├───────────┼──────────┤
│ queue.msg │ 1 │
└───────────┴──────────┘
[root@nullnull-os ~]#
可以觀察到數(shù)據(jù)已經(jīng)成功的發(fā)送了。
遇到的問題:
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' available
at 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' available
at 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 name="ex.direct" durable="false" auto-delete="false" id="directExchange" >
<rabbit:bindings>
<rabbit:binding queue="queue.msg" key="routing.q1" ></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>
此處要配制的是隊(duì)列的id,而不是隊(duì)列的名稱。文章來源:http://www.zghlxwxcb.cn/news/detail-697195.html
修改后:文章來源地址http://www.zghlxwxcb.cn/news/detail-697195.html
<!--聲明交換器-->
<rabbit:direct-exchange name="ex.direct" durable="false" auto-delete="false" id="directExchange" >
<rabbit:bindings>
<!--key表示綁定鍵-->
<!--queue表示將交換器綁定到哪個(gè)消息隊(duì)列,使用隊(duì)列換id,不要使用Bean的name-->
<!--exchange表示交接交換器綁定到哪個(gè)交換器。-->
<rabbit:binding queue="msg1" key="routing.q1" ></rabbit:binding>
</rabbit:bindings>
</rabbit:direct-exchange>
到了這里,關(guān)于Spring整合RabbitMQ-配制文件方式-1-消息生產(chǎn)者的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!