RabbitMQ基础知识

Routing key由生产者指定。Binding key由消费者指定。二者联合决定一条消息的来去。

[size=large][color=black][b]连接[/b][/color][/size]
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(hostName);
Connection conn = factory.newConnection();
Channel channel = conn.createChannel();


[list]
[*]以上是得到一个rabbitmq连接最最基础的代码,当然了,还可以设置一些诸如用户名密码的事情。
[*]最后这个channel就可以用来收和发消息了。
[/list]

[size=large][color=black][b]消息者线程池[/b][/color][/size]
ExecutorService es = Executors.newFixedThreadPool(20);
Connection conn = factory.newConnection(es);

[list]
[*]消费者时使用,上述自动开了一20个线程的池来搞
[/list]

[size=large][color=black][b]地址数组[/b][/color][/size]
Address[] addrArr = new Address[]{ new Address(hostname1, portnumber1)
, new Address(hostname2, portnumber2)};
Connection conn = factory.newConnection(addrArr);

[list]
[*]上述代码如果连hostname1失败了就去hostname2
[*]factory.newConnection()会触发这个检测
[/list]

[size=large][color=black][b]声明exchange与queue[/b][/color][/size]
channel.exchangeDeclare(exchangeName, "direct", true);
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, exchangeName, routingKey);


[list]
[*]channel.exchangeDeclare 参数有 交换机名字 类型 是否持久化 不使用时是否自动删除 是否是内部的(不能被客户端使用) 其他参数
[*]channel.queueDeclare 参数有 queue名字 是否持久化 独占的queue(仅供此连接) 不使用时是否自动删除 其他参数
[*]channel.queueBind 参数有 queue名字 交换机名字 此次绑定使用的路由关键字 其他参数
[/list]

[size=large][color=black][b]发出消息[/b][/color][/size]
byte[] messageBodyBytes = "Hello, world!".getBytes();
channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);

[list]
[*]channel.basicPublish 参数有 要发出的交换机名字 路由关键字 是否强制(设置为true时,找不到收的人时可以通过returnListener返回) 是否立即(其实rabbitmq不支持) 其他属性 消息主体
[/list]

[size=large][color=black][b]线程安全[/b][/color][/size]
[list]
[*]Channel是线程好全的,但是最好是每个线程里用自己的Channel,因为在单个Channel里排队是有可能慢一些的
[/list]

[size=large][color=black][b]最简单的办法消费消息[/b][/color][/size]
boolean autoAck = false;
channel.basicConsume(queueName, autoAck, "myConsumerTag",
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body)
throws IOException
{
String routingKey = envelope.getRoutingKey();
String contentType = properties.contentType;
long deliveryTag = envelope.getDeliveryTag();
// (process the message components here ...)
channel.basicAck(deliveryTag, false);
}
});


[list]
[*]一个Channel一个Consumer
[*]channel.basicAck 回发ACK 参数 tag 是否多个
[/list]

[size=large][color=black][b]零碎[/b][/color][/size]
[list]
[*]channel.basicQos 指定服务质量设置 参数 最大的投送字节数 最大的投送消息数量 设置是否要应用到整个channel(而不是一个消费者)
[*]factory.setAutomaticRecoveryEnabled(true) 网络有问题时,好后可自动恢复设置
[*]cf.setRequestedHeartbeat(5) 设置心跳时间
[*]exchange type可用的值:direct topic headers fanout
[*]exchange的类型有一个default,basicPublish没有指定时使用,而且,如果routingKey在指定绑定的时候,会去到绑定的exchange
[*]channel.queueDeclare().getQueue() 得到的是一个随机queue,断开连接后即删除
[*]当exchange为direct的时候routingKey与bindingKey必须完全一致才能消费消息
[/list]

转自:http://www.cnblogs.com/dwlsxj/p/RabbitMQ.html

