转载自:http://www.cnblogs.com/shi-meng/p/4800080.html

1:驱动

  本来打算自己写一个驱动的,后来发现github上面已经有了,那我就直接拿现成的了, 驱动采用 github.com/streadway/amqp ,直接import就可以啦!

2:exchange and queue

  在上一篇文章中,我们已经创建好virtualhost 、exchange and queue,所以我们先定义这些常量

  

const (
queueName = "push.msg.q"
exchange = "t.msg.ex"
mqurl ="amqp://shi:123@192.168.232.130:5672/test"
)
var conn *amqp.Connection
var channel *amqp.Channel
 

3:错误处理

  

func failOnErr(err error, msg string) {
    if err != nil {
        log.Fatalf("%s:%s", msg, err)
        panic(fmt.Sprintf("%s:%s", msg, err))
    }
}

4:连接mq

func mqConnect() {
var err error
conn, err = amqp.Dial(mqurl)
failOnErr(err, "failed to connect tp rabbitmq") channel, err = conn.Channel()
failOnErr(err, "failed to open a channel")
}

5:push

  先上代码:

func push() {

    if channel == nil {
mqConnect()
}
msgContent := "hello world!" channel.Publish(exchange, queueName, false, false, amqp.Publishing{
ContentType: "text/plain",
Body: []byte(msgContent),
})
}

  其实是很简单的,调用 channel函数的Publish方法,传入exchange name 和 queue name,最后一个参数是消息内容,ContentType我们设置为text/plain, 为文本类型,body是消息内容,要传入字节数组,这样就完成了一条消息的push,接下来我们再看receive

6:receive

代码:

func receive() {
if channel == nil {
mqConnect()
} msgs, err := channel.Consume(queueName, "", true, false, false, false, nil)
failOnErr(err, "") forever := make(chan bool) go func() {
//fmt.Println(*msgs)
for d := range msgs {
s := BytesToString(&(d.Body))
count++
fmt.Printf("receve msg is :%s -- %d\n", *s, count)
}
}() fmt.Printf(" [*] Waiting for messages. To exit press CTRL+C\n")
<-forever
}

  通过调用channel.Consume函数返回一个接受消息的chan类型管道,然后range 这个chan,接收到的数据是[]byte,转换为string后输出

  <-forever  这个是为了控制当前线程不退出

7:入口main

  

func main() {
go func() {
for {
push()
time.Sleep(1 * time.Second)
}
}()
receive()
fmt.Println("end")
close()
}

  for 循环保证每秒发送一条消息到mq,这个地方采用协程保证不阻塞主线程。receive函数不能采用协程,不然主线程就退出了。close函数是释放连接对象,但是在这个例子中是没有起效的,因为线程永远都不会自动退出,只能认为的CTRL+C 或者程序死掉,系统重启

8:执行:

切换到go文件目录执行

go run main.go
//运行日志

receve msg is :hello world! -- 1246
receve msg is :hello world! -- 1247
receve msg is :hello world! -- 1248
receve msg is :hello world! -- 1249
receve msg is :hello world! -- 1250
receve msg is :hello world! -- 1251
receve msg is :hello world! -- 1252
receve msg is :hello world! -- 1253
receve msg is :hello world! -- 1254
receve msg is :hello world! -- 1255
receve msg is :hello world! -- 1256
receve msg is :hello world! -- 1257
receve msg is :hello world! -- 1258
receve msg is :hello world! -- 1259
receve msg is :hello world! -- 1260
receve msg is :hello world! -- 1261
receve msg is :hello world! -- 1262
receve msg is :hello world! -- 1263
receve msg is :hello world! -- 1264
receve msg is :hello world! -- 1265
receve msg is :hello world! -- 1266

9:全部代码

package main

import (
"fmt"
"log"
"bytes"
"time"
"github.com/streadway/amqp"
) var conn *amqp.Connection
var channel *amqp.Channel
var count = 0 const (
queueName = "push.msg.q"
exchange = "t.msg.ex"
mqurl ="amqp://shi:123@192.168.232.130:5672/test"
) func main() {
go func() {
for {
push()
time.Sleep(1 * time.Second)
}
}()
receive()
fmt.Println("end")
close()
} func failOnErr(err error, msg string) {
if err != nil {
log.Fatalf("%s:%s", msg, err)
panic(fmt.Sprintf("%s:%s", msg, err))
}
} func mqConnect() {
var err error
conn, err = amqp.Dial(mqurl)
failOnErr(err, "failed to connect tp rabbitmq") channel, err = conn.Channel()
failOnErr(err, "failed to open a channel")
} func close() {
channel.Close()
conn.Close()
} //连接rabbitmq server
func push() { if channel == nil {
mqConnect()
}
msgContent := "hello world!" channel.Publish(exchange, queueName, false, false, amqp.Publishing{
ContentType: "text/plain",
Body: []byte(msgContent),
})
} func receive() {
if channel == nil {
mqConnect()
} msgs, err := channel.Consume(queueName, "", true, false, false, false, nil)
failOnErr(err, "") forever := make(chan bool) go func() {
//fmt.Println(*msgs)
for d := range msgs {
s := BytesToString(&(d.Body))
count++
fmt.Printf("receve msg is :%s -- %d\n", *s, count)
}
}() fmt.Printf(" [*] Waiting for messages. To exit press CTRL+C\n")
<-forever
} func BytesToString(b *[]byte) *string {
s := bytes.NewBuffer(*b)
r := s.String()
return &r
}

