import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
@Slf4j
@Service
public class MessageService {
/**
* 声明消息队列、交换机、绑定、消息处理
*/
public static void handleMessage() throws IOException, TimeoutException {
ConnectionFactory connectionFactory = new ConnectionFactory();
// 配置 RabbitMQ 的主机地址
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
try(
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel()
) {
// 名字:属于什么什么就且在前面
/* ------- restaurant-------- */
// 声明交换机
channel.exchangeDeclare(
// 交换机名称
// 建议名称格式 exchange.<服务名>.<目标服务名>
"exchange.order.restaurant",
// 队列类型 direct 全匹配
BuiltinExchangeType.DIRECT,
// 是否持久化,必须持久化,防止 rabbitmq 重启数据丢失
true,
// 如果没有连接,是否自动删除
false,
// 是否有其他参数,没有所以 null
null
);
// 声明队列
channel.queueDeclare(
// 队列名称
// queue.<服务名>
"queue.order",
// 是否持久化
true,
// 是否独占,这个服务连接这个队列其他服务就不能连接
false,
// 是否自动删除
false,
// 是否存在其他参数
null
);
// 将交换机、队列绑定到一起,并声明 routingKey
channel.queueBind(
"queue.order",
"exchange.order.restaurant",
"key.order"
);
/* ------- deliveryman-------- */
// 声明交换机
channel.exchangeDeclare(
// 交换机名称
// 建议名称格式 exchange.<服务名>.<目标服务名>
"exchange.order.deliveryman",
// 队列类型 direct 全匹配
BuiltinExchangeType.DIRECT,
// 是否持久化,必须持久化,防止 rabbitmq 重启数据丢失
true,
// 如果没有连接,是否自动删除
false,
// 是否有其他参数,没有所以 null
null
);
// 我们接受这个消息,永远都是在一个 队列 上接收
// 只是这个消息可能是不同 交换机 给我们发送过来的
// 将交换机、队列绑定到一起,并声明 routingKey
channel.queueBind(
"queue.order",
"exchange.order.deliveryman",
"key.order"
);
}
}
public static void main(String[] args) throws IOException, TimeoutException {
handleMessage();
}
}