1、本文分享RabbitMQ的工具类,经过实际项目长期测试,在此分享给发家,各位大神有什么建议请指正 !!!

2、下面是链接池主要代码:

 import java.util.HashMap;
import java.util.Map; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory; /**
* 获取RabbitMq连接
* @author skyfeng
*/
public class RabbitMqConnectFactory {
static Logger log = LoggerFactory.getLogger(RabbitMqConnectFactory.class);
/**
* 缓存连接工厂,将建立的链接放入map缓存
*/
private static Map<String, ConnectionFactory> connectionFactoryMap = new HashMap<String, ConnectionFactory>();
/**
* 根据rabbitMqName获取一个连接,使用完记得要自己关闭连接 conn.close()
*/
public static Connection getConnection(String rabbitMqName) {
if(StringUtils.isEmpty(rabbitMqName)){
log.error("rabbitMqName不能为空!");
throw new java.lang.NullPointerException("rabbitMqName为空");
}
if(connectionFactoryMap.get(rabbitMqName)==null){
initConnectionFactory(rabbitMqName);
}
ConnectionFactory connectionFactory = connectionFactoryMap.get(rabbitMqName);
if(connectionFactory==null){
log.info("没有找到对应的rabbitmq,name={}",rabbitMqName);
}
try {
return connectionFactory.newConnection();
}catch (Exception e) {
log.error("创建rabbitmq连接异常!",e);
return null;
}
}
/**
* 初始化一个连接工厂
* @param rabbitMqName
*/
private static void initConnectionFactory(String rabbitMqName){ try {
ConnectionFactory factory = new ConnectionFactory();
//新增代码,如果连接断开会自动重连
//factory.setAutomaticRecoveryEnabled(true);
factory.setHost("127.0.0.1");
factory.setPort(5672);
//factory.setVirtualHost(vhost);
factory.setUsername("test");
factory.setPassword("test");
connectionFactoryMap.put(rabbitMqName, factory);
} catch (Exception e) {
e.printStackTrace();
}finally{
}
} }

3、消费端的代码:

 import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Consumer; /**
* RabbitMQq客户端代码
* @author skyfeng
*
*/
public class CustomerMqClient { final static Logger log = LoggerFactory.getLogger(CustomerMqClient.class);
private final static String RABBITMQ_NAME = "mq_name";
private final static String EXCHANGE_NAME = "Exchange_name";
private final static String QUEUE_NAME = "queue_name";
private static Channel channel = null;
private static Connection connection = null; /**
* 初始化客户端代码
*/
public static void initClient() {
//重新链接时判断之前的channel是否关闭,没有关闭先关闭
if(null != channel && channel.isOpen()){
try {
channel.close();
} catch (Exception e) {
log.error("mq name =[" +RABBITMQ_NAME+"] close old channel exception.e={}",e);
}finally {
channel = null;
}
}
//重新链接时判断之前的connection是否关闭,没有关闭先关闭
if (null != connection && connection.isOpen()) {
try {
connection.close();
} catch (Exception e) {
log.error("mq name =[" +RABBITMQ_NAME+"] close old connection exception.e={}",e);
}finally{
connection = null;
}
}
//从链接池中获取链接
connection = RabbitMqConnectFactory.getConnection(RABBITMQ_NAME);
try {
channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "topic", true);
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "#");//#号接收所有的数据
Consumer consumer = new CustomerMqConsumer(channel);//具体的业务逻辑在CustomerMqConsumer中
channel.basicConsume(QUEUE_NAME, false, consumer);
} catch (Exception e) {
log.error("CustomerMqClient mq client connection fail .....{}", e);
//发生异常时,重连
reConnect();
}
} // 异常时,重连的方法
public static void reConnect() {
log.error("等待5s后重连");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
initClient();
} }

4、生产端代码:

 import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.rabbitmq.client.AlreadyClosedException;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection; /**
* 把数据发送到rabbitmq的exchange,
*/
public class SendToExchange {
static Logger log = LoggerFactory.getLogger(SendToExchange.class); final static String TYPE = "topic";
final static String CHARSET_UTF8 = "UTF-8";
//MQ生产者exchange,把数据发给这个exchange
final static String rabbitExchangeName = "ExchangeName";
static boolean mqConnected = false;//mq当前处于连接状态 static Channel channel=null;
static{
init();
}
public static void init(){
log.info(" rabbit mq init begin...");
try {
//在mq连接中断后,发送程序判断已经断开,启动重连的时候会执行
if(channel!=null){
try {
channel.close();
} catch (Exception e) {
log.error("关闭老channel 异常",e);
}finally{
channel = null;
}
}
Connection connection = RabbitMqConnectFactory.getConnection("connection");
channel = connection.createChannel();
/*
*这里只定义exchange,因为每个业务模块都会从这里接入数据,所以不在这里定义队列
*队列的定义在各个业务模块自己的消费端定义
*/
channel.exchangeDeclare(rabbitExchangeName, TYPE, true, false, null);
log.info(" rabbit mq init OK");
mqConnected = true;
} catch (Exception e) {
log.error("rabbitmq初始化错误",e);
mqConnected = false;
}
}
/**
* 往rabbitmq发数据
* @param message
*/
public static void sendToRabbitMq(String message,String routingKey){
try {
if(StringUtils.isEmpty(message)){
log.debug("message is empty");
return;
}
channel.basicPublish(rabbitExchangeName, routingKey, null, message.getBytes(CHARSET_UTF8));
}catch(AlreadyClosedException ex){
log.error("往rabbitmq发数据报错,可能连接已关闭,尝试重连,data:",message,ex);
init();
}catch (Exception e) {
log.error("往rabbitmq发数据报错,data:",message,e);
}
}
}

