当前位置:   article > 正文

Spring中配置多个RabbitMQ的步骤_spring 多rabbitmq

spring 多rabbitmq

最近在开发Spring项目,其中用到了多个RabbitMQ,现在总结如下。

如果要配置多个RabbitMQ,就将rabbitMq相关的xml中的配置再复制一份,然后创建对应的生产者消费者类即可。

1.pom.xml中进行配置,导入jar包:

  1. <dependency>
  2. <groupId>org.springframework.amqp</groupId>
  3. <artifactId>spring-rabbit</artifactId>
  4. <version>1.3.5.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.rabbitmq</groupId>
  8. <artifactId>amqp-client</artifactId>
  9. <version>3.3.4</version>
  10. </dependency>

 

2.创建rabbitmq的xml配置文件,路径例如:resources/context/context-rabbitMq.xml;这个路径与xml文件名可以自定义,只要spring配置文件中把这个xml包含了就行;内容如下:

  1. <!-- 配置rabbitMq链接 -->
  2. <bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
  3. <property name="username" value="${username}"/>
  4. <property name="password" value="${password}"/>
  5. <property name="port" value="${port}"/>
  6. <property name="virtualHost" value="${vhost}"/>
  7. <property name="channelCacheSize" value="50"/>
  8. <property name="connectionTimeout" value="5000"/>
  9. <property name="addresses" value="${addresses}"/>
  10. </bean>
  11. <!-- 配置admin信息后,当前producer中的exchange和queue会在rabbitmq服务器上自动生成 -->
  12. <rabbit:admin connection-factory="connectionFactory" />
  13. <!-- 消息队列消费者 -->
  14. <bean id="myConsumer" class="com.test.MyConsumer" />
  15. <rabbit:listener-container connection-factory="connectionFactory">
  16. <rabbit:listener ref="myConsumer" queue-names="${queue}" />
  17. </rabbit:listener-container>
  18. <!-- rabbitMQ实例,生产者用 -->
  19. <bean id="rabbitTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate">
  20. <property name="connectionFactory" ref="connectionFactory" />
  21. <property name="channelTransacted" value="true" />
  22. </bean>
  23. <!-- 如果有多个mq,再复制一次上面的配置即可,bean的id设置成不同的,可以使用不同的链接信息 -->

 

3.编写properties配置文件,路径如:resources/properties/config.properties;路径与文件名可自定义,spring配置文件中把这个文件包含了就行,如:

  1. <bean name="propertyConfiger" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
  2. <property name="ignoreResourceNotFound" value="true" />
  3. <property name="locations">
  4. <list>
  5. <value>classpath:properties/config.properties</value>
  6. </list>
  7. </property>
  8. </bean>

“classpath:”指的就是resources文件夹。

config.properties内容如下,与rabbitmq中的${}对应:

  1. host=10.111.11.111,10.111.11.112,10.111.11.113
  2. port=5672
  3. username=admin
  4. password=admin
  5. #交换机名,mq生产者用
  6. exchange=e1.exchange
  7. queue=q1.queue
  8. vhost=v1.vhost

 

4.编写消费者类MyConsumer.java,这个类用来监听mq队列消息,如果队列中有数据,则拿出一个来处理。如下:

  1. public class MyConsumer implements MessageListener {
  2. private static final Logger log = LoggerFactory.getLogger(MyConsumer.class);
  3. @Override
  4. public void onMessage(Message message){
  5. String msg = "";
  6. MyMsgBean bean = null;
  7. try{
  8. //这里有个小坑,下面会提到
  9. //msg = new String(message.getBody(), message.getMessageProperties().getContentEncoding());
  10. //获取mq中的消息,从byte[]转为string
  11. msg = new String(message.getBody());
  12. //项目中,这个msg是json格式的String,再把String转为bean,容易处理些
  13. bean = JSONObject.parseObject(msg, MyMsgBean.class);
  14. //TODO 以下省略处理步骤
  15. }
  16. catch(Exception e){
  17. log.error("mq消费者异常",e);
  18. }
  19. }
  20. }

这个类在上方的context-rabbitMq.xml中配置过了(myConsumer),所以能实现自动监听mq队列并处理的功能。

 

5.编写生产者类MyProducer.java,这个类通过使用rabbitTemplate对象,把信息放入mq队列。如下:

  1. public class MyProducer{
  2. private static final Logger log = LoggerFactory.geetLogger(MyProducer.class);
  3. //交换机名称
  4. @Value("${e1.exchange}")
  5. private String exchange;
  6. //@Autowired
  7. private RabbitTemplate rabbitTemplate;
  8. public void setRabbitTemplate(RabbitTemplate rabbitTemplate){
  9. this.rabbitTemplate = rabbitTemplate;
  10. }
  11. public RabbitTemplate getRabbitTemplate(){
  12. return this.rabbitTemplate;
  13. }
  14. public void sendMsg(String msg){
  15. Message info = MessageBuilder.withBody(msg.getBytes())
  16. .setContentType(MessageProperties.CONTENT_TYPE_JSON)
  17. .setContentEncoding("utf-8")
  18. .build();
  19. try{
  20. rabbitTemplate.send(exchange,"",info);
  21. }catch(Exception e){
  22. log.error("生产者将信息放入mq失败!",e);
  23. }
  24. }
  25. }

这个类中的rabbitTemplate是第一步在xml中配置好的,所以能注入,用set方法注入的(也可以用注解注入,还可以用构造方法注入);

这个类本身也是在xml中配置的,然后其它类就可以注入这个类,调用这个类的sendMsg()方法把消息存入mq队列了(例如Controller.java类中注入这个类,然后给mq新增消息)

配置如:

  1. <bean id="myProducer" class="com.test.MyProducer">
  2. <property name="rabbitTemplate" ref="rabbitTemplate"></property>
  3. </bean>

 

6.其它:

直接输入mq的ip,然后输入mq的账号密码,可以登录mq管理中心;

在这个界面,点击queues,找到自己在使用的队列,可以手动给队列添加信息;

具体如下:

(1)找到Publish message下拉框;

(2)Headers中可以写key与value,对应Message对象中的Headers字段。

(3)Properties中可以写key与value,对应Message对象中的某些字段,点击旁边的"?"查看有效果的key,区分大小写;例如:

content_encoding=utf-8

(4)Properties中可以写具体信息,对应Message对象的getBody()方法获得的内容,例如:

{"json":"123"}

 

7.rabbitmq相关文章

rabbitmq三种模式:https://blog.csdn.net/fxq8866/article/details/62049393

rabbitmq结构:https://blog.csdn.net/vipshop_fin_dev/article/details/81612935

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/616998
推荐阅读
相关标签
  

闽ICP备14008679号