Utils类
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class RabbitMqUtils {
public static ConnectionFactory getFactory() {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.139.129");
factory.setUsername("guest");
factory.setPassword("guest");
// 1 == > n
factory.setVirtualHost("/");
return factory;
}
public static Connection getConnection() throws IOException, TimeoutException {
ConnectionFactory factory = getFactory();
return factory.newConnection();
}
public static Channel getChannel() throws IOException, TimeoutException {
Connection connection = getConnection();
return connection.createChannel();
}
}
Publish/Subscribe
publish
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import utils.RabbitMqUtils;
public class EmitLog {
private static final String EXCHANGE_NAME = "logs";
public static void main(String[] argv) throws Exception {
try (Connection connection = RabbitMqUtils.getConnection();
Channel channel = connection.createChannel()) {
{
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
channel.queueDeclare("email", true, false, false, null);
channel.queueDeclare("phone", true, false, false, null);
channel.queueBind("phone", EXCHANGE_NAME, "");
channel.queueBind("email", EXCHANGE_NAME, "");
}
String message = argv.length < 1 ? "info: Hello Python!" :
String.join(" ", argv);
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
subscriber
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import utils.RabbitMqUtils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class ReceiveLogs {
private static final String EXCHANGE_NAME = "logs";
static Channel channel;
private static String queueName = "email";
static {
try {
channel = RabbitMqUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(queueName, EXCHANGE_NAME, "");
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
public static void main(String[] argv) throws Exception {
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {
});
}
}
Work queues
Worker
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import utils.RabbitMqUtils;
public class Worker {
private static final String TASK_QUEUE_NAME = "task_queue";
public static void main(String[] argv) throws Exception {
final Channel channel = RabbitMqUtils.getChannel();
channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
channel.basicQos(1);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
try {
doWork(message);
} finally {
System.out.println(" [x] Done");
// 提交ack
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}
};
// 接收消息, autoack:自动回复
channel.basicConsume(TASK_QUEUE_NAME, false, deliverCallback, consumerTag -> {
});
}
private static void doWork(String task) {
for (char ch : task.toCharArray()) {
if (ch == '.') {
try {
Thread.sleep(1000);
} catch (InterruptedException _ignored) {
Thread.currentThread().interrupt();
}
}
}
}
}
NewTask
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.MessageProperties;
import utils.RabbitMqUtils;
public class NewTask {
private static final String TASK_QUEUE_NAME = "task_queue";
public static void main(String[] argv) throws Exception {
try (Connection connection = RabbitMqUtils.getConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
String message = String.join(" ", argv);
message += "hello jsons";
// 发布消息 exchange:交换机 , props:消息的属性,body:消息的内容
channel.basicPublish("", TASK_QUEUE_NAME,
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes("UTF-8"));
// channel.basicPublish("", TASK_QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
Routing
producer
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import utils.RabbitMqUtils;
public class EmitLogDirect {
private static final String EXCHANGE_NAME = "direct_logs";
public static void main(String[] argv) throws Exception {
try (Connection connection = RabbitMqUtils.getConnection();
Channel channel = connection.createChannel()) {
{
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
channel.queueDeclare("email", true, false, false, null);
channel.queueDeclare("phone", true, false, false, null);
channel.queueBind("phone", EXCHANGE_NAME, "PHONE_KEY");
channel.queueBind("email", EXCHANGE_NAME, "EMAIL_KEY");
}
String severity = "PHONE_KEY", message = "PHONE_KEY";
channel.basicPublish(EXCHANGE_NAME, severity, null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + severity + "':'" + message + "'");
}
}
}
consumer
import com.rabbitmq.client.*;
import utils.RabbitMqUtils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class ReceiveLogsDirect {
static Channel channel;
private static final String EXCHANGE_NAME = "direct_logs";
private static String queueName = "phone";
static {
try {
channel = RabbitMqUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);
channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(queueName, EXCHANGE_NAME, "PHONE_KEY");
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
public static void main(String[] argv) throws Exception {
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + delivery.getEnvelope().getRoutingKey() + "':'" + message + "'");
};
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {
});
}
}
Topics
EmitLogTopic
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import utils.RabbitMqUtils;
public class EmitLogTopic {
private static final String EXCHANGE_NAME = "topic_logs";
public static void main(String[] argv) throws Exception {
try (Connection connection = RabbitMqUtils.getConnection();
Channel channel = connection.createChannel()) {
{
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
channel.queueDeclare("email", true, false, false, null);
channel.queueDeclare("phone", true, false, false, null);
channel.queueBind("email", EXCHANGE_NAME, "TOPIC.#.email.#");
channel.queueBind("phone", EXCHANGE_NAME, "TOPIC.#.phone.#");
}
for (int i = 0; i < 5; i++) {
channel.basicPublish(EXCHANGE_NAME, "TOPIC.email", null, "email".getBytes("UTF-8"));
}
for (int i = 0; i < 5; i++) {
channel.basicPublish(EXCHANGE_NAME, "TOPIC.phone", null, "phone".getBytes("UTF-8"));
}
for (int i = 0; i < 5; i++) {
channel.basicPublish(EXCHANGE_NAME, "TOPIC.phone.email", null, "phone.email".getBytes("UTF-8"));
}
}
}
}
ReceiveLogsTopic
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import utils.RabbitMqUtils;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class ReceiveLogsTopic {
private static final String EXCHANGE_NAME = "topic_logs";
private static Channel channel = null;
private static String queueName = "phone";
static {
try {
channel = RabbitMqUtils.getChannel();
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(queueName, EXCHANGE_NAME, "TOPIC.#.phone.#");
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
public static void main(String[] argv) throws Exception {
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + delivery.getEnvelope().getRoutingKey() + "':'" + message + "'");
};
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {
});
}
}
SpringBoot整合
package com.gaw.mq_springboot;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author : JCccc
* @CreateTime : 2019/9/3
* @Description :
**/
@Configuration
public class RabbitConfig {
public static final String EXCHANGE_NAME = "topic_logs";
public static final String EMAIL = "email";
public static final String PHONE = "phone";
//交换机
@Bean(name = EXCHANGE_NAME)
public Exchange EXCHANGE_NAME() {
return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
}
// 队列
@Bean(name = EMAIL)
public Queue EMAIL() {
return new Queue(EMAIL);
}
// 队列
@Bean(name = PHONE)
public Queue PHONE() {
return new Queue(PHONE);
}
// 绑定
@Bean
public Binding binding_EAMIL(@Qualifier(EMAIL) Queue email, @Qualifier(EXCHANGE_NAME) Exchange exchange) {
return BindingBuilder.bind(email).to(exchange).with("TOPIC.#.email.#").noargs();
}
// 绑定
@Bean
public Binding binding_PHONE(@Qualifier(PHONE) Queue phone, @Qualifier(EXCHANGE_NAME) Exchange exchange) {
return BindingBuilder.bind(phone).to(exchange).with("TOPIC.#.phone.#").noargs();
}
}
package com.gaw.mq_springboot;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class Receiver {
// @RabbitHandler
@RabbitListener(queues = RabbitConfig.EMAIL)
public void process(Map testMessage, Message msg, Channel channel) {
System.out.println("DirectReceiver消费者收到消息 : " + testMessage.toString());
}
}
package com.gaw.mq_springboot;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@RestController
public class SendMessageController {
@Autowired
RabbitTemplate rabbitTemplate; //使用RabbitTemplate,这提供了接收/发送等等方法
@GetMapping("/sendDirectMessage")
public String sendDirectMessage() {
// {createTime=2020-04-28 10:51:04, messageId=e67e6e8f-e2c3-40cf-b300-aaa784bbdbb6, messageData=test message, hello!}
String messageId = String.valueOf(UUID.randomUUID());
String messageData = "test message, hello!";
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String, Object> map = new HashMap<>();
map.put("messageId", messageId);
map.put("messageData", messageData);
map.put("createTime", createTime);
//将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchange
for (int i = 0; i < 5; i++) {
rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_NAME, "TOPIC.phone.email", map);
}
return "ok";
}
}
在这里插入代码片