要在RabbitMQ中创建队列并配置不同的交换机类型(Fanout、Direct、Topic)以实现消息的发送和监听接收,首先需要安装并启动RabbitMQ服务,然后可以通过编程接口(如AMQP协议)或管理界面来进行设置。以下是通过编程方式(这里以Python的pika库为例):
创建队列
Python
1import pika
2
3# 创建连接和通道
4connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
5channel = connection.channel()
6
7# 声明一个队列,如果不存在则创建
8queue_name = 'my_queue'
9channel.queue_declare(queue=queue_name)
10
11# 关闭连接
12connection.close()
创建并绑定交换机与队列
Fanout交换机
Fanout交换机会将消息广播给所有绑定到它的队列。
Python
1# 创建Fanout交换机并绑定到队列
2exchange_name = 'fanout_exchange'
3channel.exchange_declare(exchange=exchange_name, exchange_type='fanout')
4
5# 将队列绑定到Fanout交换机
6channel.queue_bind(exchange=exchange_name, queue=queue_name)
Direct交换机
Direct交换机根据routing_key精确匹配将消息路由到队列。
Python
1# 创建Direct交换机并绑定到队列
2exchange_name = 'direct_exchange'
3channel.exchange_declare(exchange=exchange_name, exchange_type='direct')
4
5# 将队列绑定到Direct交换机,假设我们有 routing_key='direct_key'
6channel.queue_bind(exchange=direct_exchange, queue=queue_name, routing_key='direct_key')
Topic交换机
Topic交换机根据routing_key的模式匹配将消息路由到队列。
Python
1# 创建Topic交换机并绑定到队列
2exchange_name = 'topic_exchange'
3channel.exchange_declare(exchange=exchange_name, exchange_type='topic')
4
5# 将队列绑定到Topic交换机,假设我们有 routing_key='*.log' 表示匹配包含.log的消息
6channel.queue_bind(exchange=topic_exchange, queue=queue_name, routing_key='*.log')
发送消息
Python
1def send_message(exchange_name, routing_key, message):
2 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
3 channel = connection.channel()
4
5 # 声明交换机(若已存在则无须再次声明)
6 channel.exchange_declare(exchange=exchange_name, exchange_type='fanout'/'direct'/'topic')
7
8 # 发送消息
9 channel.basic_publish(exchange=exchange_name,
10 routing_key=routing_key,
11 body=message)
12
13 connection.close()
14
15# 示例发送
16send_message('fanout_exchange', '', 'Hello from Fanout!')
17send_message('direct_exchange', 'direct_key', 'Hello from Direct!')
18send_message('topic_exchange', '*.log', 'Hello from Topic!')
接收消息
Python
1def consume_messages(queue_name):
2 def callback(ch, method, properties, body):
3 print(" [x] Received %r" % body)
4
5 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
6 channel = connection.channel()
7
8 # 声明并确认队列(如果尚未声明)
9 channel.queue_declare(queue=queue_name)
10
11 # 开始消费消息
12 channel.basic_consume(queue=queue_name,
13 on_message_callback=callback,
14 auto_ack=True)
15
16 print(' [*] Waiting for messages. To exit press CTRL+C')
17 channel.start_consuming()
18
19# 启动消费者监听指定队列
20consume_messages('my_queue')
以上代码展示了如何在RabbitMQ中创建队列并分别与不同类型的交换机绑定,以及如何发送和监听消息。在实际应用中,生产者和消费者通常会运行在不同的进程中或不同的服务器上。