柳州自卸车液压配件 發表於 2020-12-18 17:28:00

go操作RabbitMQ

<h2>go操作RabbitMQ</h2>
<div class="postbody">
<div id="cnblogs_post_body" class="blogpost-body">
<p>RabbitMQ服务器安装<br>1、安装erlang</p>
<div class="cnblogs_code">
<pre>wget https://www.rabbitmq.com/releases/erlang/erlang-18.2-1.el6.x86_64.rpm</pre>
</div>
<p>2、安装RabbitMQ</p>
<div class="cnblogs_code">
<pre>wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-3.6.15-1.el6.noarch.rpm</pre>
</div>
<p>3、 常用命令</p>
<div class="cnblogs_code">
<pre>systemctl start rabbitmq-server 启动
rabbitmq stop 停止
rabbitmq-plugins list 插件命令
rabbitmq-plugins enable rabbitmq_management 安装管理插件
rabbitmq-plugins disable rabbitmq_management 卸载管理插件</pre>
</div>
<p>4、 浏览器打开</p>
<p>端口号默认:15672&lt;br/&gt;<br>密码和用户名默认:guest<br>http://127.0.0.1:15672/#/<br>5、常见错误<br>错误提示:zsh: command not found: rabbitmq-plugins&lt;br/&gt;<br>解决办法:<br>第一种:export PATH=/usr/local/Cellar/rabbitmq/3.8.2/sbin/:$PATH&lt;br/&gt;<br>第二种:1: vim .bash_profile(前提是存在该文件,如果不存在,可以先创建mkdir .bash_profile,之后再执行vi编辑)&lt;br/&gt;<br>2:export PATH=/usr/local/Cellar/rabbitmq/3.8.2/sbin/sbin/:$PATH</p>
<p>最后:source ~/.bash_profile</p>
<p>## RabbitMQ核心概念<br>### Virtual Hosts管理<br>像mysql拥有数据库的概念并且可以指定用户对库和表等操作的权限。那RabbitMQ呢?RabbitMQ也有类似的权限管理。在RabbitMQ中可以虚拟消息服务器VirtualHost,每个VirtualHost相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。 相当于mysql的db。Virtual Name一般以/开头&lt;br/&gt;<br>1、创建Virtual Hosts:<br>Admin-&gt;Virtual Hosts-&gt;Add a new virtual host&lt;br/&gt;<br>2、创建用户:Admin-&gt;Users-&gt;Add a user&lt;br/&gt;<br>2、对用户进行授权,点击需要授权的vhosts-&gt;Permissions-&gt;Set permission</p>
<p>## RabbitMQ五种模式<br>url格式:amqp:// 账号 密码@地址:端口号/vhost &lt;br/&gt;<br>1、Simple模式 最简单最常用的模式,一个消息只能被一个消费者消费&lt;br/&gt;</p>
<p><img src="https://img2018.cnblogs.com/blog/799890/201912/799890-20191228175052931-355319260.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>2、Work模式,一个消息只能被一个消费者消费</p>
<p><img src="https://img2018.cnblogs.com/blog/799890/201912/799890-20191228175113413-643624370.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>3、Publish/Subscribe订阅模式,消息被路由投递给多个队列,一个消息被多个消费者获取,生产端不允许指定消费</p>
<p><img src="https://img2018.cnblogs.com/blog/799890/201912/799890-20191228175227474-887592032.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>4、Routing路由模式,一个消息被多个消费者获取,并且消息的目标队列可以被生产者指定</p>
<p><img src="https://img2018.cnblogs.com/blog/799890/201912/799890-20191228175316566-1539368774.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>5、Topic话题模式,一个消息被多个消息获取,消息的目标queue可用BindKey以通配符,(#:一个或多个词,*:一个词)的方式指定。</p>
<p><img src="https://img2018.cnblogs.com/blog/799890/201912/799890-20191228175255733-102152771.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h4>示例代码</h4>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">package RabbitMQ

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> (
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fmt</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">github.com/streadway/amqp</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">log</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
)
</span>//amqp:// 账号 密码@地址:端口号/<span style="color: rgba(0, 0, 0, 1)">vhost
const MQURL </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">amqp://imoocuser:imoocuser@127.0.0.1:5672/imooc</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">

