基本流程:
消息生产者
创建连接连接到MabbitMQ
1,创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
2,设置MabbitMQ所在主机ip或者主机名
factory.setHost("localhost");
3,创建一个连接
Connection connection = factory.newConnection();
4,创建通道
Channel channel = connection.createChannel();
5,声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null)
6,发布消息
String message = "hello world!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
7,关闭通道和连接
channel.close();
connection.close();
消息消费者
1,打开连接和创建频道,与发送端一样
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
2,声明队列,主要为了防止消息接收者先运行此程序,队列还不存在时创建队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
3,创建队列消费者
QueueingConsumer consumer = new QueueingConsumer(channel);
4,指定消费队列
channel.basicConsume(QUEUE_NAME, true, consumer);
5,接收消息
while (true){
//nextDelivery是一个阻塞方法(内部实现其实是阻塞队列的take方法)
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
}
部分接口
1其中声明队列的方法
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
参数分别代表 队列名,是否持久化,独占的queue, 不使用时是否自动删除,其他参数
2发布消息
channel.basicPublish(exchangeName, routingKey, MessageProperties, message.getBytes());
第一个参数转发器默认为" "
第二个参数为关键词,这里是指定队列名
第三个是设置消息的一些属性,可以为null
第四个是设置消息
3消费消息
channel.basicConsume(String queuename, boolean autoAck, Consumer consumer)
autoAck 代表自动应答,默认true开启,手动应答为false
4声明转发器
channel.exchangeDeclare("logs","fanout");
转发器类型有
- direct 直接转发 消息会被推送至绑定键(binding key)和消息发布附带的选择键(routing key)完全匹配的队列
- topic 主题转发 必须是由点隔开的一系列的标识符组成。标识符可以是任何东西,但是一般都与消息的某些特性相关。一些合法的选择键的例子:"stock.usd.nyse", "nyse.vmw","quick.orange.rabbit".你可以定义任何数量的标识符,上限为255个字节 *可以匹配一个标识符, #可以匹配0个或多个标识符。
- headers
- fanout 把所有接收到的消息,广播到所有它所知道的队列
5临时队列
Java中我们可以使用queueDeclare()方法,不传递任何参数,来创建一个非持久的、唯一的、自动删除的队列且队列名称由服务器随机产生。
String queueName = channel.queueDeclare().getQueue();
6绑定
channel.queueBind(queueName, EXCHANGE_NAME, binding key);
其中bindingKey对应发布消息中的routingKey