(转)go rabbitmq实践的更多相关文章

  1. Docker 尝试安装rabbitmq实践笔记

    docker pull rabbitmq 自定義的rabbitmq Dockerfile # base image FROM rabbitmq:3.7-management # running req ...

  2. Python操作rabbitmq 实践笔记

    发布/订阅  系统 1.基本用法 生产者 import pika import sys username = 'wt' #指定远程rabbitmq的用户名密码 pwd = ' user_pwd = p ...

  3. NET下RabbitMQ实践[实战篇]

    之前的文章中,介绍了如何将RabbitMQ以WCF方式进行发布.今天就介绍一下我们产品中如何使用RabbitMQ的!          在Discuz!NT企业版中,提供了对HTTP错误日志的记录功能 ...

  4. NET下RabbitMQ实践[配置篇]

    这个系列目前计划写四篇,分别是配置,示例,WCF发布,实战.当然不排除加餐情况.  介绍: rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Publi ...

  5. NET下RabbitMQ实践[示例篇]

    在上一篇文章中,介绍了在window环境下安装erlang,rabbitmq-server,以免配置用户,权限,虚拟机等内容.         今天将会介绍如果使用rabbitmq进行简单的消息入队, ...

  6. NET下RabbitMQ实践[WCF发布篇]

    在之前的两篇文章中,主要介绍了RabbitMQ环境配置,简单示例的编写.今天将会介绍如何使用WCF将RabbitMQ列队以服务的方式进行发布.          注:因为RabbitMQ的官方.net ...

  7. RabbitMQ 实践及使用

    目录 - 1. RabbitMQ的安装    - 1.1 配置好 epel    - 1.2 安装 RPM包    - 1.3 创建用户设置权限- 2. RabbitMQ组件- 3. RabbitMQ ...

  8. rabbitmq实践笔记(一):安装、配置与使用初探

    引言: 对于一个大型的软件系统来说,会有很多的组件.模块及不同的子系统一起协同工作,模块之间的通信需要一个可靠的通信管道来保证 ,通信管道需要解决解决很多问题,比如: 1)信息的发送者和接收者如何维持 ...

  9. RabbitMQ 实践之在处理异步任务中的流程

    一.背景: 我司的系统,用户可以创建任务,启动任务,但任务的运行需要很长的时间,所以采用消息队列的方式,后台异步处理. 这里所用到的是 RabbitMQ . 二.MQ 处理任务的流程 ① ② ③ ④ ...

随机推荐

  1. listview下拉刷新上拉加载扩展(二)-仿美团外卖

    经过前几篇的listview下拉刷新上拉加载讲解,相信你对其实现机制有了一个深刻的认识了吧,那么这篇文章我们来实现一个高级的listview下拉刷新上拉加载-仿新版美团外卖的袋鼠动画: 项目结构: 是 ...

  2. 将Ext JS 6应用程序导入Web项目

    由于Ext JS 6包含了Sencha Touch,因而在应用程序结构有了些改变,Ext JS 5的方法已经不适用于新版本了.经过研究,发现6导入Web项目要比5简单. 下面来说说导入的过程. 使用S ...

  3. 2015年CSDN博客排名第一名,何方神圣?

    2015年CSDN博客排名第一名,何方神圣? 一.引子: 话说博主phphot,雄霸天下好多年. 俱往矣, 落花流水春去也. 斗转星移,江山易主. 详细可以参见下文: CSDN博客排名第一名,何许人也 ...

  4. 过时api LocalActivityManager 作用

    换了个新工作,看公司代码还在用LocalActivityManager类 不知道是个什么东西,百度了也没具体介绍查了下sdk是这样介绍的 LocalActivityManager是一个助手类,在同一个 ...

  5. C语言中字符串常用函数--strcat,strcpy

    strcpy 原型声明:extern char *strcpy(char* dest, const char *src); 头文件:#include <string.h> 功能:把从src ...

  6. 【leetcode】经典算法题-Counting Bits

    题目描述: 给定一个数字n,统计0-n之间的数字二进制的1的个数,并用数组输出 例子: For num = 5 you should return [0,1,1,2,1,2]. 要求: 算法复杂复o( ...

  7. Android反编译获取源码-android学习之旅(70)

    上一讲我们介绍了如何获取资源文件,这一节讲解如何获取源码,其实获取源码真的很简单 首先还是要有工具,Dex2jar,这个工具用于将apk解压之后的dex文件转化为jar文件还有jd-gui的这个工具能 ...

  8. Css中的盒子结构padding和margin的区别

    之前写过一个padding和marfgin的区别的博客见地址:http://blog.csdn.net/qq_32059827/article/details/50998965.那里只是笼统介绍了一下 ...

  9. log4j的一些配置

    a). 新建Java Project>>新建package>>新建java类: b). import jar包(一个就够),这里我用的是log4j-1.2.14.jar, c) ...

  10. 解决Fragment中使用地图,切换会闪一下黑屏的问题

    我用的是高德的3D地图,用2D地图无此问题. 从答案来看,大概是SurfactView与Fragment之间的问题.虽然我用的是高德,不过这方法估计对百度地图也有效. 解决方法是,在使用到地图的Act ...