type RabbitMQ struct {
    </span>//<span style="color: rgba(0, 0, 0, 1)">连接
    conn </span>*<span style="color: rgba(0, 0, 0, 1)">amqp.Connection
    </span>//<span style="color: rgba(0, 0, 0, 1)">管道
    channel </span>*<span style="color: rgba(0, 0, 0, 1)">amqp.Channel
    </span>//<span style="color: rgba(0, 0, 0, 1)">队列名称
    QueueName string
    </span>//<span style="color: rgba(0, 0, 0, 1)">交换机
    Exchange string
    </span>//<span style="color: rgba(0, 0, 0, 1)">key Simple模式 几乎用不到
    Key string
    </span>//<span style="color: rgba(0, 0, 0, 1)">连接信息
    Mqurl string
}

</span>//<span style="color: rgba(0, 0, 0, 1)">创建RabbitMQ结构体实例
func NewRabbitMQ(queuename string, exchange string,key string) </span>*<span style="color: rgba(0, 0, 0, 1)">RabbitMQ {
    rabbitmq :</span>= &amp;<span style="color: rgba(0, 0, 0, 1)">RabbitMQ{QueueName:queuename,Exchange:exchange,Key:key,Mqurl:MQURL}
    var err error
    </span>//<span style="color: rgba(0, 0, 0, 1)">创建rabbitmq连接
    rabbitmq.conn, err </span>=<span style="color: rgba(0, 0, 0, 1)"> amqp.Dial(rabbitmq.Mqurl)
    rabbitmq.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">创建连接错误!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    rabbitmq.channel,err </span>=<span style="color: rgba(0, 0, 0, 1)"> rabbitmq.conn.Channel()
    rabbitmq.failOnErr(err,</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">获取channel失败</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> rabbitmq
}

</span>//<span style="color: rgba(0, 0, 0, 1)">断开channel和connection
func (r </span>*<span style="color: rgba(0, 0, 0, 1)">RabbitMQ) Destory() {
    r.channel.Close()
    r.conn.Close()
}

</span>//<span style="color: rgba(0, 0, 0, 1)">错误处理函数
func (r </span>*<span style="color: rgba(0, 0, 0, 1)">RabbitMQ) failOnErr (err error,message string){
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)">nil {
      log.Fatalf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%s:%s</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,message,err)
      panic(fmt.Sprintf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%s:%s</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,message, err))
    }
}

