关于java和python同时使用rabbitmq时队列同名问题的探讨
问题引出:
我们知道,进程之间是不能直接通信的,但是今天学习rabbitmq时发现一个奇怪的问题,即当我开启rabbitmq,用java写好的代码给rabbitmq发送完消息后并没有急着使用java去消费消息,转而使用python写好的代码来消费消息,发现python程序完美的接收到来自java程序发出的消息
问题分析:
rabbitmq是用elang语言编写的适用于多平台的一款应用程序,我们使用代码去连接rabbitmq时相当于使用了某种连接手段达成rabbitmq和该程序之间的通信,socket底层是如何具体封装的我们不得而知,但我们可以知道socket编程就是一种实现进程间通信的手段,我想大概rabbimqt和python程序的通信就是采用的这种方式吧。由此,我们想到了进程通信的实现手段之一:客户端----》服务器---》客户端模型,所以看到java发送的消息能够在python程序中消费掉绝非偶然,而是必然。所以可以使用一个中间代理(RabbitMQ),实现不同进程之间的通信。由此,不同进程之间的通信得以解决
java生产方代码(Productor.java):
package RabbitMQTest; import java.util.HashMap;
import java.util.Map;
import com.rabbitmq.client.AMQP.Queue;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; public class Productor {
public static String QUEUE_NAME = "hello";
public static void main(String[] args) {
//初始化socket链接
ConnectionFactory factory = new ConnectionFactory();
//指定链接地址
factory.setHost("localhost");
try{
//建立程序和rabbitmq的socket连接
Connection connection = factory.newConnection();
//创建管道
Channel channel = connection.createChannel();
//声明队列
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//让当前线程睡眠8s,以检验rabbitmq的消息轮询
//Thread.currentThread().sleep(8000);
String message = "hello,world";
//发送消息
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println("[x] send the message"+message);
channel.close();
connection.close();
}catch (Exception e) {
System.out.println("程序出错:"+e);
}
}
}
python消费方代码(Consumer.py):
# __author__ = 'STEVEN'
import pika
#创建socket链接
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
#创建管道
channel = connection.channel()
#创建队列
channel.queue_declare('hello')
#声明回调函数
def callback(ch,method,properties,body):
print('[x] recieved message%r'%body.decode())
#如果接受到消息就调用回调函数,准备接受消息
channel.basic_consume(callback,queue='hello',no_ack=True)
print('[*] is waiting for recieve mess press ctrl+c to eixt')
#开始消费消息
channel.start_consuming()
保证java发送的数据能被python接收到的前提条件:
两者声明消息队列时采用的队列名称必须一致,本例中都是queue_name = "hello"
关于java和python同时使用rabbitmq时队列同名问题的探讨的更多相关文章
- openresty 学习笔记番外篇:python访问RabbitMQ消息队列
openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...
- Python操作rabbitmq消息队列持久化
消息队列持久化 Python操作rabbit消息队列的持久化,如下: # 创建一个名为balance的队列,对queue进行durable持久化设为True(持久化第一步)channel.queue_ ...
- 使用Python学习RabbitMQ消息队列
rabbitmq基本管理命令: 一步启动Erlang node和Rabbit应用:sudo rabbitmq-server 在后台启动Rabbit node:sudo rabbitmq-server ...
- java及python调用RabbitMQ
1,python调用MQ发送消息(生产者),话不多说,直接上干货 import pika 如下图 2.java调用MQ发送消息(生产者) 具体代码如下: python 的代码如下 connection ...
- Python并发编程-RabbitMQ消息队列
RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...
- Python RabbitMQ消息队列
python内的队列queue 线程 queue:不同线程交互,不能夸进程 进程 queue:只能用于父进程与子进程,或者同一父进程下的多个子进程,进行交互 注:不同的两个独立进程是不能交互的. ...
- python监控rabbitmq的消息队列数量
[root@localhost chen]# cat b.py #!/usr/bin/python # -*- coding: UTF-8 -*- import json,time import re ...
- 使用EasyNetQ组件操作RabbitMQ消息队列服务
RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...
- Python之RabbitMQ的使用
今天总结一下Python关于Rabbitmq的使用 RabbitMQ官网说明,其实也是一种队列,那和前面说的线程queue和进程queue有什么区别呢? 线程queue只能在同一个进程下进行数据交互 ...
随机推荐
- POJ2478 Farey Sequence —— 欧拉函数
题目链接:https://vjudge.net/problem/POJ-2478 Farey Sequence Time Limit: 1000MS Memory Limit: 65536K To ...
- mac配置apache
http://www.cnblogs.com/snandy/archive/2012/11/13/2765381.html 用自带的 sudo apachectl -v sudo apachectl ...
- mysql优化20条原则
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...
- RequireJS 加载 js 执行顺序
初次接触RequireJS 对文档理解不很透彻,自己通过测试测到的执行顺序: 文档结构: |-amaze | -js | -amazeui.js | -jquery.min.js | -main.js ...
- python中字符串的内置方法
这里说的是字符串中的内置方法,毕竟字符串是最常用的操作对象. ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '_ ...
- BZOJ_1495_[NOI2006]网络收费_树形DP
BZOJ_1495_[NOI2006]网络收费_树形DP Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而, 不可忽视的一点就 ...
- 「网络流24题」「LuoguP3358」 最长k可重区间集问题(费用流
题目描述 对于给定的开区间集合 I 和正整数 k,计算开区间集合 I 的最长 k可重区间集的长度. 输入输出格式 输入格式: 的第 1 行有 2 个正整数 n和 k,分别表示开区间的个数和开区间的可重 ...
- python程序的pypy加速
我们知道,python作为一种几乎是脚本语言的语言,其优点固然有,但是其有一个最大的缺点,就是运行速度没有办法和c,c++,java比.最近在些一些代码的时候也是碰到了这样的问题. 具体而言,pyth ...
- NOIP2000提高组(RQNOJ314)方格取数
题目描述 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): 某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达 ...
- 堆栈(栈stack)的实现和基本用法(二)
个人网站http://www.ravedonut.com/ 栈的应用: #include <iostream> #include <stack> using namespace ...