zoukankan      html  css  js  c++  java
  • spring boot 常见的第三方集成

    spring boot基于1.x.

    一 集成redis

    1.1 配置

    spring.redis.host = localhost
    spring.redis.port = 6379
    spring.redis.timeout = 10000
    spring.redis.database = 0
    spring.redis.pool.max-active = 100
    spring.redis.pool.max-wait = -1
    spring.redis.pool.max-idle = 8
    spring.redis.pool.min-idle = 0
    View Code

    1.2 

    工具类

    package com.test.util;
    
    import java.util.List;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    import org.springframework.data.redis.core.HashOperations;
    import org.springframework.data.redis.core.ListOperations;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.SetOperations;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.data.redis.core.ZSetOperations;
    import org.springframework.stereotype.Component;
    
    /**
     * @ClassName:RedisTemplateUtil
     * @Description: redis工具类
     * @author:
     * @date:2018-03-08 23:28:23
     *
     */
    @SuppressWarnings("unchecked")
    @Component
    public class RedisTemplateUtil {
    
        @SuppressWarnings("rawtypes")
        @Autowired
        private RedisTemplate redisTemplate;
        /**
         * 写入缓存
         * @param key
         * @param value
         * @return
         */
        public boolean set(final String key, Object value, Integer database) {
            boolean result = false;
            try {
                JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) redisTemplate.getConnectionFactory();
                jedisConnectionFactory.setDatabase(database);
                redisTemplate.setConnectionFactory(jedisConnectionFactory);
    
                ValueOperations<String, Object> operations = (ValueOperations<String, Object>) redisTemplate.opsForValue();
                operations.set(key, value);
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
        /**
         * 写入缓存设置时效时间
         * @param key
         * @param value
         * @return
         */
        public boolean set(final String key, Object value, Long expireTime, TimeUnit unit, Integer database) {
            boolean result = false;
            try {
                JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) redisTemplate.getConnectionFactory();
                jedisConnectionFactory.setDatabase(database);
                redisTemplate.setConnectionFactory(jedisConnectionFactory);
                ValueOperations<String, Object> operations = redisTemplate.opsForValue();
                operations.set(key, value, expireTime, unit);
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
        /**
         * 批量删除对应的value
         * @param keys
         */
        public void remove(Integer database, final String... keys) {
            for (String key : keys) {
                remove(database, key);
            }
        }
    
        /**
         * 批量删除key
         * @param pattern
         */
        public void removePattern(Integer database, final String pattern) {
            Set<String> keys = redisTemplate.keys(pattern);
            if (keys.size() > 0){
                JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) redisTemplate.getConnectionFactory();
                jedisConnectionFactory.setDatabase(database);
                redisTemplate.setConnectionFactory(jedisConnectionFactory);
                redisTemplate.delete(keys);
            }
        }
        /**
         * 删除对应的value
         * @param key
         */
        public void remove(Integer database, final String key) {
            if (exists(database, key)) {
                redisTemplate.delete(key);
            }
        }
        /**
         * 判断缓存中是否有对应的value
         * @param key
         * @return
         */
        public boolean exists(Integer database, final String key) {
            JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) redisTemplate.getConnectionFactory();
            jedisConnectionFactory.setDatabase(database);
            redisTemplate.setConnectionFactory(jedisConnectionFactory);
            return redisTemplate.hasKey(key);
        }
        /**
         * 读取缓存
         * @param key
         * @return
         */
        public Object get(Integer database, final String key) {
            Object result = null;
            JedisConnectionFactory jedisConnectionFactory = (JedisConnectionFactory) redisTemplate.getConnectionFactory();
            jedisConnectionFactory.setDatabase(database);
            redisTemplate.setConnectionFactory(jedisConnectionFactory);
            ValueOperations<String, Object> operations = redisTemplate.opsForValue();
            result = operations.get(key);
            return result;
        }
        /**
         * 哈希 添加
         * @param key
         * @param hashKey
         * @param value
         */
        public void hmSet(String key, Object hashKey, Object value){
            HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
            hash.put(key,hashKey,value);
        }
    
        /**
         * 哈希获取数据
         * @param key
         * @param hashKey
         * @return
         */
        public Object hmGet(String key, Object hashKey){
            HashOperations<String, Object, Object>  hash = redisTemplate.opsForHash();
            return hash.get(key,hashKey);
        }
    
        /**
         * 列表添加
         * @param k
         * @param v
         */
        public void lPush(String k,Object v){
            ListOperations<String, Object> list = redisTemplate.opsForList();
            list.rightPush(k,v);
        }
    
        /**
         * 列表获取
         * @param k
         * @param l
         * @param l1
         * @return
         */
        public List<Object> lRange(String k, long l, long l1){
            ListOperations<String, Object> list = redisTemplate.opsForList();
            return list.range(k,l,l1);
        }
    
        /**
         * 集合添加
         * @param key
         * @param value
         */
        public void add(String key,Object value){
            SetOperations<String, Object> set = redisTemplate.opsForSet();
            set.add(key,value);
        }
    
        /**
         * 集合获取
         * @param key
         * @return
         */
        public Set<Object> setMembers(String key){
            SetOperations<String, Object> set = redisTemplate.opsForSet();
            return set.members(key);
        }
    
        /**
         * 有序集合添加
         * @param key
         * @param value
         * @param scoure
         */
        public void zAdd(String key,Object value,double scoure){
            ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
            zset.add(key,value,scoure);
        }
    
        /**
         * 有序集合获取
         * @param key
         * @param scoure
         * @param scoure1
         * @return
         */
        public Set<Object> rangeByScore(String key,double scoure,double scoure1){
            ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
            return zset.rangeByScore(key, scoure, scoure1);
        }
        
        public void extentExpire(String key, Long expireTime, TimeUnit unit) {
            redisTemplate.boundValueOps(key).expire(expireTime, unit);
        }
    }
    View Code

    二 集成elasticsearch

    2.1 配置

    elasticsearch.ip=localhost
    elasticsearch.port=9300
    elasticsearch.cluster.name=my-elasticsearch
    elasticsearch.pool=100
    elasticsearch.index=test
    elasticsearch.type=test
    View Code

    2.2

    package com.test.util;
    
    import java.util.Map;
    import java.util.UUID;
    
    import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
    import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
    import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
    import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
    import org.elasticsearch.action.delete.DeleteResponse;
    import org.elasticsearch.action.get.GetRequestBuilder;
    import org.elasticsearch.action.get.GetResponse;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.action.update.UpdateRequest;
    import org.elasticsearch.action.update.UpdateResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import com.alibaba.fastjson.JSONObject;
    
    /**
     * ES的操作数据类
     * 
     * 备注:对es的一些操作做了一些封装,抽出来一些操作,就是传统的dao层,数据服务
     * 
     * 
     *
     */
    @Component
    public class ESRepository {
    
        private static final Logger log = LoggerFactory.getLogger(ESRepository.class);
    
        @Autowired
        private TransportClient client;
    
        /**
         * 创建索引
         *
         * @param index
         * @return
         */
        public boolean buildIndex(String index) {
            if (!isIndexExist(index)) {
                log.info("Index is not exits!");
            }
            CreateIndexResponse buildIndexresponse = client.admin().indices().prepareCreate(index).execute().actionGet();
            log.info(" 创建索引的标志: " + buildIndexresponse.isAcknowledged());
    
            return buildIndexresponse.isAcknowledged();
        }
    
         /**
         * 删除索引
         *
         * @param index
         * @return
         */
        public boolean deleteIndex(String index) {
            if (!isIndexExist(index)) {
                log.info(" 索引不存在 !!!!!!");
            }
            DeleteIndexResponse diResponse = client.admin().indices().prepareDelete(index).execute().actionGet();
            if (diResponse.isAcknowledged()) {
                log.info("删除索引**成功** index->>>>>>>" + index);
            } else {
                log.info("删除索引**失败** index->>>>> " + index);
            }
            return diResponse.isAcknowledged();
        }
    
        /**
         * 查询数据
         * @param index 索引<----->关系型数据库
         * @param type  类型<----->关系型数据表
         * @param id    数据ID<----->id
         * @return
         */
        public Map<String, Object> searchDataByParam(String index, String type, String id) {
            if(index == null || type == null || id == null) {
                log.info(" 无法查询数据,缺唯一值!!!!!!! ");
                return null;
            }
            //来获取查询数据信息
            GetRequestBuilder getRequestBuilder = client.prepareGet(index, type, id);
            GetResponse getResponse = getRequestBuilder.execute().actionGet(); 
            //这里也有指定的时间获取返回值的信息,如有特殊需求可以
    
            return getResponse.getSource();
        }
    
        /**
         * 更新数据
         *
         * @param data  添加的数据类型 json格式的
         * @param index 索引<----->关系型数据库
         * @param type  类型<----->关系型数据表
         * @param id    数据ID<----->id
         * @return
         */
        public void updateDataById(JSONObject data, String index, String type, String id) {
            if(index == null || type == null || id == null) {
                log.info(" 无法更新数据,缺唯一值!!!!!!! ");
                return;
            }
    
            //更新步骤
            UpdateRequest up = new UpdateRequest();
            up.index(index).type(type).id(id).doc(data);
    
            //获取响应信息
            //.actionGet(timeoutMillis),也可以用这个方法,当过了一定的时间还没得到返回值的时候,就自动返回。
            UpdateResponse response = client.update(up).actionGet();
            log.info("更新数据状态信息,status{}", response.status().getStatus());
        }
    
        /**
         * 添加数据
         *
         * @param data  添加的数据类型 json格式的
         * @param index 索引<----->关系型数据库
         * @param type  类型<----->关系型数据表
         * @param id    数据ID<----->id
         * @return
         */
        public String addTargetDataALL(String data, String index, String type, String id) {
            //判断一下次id是否为空,为空的话就设置一个id
            if(id == null) {
                id = UUID.randomUUID().toString();
            }
            //正式添加数据进去
            IndexResponse response = client.prepareIndex(index, type, id).setSource(data).get();
    
            log.info("addTargetDataALL 添加数据的状态:{}", response.status().getStatus());
    
            return response.getId();
        }
    
        /**
         * 通过ID删除数据
         *
         * @param index 索引,类似数据库
         * @param type  类型,类似表
         * @param id    数据ID
         */
        public void delDataById(String index, String type, String id) {
    
            if(index == null || type == null || id == null) {
                log.info(" 无法删除数据,缺唯一值!!!!!!! ");
                return;
            }
            //开始删除数据
            DeleteResponse response = client.prepareDelete(index, type, id).execute().actionGet();
    
            log.info("删除数据状态,status-->>>>{},", response.status().getStatus());
        }
    
        /**
         * 判断索引是否存在
         *
         * @param index
         * @return
         */
        public boolean isIndexExist(String index) {
            IndicesExistsResponse iep = client.admin().indices().exists(new IndicesExistsRequest(index)).actionGet();
            if (iep.isExists()) {
                log.info("此索引 [" + index + "] 已经在ES集群里存在");
            } else {
                log.info(" 没有此索引 [" + index + "] ");
            }
            return iep.isExists();
        }
    
    }
    View Code

    三 集成fastdfs

    3.1

    配置

    fastdfs.minPoolSize=10
    fastdfs.maxPoolSize=30
    fastdfs.waitTimes=200
    
    
    connect_timeout = 2
    network_timeout = 30
    charset = UTF-8
    http.tracker_http_port = 8180
    tracker_server = 10.20.8.252:22122
    View Code

    3.2

    工具类

    package com.test.comm;
    
    import java.util.concurrent.LinkedBlockingQueue;
    import java.util.concurrent.TimeUnit;
    
    import org.csource.fastdfs.ClientGlobal;
    import org.csource.fastdfs.StorageClient1;
    import org.csource.fastdfs.StorageServer;
    import org.csource.fastdfs.TrackerServer;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    /**
     * Title:ConnectionPool Copyright:Copyright(c)2018 Company:test
     *
     * @author 
     * @date 2018年9月18日 下午3:15:50
     */
    @Component
    public class ConnectionPool {
    
        private final static Logger logger = LoggerFactory.getLogger(ConnectionPool.class);
    
        /** 空闲的连接池 */
        private LinkedBlockingQueue<StorageClient1> idleConnectionPool = new LinkedBlockingQueue<StorageClient1>();
    
    
        /** 连接池默认最小连接数 */
        @Value("${fastdfs.minPoolSize}")
        private long minPoolSize;
    
        /** 连接池默认最大连接数 */
        @Value("${fastdfs.maxPoolSize}")
        private long maxPoolSize;
    
        /** 默认等待时间(单位:秒) */
        @Value("${fastdfs.waitTimes}")
        private long waitTimes;
        
        @Value("${spring.profiles.active}")
        private String profile;
        
        /**
         * @Description: 创建TrackerServer,并放入空闲连接池
         */
        public void createTrackerServer() {
            logger.debug("[创建TrackerServer(createTrackerServer)]");
            TrackerServer trackerServer = null;
            try {
                initClientGlobal();
                for (int i = 0; i < minPoolSize; i++) {
                    // 把client1添加到连接池
                    StorageServer storageServer = null;
                    StorageClient1 client1 = new StorageClient1(trackerServer, storageServer);
                    idleConnectionPool.add(client1);
                }
            } catch (Exception e) {
                logger.error("[创建TrackerServer(createTrackerServer)][异常:{}]", e);
            }
        }
    
        /**
         * @Description: 获取空闲连接 1).在空闲池(idleConnectionPool)中弹出一个连接;
         *               2).把该连接放入忙碌池(busyConnectionPool)中; 3).返回 connection
         *               4).如果没有idle connection, 等待 wait_time秒, and check again
         * @throws AppException
         */
        public StorageClient1 checkout() {
            StorageClient1 client1 = idleConnectionPool.poll();
            if (client1 == null) {
                if (idleConnectionPool.size() < maxPoolSize) {
                    createTrackerServer();
                    try {
                        client1 = idleConnectionPool.poll(waitTimes, TimeUnit.SECONDS);
                    } catch (Exception e) {
                        logger.error("[获取空闲连接(checkout)-error][error:获取连接超时:{}]", e);
                    }
                }
            }
    
            // 添加到忙碌连接池
            // busyConnectionPool.put(client1, obj);
            logger.debug("[获取空闲连接(checkout)][获取空闲连接成功]");
            return client1;
        }
    
        /**
         * @Description: 释放繁忙连接 1.如果空闲池的连接小于最小连接值,就把当前连接放入idleConnectionPool;
         *               2.如果空闲池的连接等于或大于最小连接值,就把当前释放连接丢弃;
         * @param client1
         *            需释放的连接对象
         */
        public void checkin(StorageClient1 client1) {
            logger.debug("[释放当前连接(checkin)]");
            client1 = null;
            if (idleConnectionPool.size() < minPoolSize) {
                createTrackerServer();
            }
        }
    
        private void initClientGlobal() throws Exception {
            String FASTDFS_CONFIG = "application-" + profile + ".properties";
            ClientGlobal.init(FASTDFS_CONFIG);
        }
    
        public LinkedBlockingQueue<StorageClient1> getIdleConnectionPool() {
            return idleConnectionPool;
        }
    
        public long getMinPoolSize() {
            return minPoolSize;
        }
    
        public void setMinPoolSize(long minPoolSize) {
            if (minPoolSize != 0) {
                this.minPoolSize = minPoolSize;
            }
        }
    
        public long getMaxPoolSize() {
            return maxPoolSize;
        }
    
        public void setMaxPoolSize(long maxPoolSize) {
            if (maxPoolSize != 0) {
                this.maxPoolSize = maxPoolSize;
            }
        }
    
        public long getWaitTimes() {
            return waitTimes;
        }
    
        public void setWaitTimes(int waitTimes) {
            if (waitTimes != 0) {
                this.waitTimes = waitTimes;
            }
        }
    }
    View Code

    四 集成rabbitmq

    4.1 配置

    spring.rabbitmq.host=localhost
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=admin
    spring.rabbitmq.password=12345678
    spring.rabbitmq.publisher-confirms=true
    spring.rabbitmq.virtual-host=/
    View Code

    4.2

    package com.test.rabbitmq;
    
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.Queue;
    import org.springframework.amqp.core.TopicExchange;
    import org.springframework.context.annotation.Bean;
    
    /**
     * 在这里新建一个队列,并将队列与交换机绑定
     *
     * <p>
     * Title:Application
     * </p>
     * <p>
     * Description:TODO
     * </p>
     * <p>
     * Copyright:Copyright(c)2005
     * </p>
     * <p>
     * Company:test
     * </p>
     *
     * @author 
     * @date 2018年9月12日 上午9:40:48
     */
    public class Application {
    
        /**
         * 新建队列
         */
    
        @Bean
        public Queue queuePush() {
            return new Queue("sy-admin-push");
        }
    
        /**
         * 创建交换机
         */
        @Bean
        TopicExchange exchange() {
            return new TopicExchange("sy-exchange-admin");
        }
        
        /**
         * 绑定交换机
         */
        
         /**
         * 将队列topic.message与exchange绑定,binding_key为topic.message,就是完全匹配
         * @param queueMessage
         * @param exchange
         * @return
         */
        @Bean
        Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {
            return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
        }
        
        @Bean
        public void binding () {
            Queue queue = queuePush();
            TopicExchange exchange = exchange();
            bindingExchangeMessage(queue, exchange);
        }
    }
    View Code

    模拟消费者

    package com.test.rabbitmq;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.amqp.rabbit.annotation.RabbitHandler;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;
    
    import com.test.util.AESUtils;
    
    @Component
    @RabbitListener(queues = "test")
    public class Consumer {
        
        private final static Logger logger = LoggerFactory.getLogger(Consumer.class);
    
        @RabbitHandler
        public void process(String message) {
            logger.debug("模拟移动端接收到一条推送消息" + message);
            logger.debug("解密后的消息 " + AESUtils.decryptData(message));
        }
    
    }
    View Code

    模拟生产者

    package com.test.rabbitmq;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import com.test.util.AESUtils;
    
    @Component
    public class Producer {
        
        private final static Logger logger = LoggerFactory.getLogger(Producer.class);
        
        @Autowired
        private RabbitTemplate rabbitTemplate;
        
        public void producer (final String queue, final String message) {
            new Thread(new Runnable() {
                
                @Override
                public void run() {
                    logger.debug("接收到一条消息" + message);
                    //加密
                    String newMessage = AESUtils.encryptData(message);
                    logger.debug("加密后的消息为 " + newMessage);
                    rabbitTemplate.convertSendAndReceive(queue, newMessage);
                    logger.debug("向移动端推送消息" + newMessage);
                    
                }
            }).start();
            
        }
    
    }
    View Code
  • 相关阅读:
    MVC 与传统的 webform 的比较
    Visual Studio 类模板的修改
    2015-3-3
    SQL SERVER类型与C#类型对照
    数据库连接串的配置
    Could not load file or assembly 'System.Web.Mvc' or one of its dependencies. The located assembly's manifest definition does not
    多条查询sql语句返回多表数据集
    URL和搜索引擎优化
    XPath 语法示例
    如何把数据库的某个字段更新为另一个字段
  • 原文地址:https://www.cnblogs.com/eryuan/p/9993319.html
Copyright © 2011-2022 走看看