</span>//简单模式step:1<span style="color: rgba(0, 0, 0, 1)">。创建简单模式下RabbitMQ实例
func NewRabbitMQSimple(queueName string) </span>*<span style="color: rgba(0, 0, 0, 1)"> RabbitMQ{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> NewRabbitMQ(queueName, <span style="color: rgba(128, 0, 0, 1)">""</span>, <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">)
}

</span>//<span style="color: rgba(0, 0, 0, 1)">订阅模式创建rabbitmq实例
func NewRabbitMQPubSub(exchangeName string) </span>*<span style="color: rgba(0, 0, 0, 1)"> RabbitMQ{
    </span>//<span style="color: rgba(0, 0, 0, 1)">创建rabbitmq实例
    rabbitmq :</span>= NewRabbitMQ(<span style="color: rgba(128, 0, 0, 1)">""</span>, exchangeName, <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">)
    var err error
    </span>//<span style="color: rgba(0, 0, 0, 1)">获取connection
    rabbitmq.conn, err </span>=<span style="color: rgba(0, 0, 0, 1)"> amqp.Dial(rabbitmq.Mqurl)
    rabbitmq.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed to connecct rabbitmq!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>//<span style="color: rgba(0, 0, 0, 1)">获取channel
    rabbitmq.channel, err </span>=<span style="color: rgba(0, 0, 0, 1)"> rabbitmq.conn.Channel()
    rabbitmq.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed to open a channel!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> rabbitmq
}

</span>//<span style="color: rgba(0, 0, 0, 1)">订阅模式生成
func (r </span>*<span style="color: rgba(0, 0, 0, 1)">RabbitMQ) PublishPub(message string) {
    </span>//<span style="color: rgba(0, 0, 0, 1)">尝试创建交换机,不存在创建
    err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.ExchangeDeclare(
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机名称
      r.Exchange,
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机类型 广播类型
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fanout</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否持久化
      true,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否字段删除
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">true表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否阻塞 true表示要等待服务器的响应
      false,
      nil,
      )
    r.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed to declare an excha</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nge</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)

    </span>//2<span style="color: rgba(0, 0, 0, 1)"> 发送消息
    err </span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.Publish(
      r.Exchange,
      </span><span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
      false,
      false,
      amqp.Publishing{
            </span>//<span style="color: rgba(0, 0, 0, 1)">类型
            ContentType:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/plain</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
            </span>//<span style="color: rgba(0, 0, 0, 1)">消息
            Body:[]byte(message),
      }, )
}

</span>//<span style="color: rgba(0, 0, 0, 1)">订阅模式消费端代码
func (r </span>*<span style="color: rgba(0, 0, 0, 1)"> RabbitMQ) RecieveSub(){
    </span>//<span style="color: rgba(0, 0, 0, 1)">尝试创建交换机,不存在创建
    err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.ExchangeDeclare(
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机名称
      r.Exchange,
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机类型 广播类型
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fanout</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否持久化
      true,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否字段删除
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">true表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否阻塞 true表示要等待服务器的响应
      false,
      nil,
    )
    r.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed to declare an excha</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nge</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>//<span style="color: rgba(0, 0, 0, 1)">2试探性创建队列,创建队列
    q, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.QueueDeclare(
      </span><span style="color: rgba(128, 0, 0, 1)">""</span>,//<span style="color: rgba(0, 0, 0, 1)">随机生产队列名称
      false,
      false,
      true,
      false,
      nil,
      )
    r.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Failed to declare a queue</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>//<span style="color: rgba(0, 0, 0, 1)">绑定队列到exchange中
    err </span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.QueueBind(
      q.Name,
      </span>//在pub/<span style="color: rgba(0, 0, 0, 1)">sub模式下,这里的key要为空
      </span><span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
      r.Exchange,
      false,
      nil,
      )
    </span>//<span style="color: rgba(0, 0, 0, 1)">消费消息
    message, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.Consume(
      q.Name,
      </span><span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
      true,
      false,
      false,
      false,
      nil,
      )
    forever :</span>=<span style="color: rgba(0, 0, 0, 1)"> make(chan bool)
   go func() {
         </span><span style="color: rgba(0, 0, 255, 1)">for</span> d :=<span style="color: rgba(0, 0, 0, 1)"> range message {
             log.Printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Received a message:%s,</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, d.Body)
      }
    }()
    fmt.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">退出请按 Ctrl+C</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>&lt;-<span style="color: rgba(0, 0, 0, 1)"> forever
}

</span>//<span style="color: rgba(0, 0, 0, 1)">话题模式 创建RabbitMQ实例
func NewRabbitMQTopic(exchagne string, routingKey string) </span>*<span style="color: rgba(0, 0, 0, 1)">RabbitMQ {
    </span>//<span style="color: rgba(0, 0, 0, 1)">创建rabbitmq实例
    rabbitmq :</span>= NewRabbitMQ(<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">, exchagne, routingKey)
    var err error
    rabbitmq.conn, err </span>=<span style="color: rgba(0, 0, 0, 1)"> amqp.Dial(rabbitmq.Mqurl)
    rabbitmq.failOnErr(err,</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed   to connect rabbingmq!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    rabbitmq.channel,err </span>=<span style="color: rgba(0, 0, 0, 1)"> rabbitmq.conn.Channel()
    rabbitmq.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed to open a channel</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">rabbitmq
}



</span>//<span style="color: rgba(0, 0, 0, 1)">话题模式发送信息
func (r </span>*<span style="color: rgba(0, 0, 0, 1)"> RabbitMQ) PublishTopic(message string) {
    </span>//<span style="color: rgba(0, 0, 0, 1)">尝试创建交换机,不存在创建
    err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.ExchangeDeclare(
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机名称
      r.Exchange,
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机类型 话题模式
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">topic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否持久化
      true,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否字段删除
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">true表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否阻塞 true表示要等待服务器的响应
      false,
      nil,
    )
    r.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">topic failed to declare an excha</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nge</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>//<span style="color: rgba(0, 0, 0, 1)">2发送信息
    err </span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.Publish(
      r.Exchange,
      </span>//<span style="color: rgba(0, 0, 0, 1)">要设置
      r.Key,
      false,
      false,
      amqp.Publishing{
            </span>//<span style="color: rgba(0, 0, 0, 1)">类型
            ContentType:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/plain</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
            </span>//<span style="color: rgba(0, 0, 0, 1)">消息
            Body:[]byte(message),
      }, )
}

</span>//<span style="color: rgba(0, 0, 0, 1)">话题模式接收信息
</span>//<span style="color: rgba(0, 0, 0, 1)">要注意key
</span>//其中* 用于匹配一个单词,<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">用于匹配多个单词(可以是零个)</span>
//匹配 表示匹配imooc.* 表示匹配imooc.hello,但是imooc.hello.one需要用imooc.<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">才能匹配到</span>
func (r *<span style="color: rgba(0, 0, 0, 1)">RabbitMQ) RecieveTopic(){
    </span>//<span style="color: rgba(0, 0, 0, 1)">尝试创建交换机,不存在创建
    err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.ExchangeDeclare(
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机名称
      r.Exchange,
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机类型 话题模式
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">topic</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否持久化
      true,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否字段删除
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">true表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否阻塞 true表示要等待服务器的响应
      false,
      nil,
    )
    r.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed to declare an excha</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nge</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>//<span style="color: rgba(0, 0, 0, 1)">2试探性创建队列,创建队列
    q, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.QueueDeclare(
      </span><span style="color: rgba(128, 0, 0, 1)">""</span>,//<span style="color: rgba(0, 0, 0, 1)">随机生产队列名称
      false,
      false,
      true,
      false,
      nil,
    )
    r.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Failed to declare a queue</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>//<span style="color: rgba(0, 0, 0, 1)">绑定队列到exchange中
    err </span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.QueueBind(
      q.Name,
      </span>//在pub/<span style="color: rgba(0, 0, 0, 1)">sub模式下,这里的key要为空
      r.Key,
      r.Exchange,
      false,
      nil,
    )
    </span>//<span style="color: rgba(0, 0, 0, 1)">消费消息
    message, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.Consume(
      q.Name,
      </span><span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
      true,
      false,
      false,
      false,
      nil,
    )
    forever :</span>=<span style="color: rgba(0, 0, 0, 1)"> make(chan bool)
    go func() {
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> d :=<span style="color: rgba(0, 0, 0, 1)"> range message {
            log.Printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Received a message:%s,</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, d.Body)
      }
    }()
    fmt.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">退出请按 Ctrl+C</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>&lt;-<span style="color: rgba(0, 0, 0, 1)"> forever
}


</span>//<span style="color: rgba(0, 0, 0, 1)">路由模式 创建RabbitMQ实例
func NewRabbitMQRouting(exchagne string, routingKey string) </span>*<span style="color: rgba(0, 0, 0, 1)">RabbitMQ {
    </span>//<span style="color: rgba(0, 0, 0, 1)">创建rabbitmq实例
    rabbitmq :</span>= NewRabbitMQ(<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">, exchagne, routingKey)
    var err error
    rabbitmq.conn, err </span>=<span style="color: rgba(0, 0, 0, 1)"> amqp.Dial(rabbitmq.Mqurl)
    rabbitmq.failOnErr(err,</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed   to connect rabbingmq!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    rabbitmq.channel,err </span>=<span style="color: rgba(0, 0, 0, 1)"> rabbitmq.conn.Channel()
    rabbitmq.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed to open a channel</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">rabbitmq
}

</span>//<span style="color: rgba(0, 0, 0, 1)">路由模式发送信息
func (r </span>*<span style="color: rgba(0, 0, 0, 1)"> RabbitMQ) PublishRouting(message string) {
    </span>//<span style="color: rgba(0, 0, 0, 1)">尝试创建交换机,不存在创建
    err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.ExchangeDeclare(
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机名称
      r.Exchange,
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机类型 广播类型
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">direct</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否持久化
      true,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否字段删除
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">true表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否阻塞 true表示要等待服务器的响应
      false,
      nil,
    )
    r.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed to declare an excha</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nge</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>//<span style="color: rgba(0, 0, 0, 1)">发送信息
    err </span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.Publish(
      r.Exchange,
      </span>//<span style="color: rgba(0, 0, 0, 1)">要设置
      r.Key,
      false,
      false,
      amqp.Publishing{
            </span>//<span style="color: rgba(0, 0, 0, 1)">类型
            ContentType:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/plain</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
            </span>//<span style="color: rgba(0, 0, 0, 1)">消息
            Body:[]byte(message),
      }, )
}

</span>//<span style="color: rgba(0, 0, 0, 1)">路由模式接收信息
func (r </span>*<span style="color: rgba(0, 0, 0, 1)">RabbitMQ) RecieveRouting(){
    </span>//<span style="color: rgba(0, 0, 0, 1)">尝试创建交换机,不存在创建
    err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.ExchangeDeclare(
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机名称
      r.Exchange,
      </span>//<span style="color: rgba(0, 0, 0, 1)">交换机类型 广播类型
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">direct</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否持久化
      true,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否字段删除
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">true表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否阻塞 true表示要等待服务器的响应
      false,
      nil,
    )
    r.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">failed to declare an excha</span><span style="color: rgba(128, 0, 0, 1)">"</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nge</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>//<span style="color: rgba(0, 0, 0, 1)">2试探性创建队列,创建队列
    q, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.QueueDeclare(
      </span><span style="color: rgba(128, 0, 0, 1)">""</span>,//<span style="color: rgba(0, 0, 0, 1)">随机生产队列名称
      false,
      false,
      true,
      false,
      nil,
    )
    r.failOnErr(err, </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Failed to declare a queue</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>//<span style="color: rgba(0, 0, 0, 1)">绑定队列到exchange中
    err </span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.QueueBind(
      q.Name,
      </span>//在pub/<span style="color: rgba(0, 0, 0, 1)">sub模式下,这里的key要为空
      r.Key,
      r.Exchange,
      false,
      nil,
    )
    </span>//<span style="color: rgba(0, 0, 0, 1)">消费消息
    message, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.Consume(
      q.Name,
      </span><span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
      true,
      false,
      false,
      false,
      nil,
    )
    forever :</span>=<span style="color: rgba(0, 0, 0, 1)"> make(chan bool)
    go func() {
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> d :=<span style="color: rgba(0, 0, 0, 1)"> range message {
            log.Printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Received a message:%s,</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, d.Body)
      }
    }()
    fmt.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">退出请按 Ctrl+C</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>&lt;-<span style="color: rgba(0, 0, 0, 1)"> forever
}
</span>//简单模式Step:2<span style="color: rgba(0, 0, 0, 1)">、简单模式下生产代码
func (r </span>*<span style="color: rgba(0, 0, 0, 1)">RabbitMQ) PublishSimple (message string) {
    </span>//1<span style="color: rgba(0, 0, 0, 1)">、申请队列,如果队列存在就跳过,不存在创建
    </span>//<span style="color: rgba(0, 0, 0, 1)">优点:保证队列存在,消息能发送到队列中
    _, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.QueueDeclare(
      </span>//<span style="color: rgba(0, 0, 0, 1)">队列名称
      r.QueueName,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否持久化
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否为自动删除 当最后一个消费者断开连接之后,是否把消息从队列中删除
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否具有排他性 true表示自己可见 其他用户不能访问
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否阻塞 true表示要等待服务器的响应
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">额外数学系
      nil,
      )
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      fmt.Println(err)
    }

    </span>//2<span style="color: rgba(0, 0, 0, 1)">.发送消息到队列中
    r.channel.Publish(
      </span>//<span style="color: rgba(0, 0, 0, 1)">默认的Exchange交换机是default,类型是direct直接类型
      r.Exchange,
      </span>//<span style="color: rgba(0, 0, 0, 1)">要赋值的队列名称
      r.QueueName,
      </span>//<span style="color: rgba(0, 0, 0, 1)">如果为true,根据exchange类型和routkey规则,如果无法找到符合条件的队列那么会把发送的消息返回给发送者
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">如果为true,当exchange发送消息到队列后发现队列上没有绑定消费者,则会把消息还给发送者
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">消息
      amqp.Publishing{
            </span>//<span style="color: rgba(0, 0, 0, 1)">类型
            ContentType:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/plain</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
            </span>//<span style="color: rgba(0, 0, 0, 1)">消息
            Body:[]byte(message),
      })
}

func (r </span>*<span style="color: rgba(0, 0, 0, 1)">RabbitMQ) ConsumeSimple() {
    </span>//1<span style="color: rgba(0, 0, 0, 1)">、申请队列,如果队列存在就跳过,不存在创建
    </span>//<span style="color: rgba(0, 0, 0, 1)">优点:保证队列存在,消息能发送到队列中
    _, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.QueueDeclare(
      </span>//<span style="color: rgba(0, 0, 0, 1)">队列名称
      r.QueueName,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否持久化
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否为自动删除 当最后一个消费者断开连接之后,是否把消息从队列中删除
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否具有排他性
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否阻塞
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">额外数学系
      nil,
    )
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      fmt.Println(err)
    }
    </span>//<span style="color: rgba(0, 0, 0, 1)">接收消息
    msgs, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> r.channel.Consume(
      r.QueueName,
      </span>//<span style="color: rgba(0, 0, 0, 1)">用来区分多个消费者
      </span><span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否自动应答
      true,
      </span>//<span style="color: rgba(0, 0, 0, 1)">是否具有排他性
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">如果设置为true,表示不能同一个connection中发送的消息传递给这个connection中的消费者
      false,
      </span>//<span style="color: rgba(0, 0, 0, 1)">队列是否阻塞
      false,
      nil,
      )
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err!=<span style="color: rgba(0, 0, 0, 1)">nil {
      fmt.Println(err)
    }
    forever :</span>=<span style="color: rgba(0, 0, 0, 1)"> make(chan bool)

    </span>//<span style="color: rgba(0, 0, 0, 1)">启用协程处理
    go func() {
      </span><span style="color: rgba(0, 0, 255, 1)">for</span> d :=<span style="color: rgba(0, 0, 0, 1)"> range msgs {
            </span>//<span style="color: rgba(0, 0, 0, 1)">实现我们要处理的逻辑函数
            log.Printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Received a message:%s</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,d.Body)
            </span>//<span style="color: rgba(0, 0, 0, 1)">fmt.Println(d.Body)
      }
    }()

    log.Printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">【*】warting for messages, To exit press CCTRAL+C</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span>&lt;-<span style="color: rgba(0, 0, 0, 1)"> forever
}
复制代码</span></pre>
</div>
<p>&nbsp;</p>
<p>测试</p>
<div class="cnblogs_code">
<pre>//<span style="color: rgba(0, 0, 0, 1)">Simple模式 发送者
rabbitmq :</span>= RabbitMQ.NewRabbitMQSimple(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">imoocSimple</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
rabbitmq.PublishSimple(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello imooc!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>//<span style="color: rgba(0, 0, 0, 1)">接收者
rabbitmq :</span>= RabbitMQ.NewRabbitMQSimple(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">imoocSimple</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
rabbitmq.ConsumeSimple()

</span>//<span style="color: rgba(0, 0, 0, 1)">订阅模式发送者
rabbitmq :</span>= RabbitMQ.NewRabbitMQPubSub(<span style="color: rgba(128, 0, 0, 1)">""</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">newProduct</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> i :=0; i&lt;=100 ; i++<span style="color: rgba(0, 0, 0, 1)"> {
      rabbitmq.PublishPub(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">订阅模式生产第</span><span style="color: rgba(128, 0, 0, 1)">"</span> + strconv.Itoa(i) + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">条数据</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
      fmt.Println(i)
      time.Sleep(</span>1 *<span style="color: rgba(0, 0, 0, 1)"> time.Second)
    }
</span>//<span style="color: rgba(0, 0, 0, 1)">接收者
rabbitmq :</span>= RabbitMQ.NewRabbitMQPubSub(<span style="color: rgba(128, 0, 0, 1)">""</span> + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">newProduct</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
rabbitmq.RecieveSub()

</span>//<span style="color: rgba(0, 0, 0, 1)">路由模式发送者
imoocOne :</span>= RabbitMQ.NewRabbitMQRouting(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">exImooc</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">imooc_one</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    imoocTwo :</span>= RabbitMQ.NewRabbitMQRouting(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">exImooc</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">imooc_two</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> i :=0; i&lt;=10; i++<span style="color: rgba(0, 0, 0, 1)">{
      imoocOne.PublishRouting(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello imooc one!</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> strconv.Itoa(i))
      imoocTwo.PublishRouting(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello imooc two!</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> strconv.Itoa(i))
      time.Sleep(</span>1 *<span style="color: rgba(0, 0, 0, 1)"> time.Second)
      fmt.Println(i)
    }
</span>//<span style="color: rgba(0, 0, 0, 1)">接收者
rabbitmq :</span>= RabbitMQ.NewRabbitMQRouting(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">exImooc</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">imooc_one</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
rabbitmq.RecieveRouting()

</span>//<span style="color: rgba(0, 0, 0, 1)">Topic模式发送者
imoocOne :</span>= RabbitMQ.NewRabbitMQTopic(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">exImoocTopic</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">imooc.topic88.three</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    imoocTwo :</span>= RabbitMQ.NewRabbitMQTopic(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">exImoocTopic</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">imooc.topic88.four</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)

    </span><span style="color: rgba(0, 0, 255, 1)">for</span> i :=0; i&lt;=10; i++<span style="color: rgba(0, 0, 0, 1)">{
      imoocOne.PublishTopic(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello imooc topic three!</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> strconv.Itoa(i))
      imoocTwo.PublishTopic(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello imooc topic four!</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> strconv.Itoa(i))
      time.Sleep(</span>1 *<span style="color: rgba(0, 0, 0, 1)"> time.Second)
      fmt.Println(i)
    }
</span>//<span style="color: rgba(0, 0, 0, 1)">Topic接收者
rabbitmq :</span>= RabbitMQ.NewRabbitMQTopic(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">exImoocTopic</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">#</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
rabbitmq.RecieveTopic()</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div>
</div><br><br>
来源:https://www.cnblogs.com/linyue09/p/14156046.html
頁: [1]
查看完整版本: go操作RabbitMQ