SpringBoot+RabbitMQ学习V0.1

简单的RabbitMQ配置搭建

1.代码实现:

配置pom.xml添加依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>

配置SpringBoot项目,这里端口是RabbitMQ客户端的端口,账户密码为初始,需装RabbitMQ

## Rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

RabbitMQ配置,添加一个消息队列,该队列名为hello

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class RabbitMQConfig {
	public static final String QUEUE_NAME = "hello";
	@Bean
	public Queue queue(){
		return new Queue(QUEUE_NAME);
	}
}

RabbitMQ消息队列发送者(生产者一条消息)


import java.util.Date;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class HelloSender {
	// rabbitTemplate是SpringBoot提供的默认实现
	@Autowired
	private AmqpTemplate rabbitTemplate;
	
	public void send() {
		String context = "hello " + new Date();
		System.out.print("Sender : "+context);
		this.rabbitTemplate.convertAndSend("hello", context);
	}
}

RabbitMQ消息队列消费者(接收一条消息),消息接收者队列名需和配置中队列名相同


import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "hello")
public class HelloReceiver {
	
	@RabbitHandler
	public void process(String hello) {
		System.out.println("Receiver :"+hello);
	}
}

RabbitMQ消息队列测试


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 RabbitMqHelloTest {
	
	@Autowired
	private HelloSender helloSender;
	
	@ResponseBody
	@RequestMapping("/rabbitTest")
	public void hello() throws Exception{
		System.out.println("rabbitTest");
		helloSender.send();
	} 
}

2.安装RabbitMQ客户端

RabbitMQ使用erlang编写,需要先装erlang,但是国外链接巨慢,所以

erlang:https://pan.baidu.com/s/1oVaMNMQOM2B15HFwJ7lTsQ

rabbitmq:https://pan.baidu.com/s/124ytran5fUYKSJ9d7v8mfg

需配置下两个变量,并放到path中

ERLANG_HOME   E:\erl9.1

RABBITMQ_SERVER   E:\RabbitMQ Server\rabbitmq_server-3.7.7

然后通过win10搜索RabbitMQ Command Prompt (sbin dir),并输入

rabbitmq-plugins enable rabbitmq_management安装扩展组件,完成后打开RabbitMQ Service - start开启RabbitMQ服务,

登录http://localhost:15672查看是否启动成功,输入guest/guest进入RabbitMQ查看

运行项目中RabbitMQ的测试,

打印

rabbitTest
Sender : hello Mon Aug 27 15:35:04 CST 2018Receiver :hello Mon Aug 27 15:35:04 CST 2018

一不小心

2018-08-27 15:42:32.946  WARN 7744 --- [cTaskExecutor-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener threw exception
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:1506) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1417) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1337) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1324) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1303) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:785) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:769) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:77) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1010) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144]
Caused by: org.springframework.amqp.AmqpException: No method found for class [B
	at org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.getHandlerForPayload(DelegatingInvocableHandler.java:147) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.getMethodNameFor(DelegatingInvocableHandler.java:250) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.getMethodAsString(HandlerAdapter.java:70) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:190) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:120) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1414) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
	... 8 common frames omitted

这是因为队列中有一个名为hello的消息队列,但是此时消息重新入队造成异常,需到RabbitMQ客户端删除该队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值