http://itindex.net/detail/50865-rabbitmq-java-client
<think>我们正在创建一个关于Java RabbitMQ基础知识学习的Markdown文件。RabbitMQ是一个开源的消息代理和队列服务器,用于在分布式系统之间传递消息。在Java中使用RabbitMQ,我们通常使用它的Java客户端库。 我们将按照以下结构组织内容: 1. RabbitMQ简介 2. 核心概念 3. Java客户端使用步骤 4. 示例代码(生产者、消费者) 5. 交换器类型 6. 队列和消息属性 7. 消息确认机制 8. 持久化 9. 常见问题 注意:在Markdown中,代码块使用三个反引号,并指定语言。 我们将参考用户提供的引用,但注意引用[1]是关于JVM元空间的,引用[2]是关于Java自增自减运算符的,与RabbitMQ无关,因此我们不会在内容中直接引用它们。 但是,由于系统要求引用的段落末尾要添加引用标识,而这里我们并没有使用这两个引用,所以我们不会添加。如果我们在内容中引用了其他资料,我们会添加引用标识。 下面开始生成Markdown内容。 </think>以下是关于 Java RabbitMQ 基础知识的 Markdown 文件框架,包含核心概念和代码实践: ```markdown # Java RabbitMQ 基础知识 ## 一、核心概念 ### 1. RabbitMQ 架构 ```plaintext +-------------+ +-------------+ +----------+ | Producer | ----> | Exchange | ----> | Queue | +-------------+ +-------------+ +----------+ | v +----------+ | Consumer | +----------+ ``` ### 2. 核心组件 - **Exchange**:消息路由中心(四种类型) - **Queue**:存储消息的缓冲区 - **Binding**:交换机和队列的连接规则 - **Channel**:TCP 连接中的虚拟通道 - **Connection**:与 RabbitMQ 服务器的 TCP 连接 ## 二、Java 客户端基础 ### 1. Maven 依赖 ```xml <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.16.0</version> </dependency> ``` ### 2. 生产者示例 ```java public class Producer { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { // 声明队列 (持久化/Durable) channel.queueDeclare(QUEUE_NAME, true, false, false, null); String message = "Hello RabbitMQ!"; // 发布消息 (持久化模式) channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes(StandardCharsets.UTF_8)); System.out.println(" [x] Sent: " + message); } } } ``` ### 3. 消费者示例 ```java public class Consumer { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); // 声明队列(需与生产者一致) channel.queueDeclare(QUEUE_NAME, true, false, false, null); // 回调函数处理消息 DeliverCallback deliverCallback = (consumerTag, delivery) -> { String message = new String(delivery.getBody(), "UTF-8"); System.out.println(" [x] Received: " + message); // 手动ACK确认 channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); }; // 消费消息(关闭自动ACK) channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {}); } } ``` ## 三、关键配置详解 ### 1. 交换机类型 | 类型 | 路由规则 | 使用场景 | |-------------|----------------------------------|-----------------------| | `Direct` | 精确匹配 RoutingKey | 点对点消息 | | `Fanout` | 广播到所有绑定队列 | 发布/订阅 | | `Topic` | 通配符匹配 RoutingKey | 多维度路由 | | `Headers` | 根据消息头属性匹配 | 复杂路由逻辑 | ### 2. 消息持久化 ```java // 队列持久化 channel.queueDeclare(QUEUE_NAME, true, false, false, null); // 消息持久化 channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, // ← 关键参数 message.getBytes()); ``` ### 3. 消息确认机制 - **自动 ACK**:`channel.basicConsume(QUEUE, true, ...)` - **手动 ACK**: ```java channel.basicConsume(QUEUE, false, ...); // 处理完成后手动确认 channel.basicAck(deliveryTag, multiple); ``` ## 四、最佳实践 1. **连接复用**:每个线程使用独立 Channel,共用 Connection 2. **资源释放**:确保关闭 Channel 和 Connection 3. **异常处理**:添加 `ShutdownListener` 监听连接中断 4. **QoS 控制**: ```java channel.basicQos(1); // 每次只处理一条消息 ``` > 完整项目示例:[rabbitmq-java-tutorial](https://github.com/rabbitmq/rabbitmq-tutorials/tree/master/java) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值