文章目录
- RabbitMQ 学习(三)---- 连接工具类
- 工具类完整代码
- 生产者完整代码
- 消费者完整代码
RabbitMQ 学习(三)---- 连接工具类
之前我们写生产者消费者模型的时候,会有很多冗余代码,比如生产者和消费者都需要创建连接工厂、设置连接配置、以及关闭资源等操作。
我们打算将这些冗余的操作封装成一个工具类,我们直接调用类得到相关的信息即可,不必每次都写一些连接的配置信息。
工具类完整代码
使用连接工厂,使用单例模式,static只设置一次配置,创建获取连接的方法,创建关闭资源的方法
代码语言:javascript复制package 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 {
// 单例模式--懒汉式,类加载的时候在去创建实例
private static ConnectionFactory connectionFactory;
// 静态的资源属性只需要赋值一次
static{
connectionFactory = new ConnectionFactory();
connectionFactory.setHost("120.46.143.156"); // 部署rabbitMQ的
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/test");
connectionFactory.setUsername("admin");
connectionFactory.setPassword("123456");
}
// 定义提供连接对象的方法
public static Connection getConnect(){
try {
return connectionFactory.newConnection();
} catch (Exception e){
e.printStackTrace();
}
return null;
}
// 定义关闭资源的方法
public static void close(Channel channel,Connection connection){
if(channel!=null){
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
所以现在,在之前的生产者、消费者Hello World 模型的代码中可以省略很多代码了
生产者完整代码
代码语言:javascript复制package 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 {
// 单例模式--懒汉式,类加载的时候在去创建实例
private static ConnectionFactory connectionFactory;
// 静态的资源属性只需要赋值一次
static{
connectionFactory = new ConnectionFactory();
connectionFactory.setHost("120.46.143.156"); // 部署rabbitMQ的
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/test");
connectionFactory.setUsername("admin");
connectionFactory.setPassword("123456");
}
// 定义提供连接对象的方法
public static Connection getConnect(){
try {
return connectionFactory.newConnection();
} catch (Exception e){
e.printStackTrace();
}
return null;
}
// 定义关闭资源的方法
public static void close(Channel channel,Connection connection){
if(channel!=null){
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
消费者完整代码
代码语言:javascript复制package test;
import com.rabbitmq.client.*;
import utils.RabbitMQUtils;
import java.io.IOException;
public class Customer1 {
public static void main(String[] args) {
Connection connect = RabbitMQUtils.getConnect();
try {
//1、获取信道
assert connect != null;
Channel channel = connect.createChannel();
//2、声明队列,与生产者队列保持一致
channel.queueDeclare("hello", false, false, false, null);
//3、使用队列 接收消息
channel.basicConsume("hello", false, new DefaultConsumer(channel){
// 接受完消息之后执行回调函数,执行后续的业务
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println(new String(body));
}
});
// 4、 不用关闭资源,否则可能接收完参数还未等执行完业务操作,线程结束了
} catch (IOException e) {
e.printStackTrace();
}
}
}