我是 golang 的新手,我想重构我的代码,以便 rabbitmq 初始化在 main.c 的另一个函数中。所以我使用一个结构指针(包含所有已初始化的 rabbitmq 信息)并将其传递给发送函数,但它告诉我:无法发布消息:异常(504)原因:“ channel /连接未打开”
结构:
type RbmqConfig struct {
q amqp.Queue
ch *amqp.Channel
conn *amqp.Connection
rbmqErr error
}
初始化函数:
func initRabbitMq() *RbmqConfig {
config := &RbmqConfig{}
config.conn, config.rbmqErr = amqp.Dial("amqp://guest:guest@localhost:5672/")
failOnError(config.rbmqErr, "Failed to connect to RabbitMQ")
defer config.conn.Close()
config.ch, config.rbmqErr = config.conn.Channel()
failOnError(config.rbmqErr, "Failed to open a channel")
defer config.ch.Close()
config.q, config.rbmqErr = config.ch.QueueDeclare(
"<my_queue_name>",
true, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
failOnError(config.rbmqErr, "Failed to declare a queue")
return config
}
主要内容:
config := initRabbitMq()
fmt.Println("queue name : ", config.q.Name)
sendMessage(config, <message_to_send>)
在发送消息中:
func sendMessage(config *RbmqConfig, <message_to_send>) {
config.rbmqErr = config.ch.Publish(
"", // exchange
config.q.Name, // routing key
false, // mandatory
false,
amqp.Publishing{
DeliveryMode: amqp.Persistent,
ContentType: "text/plain",
Body: []byte(<message_to_send>),
})
failOnError(config.rbmqErr, "Failed to publish a message")
如果有人有任何想法,那将非常有帮助。提前谢谢你
最佳答案
在您的init 中,您编写了defer config.conn.Close(),它将在函数返回时执行。也就是说,每当 init 完成时,您的连接将被关闭,从而导致未打开的连接。
您需要在 main 或您希望它关闭的地方延迟连接关闭。
关于 golang -RabbitMq : channel/connection is not open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36579759/
绝对详细的RabbitMQ实践操作手册,看完本系列就够了。一、什么是MQ?1、MQ的概念2、理解消息队列二、MQ的优势和劣势1、优势和作用2、劣势三、MQ的应用场景四、AMQP五、工作原理一、什么是MQ?1、MQ的概念MQ全称MessageQueue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。下面用图来理解异步通信,并阐明与同步通信的区别。同步通信:甲乙两人面对面交流,你一句我一句必须同步进行,两人除此之外不做任何事情异步通信:异步通信相当于通过第三方转述对话,可能有消息的延迟,但不需要二人时刻保持联系,消息传给第三方后,两人可以做其他自己想做的事情,当需要获取
我有一个订阅用户的ActionCable方法。如果开始新的session,我也想为用户订阅新channel。我想不出在Controller中调用channel方法的正确语法。更新:问题是消息在发送时附加到聊天框,但是当发送第一条消息时,websocket连接尚未建立,因此在用户看来好像消息没有发送(因为它没有被附加)。channel/msgs_channel.rbclassMsgsChannel在我的convosController中,create方法,我尝试了几种方法:convos_controller.rbdefcreate@convo=Convo.create!({sender_
我正在尝试创建一个公开ActionCablechannel的gem,但我无法让它工作。这是我的宝贝#lib/my_channel.rbclassMyChannel然后我将gem添加到我的主要应用程序Gemfile,运行bundleinstall,启动控制台并运行MyChannel。没有屈服和错误,这意味着channel已正确包含。然后我将其添加到我的主应用程序//application.jsvarsocket="ws://localhost:3000/cable";varcable=ActionCable.createConsumer(socket);cable.subscriptio
我正在尝试实现一个具有两个输入channel和一个输出channel的ScriptProcessorNode。varsource=newArray(2);source[0]=context.createBufferSource();source[0].buffer=buffer[0];source[1]=context.createBufferSource();source[1].buffer=buffer[1];vartest=context.createScriptProcessor(4096,2,1);source[0].connect(test,0,0);source[1].c
在我的工作文件中,我监听数据回调。someLib是Node串口。process.on('message',function(msg){someLib.on('data',function(data){console.log('somedata');process.send(data);});});这打印somedataError:channelclosed但是process.on('message',function(msg){process.send('foobar');});工作正常。这很奇怪,但有时第一个代码示例有效,所以channel关闭错误随机出现。来自http://node
RabbitMQ+WebStomp很棒。但是,我有一些主题我希望安全为只读或只写。似乎保护这些的唯一机制是使用rabbitmqctl。我可以创建一个虚拟主机,一个用户,然后应用一些权限。然而,这就是Stomp和Rabbit实现开始崩溃的地方。主题采用以下形式:stomp中的/topic/blah,它使用路由键“blah”路由到Rabbit中的“amq.topic”。似乎没有办法为路由key设置权限。似乎:rabbitmqctlset_permissions-pvhostuser".*"".*""^amq\.topic"是我能做的最好的,这仍然是“所有”主题。我也研究过交换,但没有办法在
如何在不使用DiscordAPI的情况下使用JS和Chrome控制台将Discord消息发送到Discordchannel?好像是不可能的…… 最佳答案 打开discord控制台:ctrl+shift+i(不起作用?请参阅下面的编辑)然后进入网络选项卡。现在我们需要嗅探一条消息,所以在discord中输入一条消息并发送。然后在控制台网络选项卡中右键单击名为“messages”的请求,然后选择“Copyasfetch”。然后转到“控制台”选项卡。粘贴请求。编辑此请求以删除“noonce”字段。还有,用您的消息编辑“内容”字段。当您按下
根据我的阅读,我希望以下JavaScript代码记录“一切都很好”,但它却遇到了错误情况:varaudio=document.createElement('audio');varctx=newwindow.AudioContext();varsource=ctx.createMediaElementSource(audio);audio.src='http://www.mediacollege.com/audio/tone/files/440Hz_44100Hz_16bit_30sec.mp3';//As@padenotmentioned,thisisthenumberofchanne
1.延迟队列延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。很可惜,在RabbitMQ中并未提供延迟队列功能,但是我们有其他的方式可以实现延迟队列,方法就是TTL+死信队列,组合实现延迟队列的效果。2.什么是TTLTTL,全称TimeToLive,消息过期时间设置。消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。队列过期后,会将队列所有消息全部移除。一个队列中某一个消息过期后,只有消息在队列顶端,才会判断
我启用了父进程和子进程之间的通信,以便按如下方式发送JSON:child:try{varprice1=parseInt(process.argv[2]);if(!price1){thrownewError('Priceincalculations.jsundefined');}varresult={'timeStamp':Date(),'prices':{'player1':price1,'player2':666}};process.send(result);}catch(e){//Incaseofanerror,Igethereasexpected.process.send(e);