RabbitMQ连接池、生产者、消费者实例的更多相关文章

  1. Linux 进程间通信(包含一个经典的生产者消费者实例代码)

    前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一 ...

  2. 线程锁,threadinglocal,线程池,生产者消费者模型

    1.线程锁 1.锁Lock(只能锁一次) import threading import time v = [] lock = threading.Lock() def func(arg): lock ...

  3. Java 线程池 +生产者消费者+MySQL读取300 万条数据

    1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...

  4. Go语言协程并发---生产者消费者实例

    package main import ( "fmt" "strconv" "time" ) /* 改进生产者消费者模型 ·生产者每秒生产一 ...

  5. Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

  6. JDBC连接池。。。转载

    1. 引言  近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机  应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架 ...

  7. 用连接池提高Servlet访问数据库的效率

    Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本.Servlet超越CGI的优势之一在于,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据.本文介绍 ...

  8. (转)websphere线程池 连接池设置

    原文:http://www.talkwithtrend.com/Article/207511 池(Pool)是WebSphere中最常涉及的概念之一.从网络.Web 服务器.Web 容器.EJB 容器 ...

  9. 为什么要用Jedis连接池+浅谈jedis连接池使用

    为什么要使用Jedis连接池 Redis作为缓存数据库理论上和MySQL一样需要客户端和服务端建立起来连接进行相关操作,使用MySQL的时候相信大家都会使用一款开源的连接池,例如C3P0.因为直连会消 ...

随机推荐

  1. (转)Hadoop 简介

    转自:http://www.open-open.com/lib/view/open1385685943484.html mapreduce是一种模式,一种什么模式呢?一种云计算的核心计算模式,一种分布 ...

  2. Oracle的物理结构的三种文件

    .dbf数据文件,是用于存储数据库数据的文件,例如表中的记录,索引,数据字典信息等,可以通过系统数据字典DBA_DATA_FILES查看相关信息.与逻辑角度的表空间(并不是真正的文件)对应,一个表空间 ...

  3. Stream中的map

    #map可以让一个对象A的流转换为宁外一种对象B的流(其实也是A对象元素组成的流) 1.对象转换为List集合 //若Eticket是一个对象,其中orderId是String类型 //eticket ...

  4. MySQL学习(六)change-buffer

    文章部分总结描述来自参考文章,属于半原创. 概述     文章将会介绍 change buffer 相关的知识点 查看 MySQL InnoDB 状态的命令 SHOW ENGINE INNODB ST ...

  5. 每天进步一点点------ORCAD Capture CIS 快捷键

                   ORCAD Capture CIS 快捷键 I: 放大O: 缩小C: 以光标所指为新的窗口显示中心 W: 画线On/OffP: 快速放置元件R: 元件旋转90°H: 元件 ...

  6. docker为镜像添加SSH服务

    启动并进入容器中 这里用db1容器完成实验. 安装openssh服务和修改sshd配置文件 安装openssh yum install openssh-server openssh-clients - ...

  7. php preg正则表达式的组成部分

    定界符号 : 多种都可以,常用为// 原子 : 最小的一个匹配单位 (放在定界符中),在一个正则表达式中,至少要有一个原子 1,打印字符(a-z A-Z 0-9 ~!@#$%^&*()_+.. ...

  8. Java连载64-finally语法及其注意事项

    一.finally语句块 1.注意点: (1)finally语句块可以直接和try语句块联合使用.try...finally.... (2)try.....catch.....finally也可以执行 ...

  9. vue 项目太大, 导致 javascript heap out of memory

    原因: node 环境, 对单个进程的内存是有限制的, 但是现在前端项目太大, 所以我们需要根据当前机器环境, 手动加大node的内存限制 安装包 npm i increase-memory-limi ...

  10. 设置DataGridView的单元格颜色

    RowPrePaint事件: private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArg ...