1.导入依赖
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
</dependencies>
2.自定义RabbitMQ连接池
public class RabbitMqChannelPool extends GenericObjectPool<Channel> {
public RabbitMqChannelPool(PooledObjectFactory<Channel> factory) {
super(factory);
}
public RabbitMqChannelPool(PooledObjectFactory<Channel> factory, GenericObjectPoolConfig config) {
super(factory, config);
}
public RabbitMqChannelPool(PooledObjectFactory<Channel> factory, GenericObjectPoolConfig config, AbandonedConfig abandonedConfig) {
super(factory, config, abandonedConfig);
}
}
3.自定义RabbitMQ连接池工厂
public class RabbitMqChannelPoolFactory implements PooledObjectFactory<Channel> {
private Connection connection;
public RabbitMqChannelPoolFactory(){
try {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("127.0.0.1");
factory.setPort(5672);
factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("/");
factory.setConnectionTimeout(15000);
connection = factory.newConnection();
} catch (IOException | TimeoutException e) {
e.printStackTrace();
}
}
@Override
public PooledObject<Channel> makeObject() throws Exception {
return new DefaultPooledObject<>(connection.createChannel());
}
@Override
public void destroyObject(PooledObject<Channel> p) throws Exception {
if (p != null && p.getObject() != null && p.getObject().isOpen()) {
p.getObject().close();
}
}
@Override
public boolean validateObject(PooledObject<Channel> p) {
return p.getObject() != null && p.getObject().isOpen();
}
@Override
public void activateObject(PooledObject<Channel> p) {
}
@Override
public void passivateObject(PooledObject<Channel> p) {
}
}
4.channel管理
public class RabbitMqChannelService {
private RabbitMqChannelPool pool;
public static RabbitMqChannelService getInstance() {
return SingletonHolder.INSTANCE;
}
public Channel getChannel() throws Exception {
return pool.borrowObject();
}
public void returnChannel(Channel channel) {
pool.returnObject(channel);
}
private static class SingletonHolder {
private final static RabbitMqChannelService INSTANCE = new RabbitMqChannelService();
}
private RabbitMqChannelService() {
initPool();
}
private void initPool() {
RabbitMqChannelPoolFactory factory = new RabbitMqChannelPoolFactory();
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
config.setMaxTotal(300);
config.setMaxIdle(20);
config.setMinIdle(10);
config.setTimeBetweenEvictionRunsMillis(6000);
config.setSoftMinEvictableIdleTimeMillis(20000);
config.setMaxWaitMillis(10000);
pool = new RabbitMqChannelPool(factory, config);
}
}
5.RabbitMQ生产者
public class RabbitMqProducer {
private String queueName;
public RabbitMqProducer(String queueName) {
this.queueName = queueName;
}
public void sendMessage(Serializable obj) {
RabbitMqChannelService rabbitMqChannelService = RabbitMqChannelService.getInstance();
Channel channel = null;
try {
channel = rabbitMqChannelService.getChannel();
channel.queueDeclare(queueName, true, false, false, null);
channel.basicPublish("", queueName, null, SerializationUtils.serialize(obj));
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
if (null != channel) {
rabbitMqChannelService.returnChannel(channel);
}
}
}
}
6.RabbitMQ消费者
public class RabbitMqConsumer implements Consumer {
private static String queueName;
private Channel channel;
private RabbitMqConsumer() {
init();
}
private static class SingletonHolder {
private static final RabbitMqConsumer INSTANCE = new RabbitMqConsumer();
}
public static RabbitMqConsumer getInstance(String queueName) {
if (null == RabbitMqConsumer.queueName) {
RabbitMqConsumer.queueName = queueName;
}
return SingletonHolder.INSTANCE;
}
private void init() {
try {
channel = RabbitMqChannelService.getInstance().getChannel();
System.out.println("启动RabbitMQ监听器:" + channel + "监听QUEUE【" + queueName + "】");
channel.queueDeclare(queueName, true, false, false, null);
channel.basicConsume(queueName, true, this);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
if (null != channel) {
System.out.println("channel ---》" + channel);
}
}
}
@Override
public void handleCancelOk(String consumerTag) {
System.out.println("Consumer " + consumerTag + " registered");
}
@Override
@SuppressWarnings("unchecked")
public void handleDelivery(String consumerTag, Envelope env, AMQP.BasicProperties props, byte[] body) {
SimpleDateFormat sdf = new SimpleDateFormat("", Locale.SIMPLIFIED_CHINESE);
sdf.applyPattern("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println("------------------------------[{}]MQ监听器执行开始[{}]---------------------------");
System.out.println("队列名称:" + env.getRoutingKey());
System.out.println("当前时间:" + sdf.format(System.currentTimeMillis()));
Map<String, String> map = (HashMap<String, String>) SerializationUtils.deserialize(body);
System.out.println("接收消息:" + map.toString());
System.out.println("------------------------------------------------------------------------------");
System.out.println("------------------------------[{}]MQ监听器执行结束[{}]---------------------------");
System.out.println("队列名称:" + env.getRoutingKey());
System.out.println("当前时间:" + sdf.format(System.currentTimeMillis()));
System.out.println("------------------------------------------------------------------------------");
}
@Override
public void handleCancel(String consumerTag) {
}
@Override
public void handleConsumeOk(String consumerTag) {
}
@Override
public void handleRecoverOk(String consumerTag) {
}
@Override
public void handleShutdownSignal(String consumerTag, ShutdownSignalException arg1) {
}
}
7.测试
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
String queueName = "testQueue";
RabbitMqConsumer.getInstance(queueName);
RabbitMqProducer producer = new RabbitMqProducer(queueName);
Map<String, String> map = new HashMap<>(16);
map.put("date", "date");
map.put("time", "time");
map.put("userId", "userId");
producer.sendMessage((Serializable) map);
}
}