请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

消费者接收不到生产者的消息

老师,我在这章测试代码,消费者启动成功,rabbitmq后台也看得到消费者,在网站后台发送消息,消费者也能打印出来,但是启动生产者,只打印出发送成功,消费者怎么都却接收不到生产者发送的Hello imooc!请问一下是什么原因呢?

//简单模式step:2.简单模式下生产代码
func (r *RabbitMQ) PublishSimple(message string)  {
	//1.申请队列,如果队列不存在会自动创建,如果存在则跳过创建
	//保证队列存在,消息能发送到队列中
	_,err := r.channel.QueueDeclare(
		r.QueueName,
		//是否持久化
		false,
		//是否自动删除
		false,
		//是否具有排他性
		false,
		//是否阻塞
		false,
		//额外属性
		nil,
		)
	if err != nil{
		fmt.Println(err)
	}
	//2.发送消息到队列中
	r.channel.Publish(
		r.Exchange,
		r.QueueName,
		//如果为true,根据exchange类型和routkey规则,如果
		// 无法找到符合条件的队列那么会把发送的消息返回给发送者
		false,
		//如果为true,当exchange发送消息到队列后发现队列上没有绑定消费者,
		//则会把消息发还给发送者
		false,
		amqp.Publishing{
			ContentType: "text/plain",
			Body:[]byte(message),
		})
}
func (r *RabbitMQ) ConsumeSimple()  {
	//1.申请队列,如果队列不存在会自动创建,如果存在则跳过创建
	//保证队列存在,消息能发送到队列中
	_,err := r.channel.QueueDeclare(
		r.QueueName,
		//是否持久化
		false,
		//是否自动删除
		false,
		//是否具有排他性
		false,
		//是否阻塞
		false,
		//额外属性
		nil,
	)
	if err != nil{
		fmt.Println(err)
	}

	//接受消息
	msgs,err := r.channel.Consume(
		r.QueueName,
		//用来区分多个消费者
		"",
		//是否自动应答
		true,
		//是否具有排他性
		false,
		//如果设置为true,表示不能将同一个connection中发送的消息传递给这个
		//connection中的消费者
		false,
		//队列消息是否阻塞
		false,
		nil,
		)
	if err != nil{
		fmt.Println(err)
	}
	forever := make(chan bool)
	//启用协程处理消息
	go func() {
		for d := range msgs{
			//实现我们要处理的逻辑函数
			log.Printf("Received a message:%s",d.Body)
		}

	}()

	log.Printf("[*] Waiting for messages,To exit press CTRL+C")
	<-forever


}
package main

import (
	"fmt"
	"imooc-rabbitmq/RabbitMQ"
)

func main()  {
	rabbitmq := RabbitMQ.NewRabbitMQSimple("imoocSimple")
	rabbitmq.PublishSimple("Hello imooc!")
	fmt.Println("发送成功!")

}
package main

import "imooc-rabbitmq/RabbitMQ"

func main()  {
	rabbitmq := RabbitMQ.NewRabbitMQSimple("imoocSimple")
	rabbitmq.ConsumeSimple()
}

正在回答 回答被采纳积分+3

1回答

Cap 2019-07-04 09:25:55

我检查了下你发的代码 是可以正常发送和接受的,请检查下消费端 打出的消息是否是:Received a message:Hello imooc!

0 回复 有任何疑惑可以回复我~
  • 没有打印这个,只打印了[*] Waiting for messages,To exit press CTRL+C。不过在rabbit网页后台Publish message中输入123,控制台会打印出Received a message:123。     怎么启动生产者,消费者都没有任何信息。感觉生产者都没有连接到队列上,但是生产者程序又执行完成没有报错
    回复 有任何疑惑可以回复我~ 2019-07-04 10:35:13
  • 后面拿同一套代码测试工作模式也是两个消费者正常连接到rabbitmq,启动生产者,打印一个数字就会报一个Exception(504) Reason:"channel/connection is not open"的错误
    回复 有任何疑惑可以回复我~ 2019-07-04 11:25:35
  • Cap #3
    是不是开了多个消费?
    回复 有任何疑惑可以回复我~ 2019-07-04 12:28:19
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信