当前位置: 首页 > news >正文

建设信用卡银行积分商城网站莱芜网站建设价格低

建设信用卡银行积分商城网站,莱芜网站建设价格低,手机网站搭建公司,唯品会一家专做特卖的网站文章目录一、配置事务依赖使用注解二、Elasticsearch创建项目配置maven完善依赖es连接配置实体映射repositoryservicecontroller三、swagger依赖启动类路径匹配配置配置类controller注解四、redis#xff08;代码实现#xff09;依赖yml配置配置类封装redisTamplate五、rabbi… 文章目录一、配置事务依赖使用注解二、Elasticsearch创建项目配置maven完善依赖es连接配置实体映射repositoryservicecontroller三、swagger依赖启动类路径匹配配置配置类controller注解四、redis代码实现依赖yml配置配置类封装redisTamplate五、rabbitMQ依赖yml配置配置类生产者代码消费者代码测试一下一、配置事务 依赖 !-- 事务管理依赖以下二选一即可--!-- 用来开启事务使用 但是mybatis-plus-boot-starter默认引入了sprint-tx -- !-- dependency-- !-- groupIdorg.springframework/groupId-- !-- artifactIdspring-tx/artifactId-- !-- /dependency--!-- springboot整合的事务开启依赖无论是mybatis或是mybatis-plus都适用 -- !-- dependency-- !-- groupIdorg.springframework.boot/groupId-- !-- artifactIdspring-boot-starter-aop/artifactId-- !-- /dependency--使用注解 在启动类上添加注解 EnableTransactionManagement //开启事务在需要开启事务的类或者方法上使用注解前者表示该类的所有方法都开启事务后者表示只对具体的方法开启事务 Transactional(rollbackFor Exception.class)如果括号里不带参数表示仅在遇到运行时异常时才回滚而写了rollbackFor Exception.class表示遇到非运行时异常也回滚。 二、Elasticsearch 官方文档 Elasticsearch教程 自己搭建了一个简单的demo仓库在这里可以直接运行不过需要自行安装Elasticsearch7.16.3并在application.yml改一下url。 创建项目 用spring initializr 快速搭建一个项目sdk选的1.8java版本是8。 spring boot版本选择2.7.x。 勾选这些依赖 配置maven file settings build,execution,deployment build tools maven 完善依赖 pom.xml ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.2/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdtracy/groupIdartifactIdclaimnet-client/artifactIdversion0.0.1-SNAPSHOT/versionnameclaimnet-client/namedescriptionclaimnet客户端/descriptionpropertiesjava.version8/java.version/propertiesdependenciesdependencygroupIdorg.springframework.data/groupIdartifactIdspring-data-elasticsearch/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build/project es连接配置 application.yml spring:elasticsearch:rest:uris: http://es服务器ip:9200实体映射 package tracy.claimnetclient.entity;import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType;import java.io.Serializable;Data Document(indexName text,createIndex false) //如果Elasticsearch库中原本不存在这个索引的数据这里可以写true public class Text implements Serializable {Id //将下面这个属性标记为idField(name id,type FieldType.Text)String id;Field(name application_no,type FieldType.Text)String applicationNo;Field(name content,type FieldType.Text)String content;Field(name date,type FieldType.Text)String date;Field(name entity,type FieldType.Text)String entity;Field(name feature,type FieldType.Text)String feature; }注意这些属性和Elasticsearch数据库中对应文档中的属性是一一对应的。 repository ElasticsearchRepository中提供了很多线程的方法可以满足简单的增删改查需求 package tracy.claimnetclient.repository;import org.springframework.data.domain.PageRequest; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import tracy.claimnetclient.entity.Text; import java.util.List;public interface TextRepository extends ElasticsearchRepositoryText,String {//这里的String表示id的类型//PageRequest用来实现分页查询ListText findTextsByIdOrApplicationNoOrContent(String id, String app, String keyword, PageRequest pageRequest); } service 接口 package tracy.claimnetclient.service;import tracy.claimnetclient.entity.Text; import tracy.claimnetclient.util.PairResult;import java.util.List;public interface TextService {ListText text(String keyword,Integer curPage,Integer pageSize); }实现 package tracy.claimnetclient.service;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import tracy.claimnetclient.entity.Text; import tracy.claimnetclient.repository.TextRepository; import tracy.claimnetclient.util.PairResult;import java.util.Arrays; import java.util.List;Service public class TextServiceImpl implements TextService{Autowiredprivate TextRepository textRepository;Overridepublic ListText text(String keyword, Integer curPage, Integer pageSize) {if(curPagenull)curPage1;if(pageSizenull)pageSize10;return textRepository.findTextsByIdOrApplicationNoOrContent(keyword,keyword,keyword, PageRequest.of(curPage-1,pageSize));} }controller package tracy.claimnetclient.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import tracy.claimnetclient.entity.Claim; import tracy.claimnetclient.entity.Text; import tracy.claimnetclient.service.ClaimService; import tracy.claimnetclient.service.TextService;import java.util.List;RestController RequestMapping(/search) public class SearchController {Autowiredprivate TextService textService;GetMapping(/text/{keyword})public ListText text(PathVariable(keyword)String keyword,Integer curPage,Integer pageSize) {return textService.text(keyword,curPage,pageSize);} }【OK】 三、swagger 参考 依赖 !-- 引入swagger相关的jar --dependencygroupIdio.springfox/groupIdartifactIdspringfox-boot-starter/artifactIdversion3.0.0/version/dependency启动类 类上添加注解EnableOpenApi 路径匹配配置 application.yml spring:mvc:pathmatch:matching-strategy: ant_path_matcher配置类 package tracy.claimnetclient.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.service.VendorExtension; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList;Configuration public class SwaggerConfiguration {Beanpublic Docket docket() {//这里要配置controller包return new Docket(DocumentationType.OAS_30).select().apis(RequestHandlerSelectors.basePackage(tracy.claimnetclient.controller)).paths(PathSelectors.any()).build().apiInfo(setApiInfo());}private ApiInfo setApiInfo() {//作者信息Contact contact new Contact(tracy,https://blog.csdn.net/Tracycoder?spm1011.2415.3001.5343,1409568085qq.com);//项目描述ApiInfo info new ApiInfo(Claimnet-client Restful Api, , v1.0,https://blog.csdn.net/Tracycoder?spm1011.2415.3001.5343, contact,Apache 2.0, , new ArrayListVendorExtension());return info;} }controller注解 使用类、方法、参数注解 package tracy.claimnetclient.controller;import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import tracy.claimnetclient.entity.Claim; import tracy.claimnetclient.entity.Text; import tracy.claimnetclient.service.ClaimService; import tracy.claimnetclient.service.TextService;import java.util.List;Api(tags 检索模块) RestController RequestMapping(/search) public class SearchController {Autowiredprivate TextService textService;Autowiredprivate ClaimService claimService;ApiOperation(value 根据id、申请号、内容查询text索引文档, notes api/search/text, response List.class)GetMapping(/text/{keyword})public ListText text(ApiParam(value 关键词, required true) PathVariable(keyword)String keyword,ApiParam(value 当前页码) Integer curPage,ApiParam(value 页大小) Integer pageSize) {return textService.text(keyword,curPage,pageSize);} } 最后启动项目访问http://127.0.0.1:8080/swagger-ui/index.html。 四、redis代码实现 依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdversion2.5.9/version/dependencyyml配置 spring:redis:host: ip地址database: 0port: 6379配置类 package com.yy.myconfig;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;/*** 自定义一个redis template模板*/ Configuration public class RedisConfig {BeanSuppressWarnings(all)public RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) {//为了使开发方便直接使用String, ObjectRedisTemplateString, Object template new RedisTemplate();template.setConnectionFactory(factory);//Json序列化配置Jackson2JsonRedisSerializer jackson2JsonRedisSerializer new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);//string的序列化StringRedisSerializer stringRedisSerializer new StringRedisSerializer();//key采用string的序列化方式template.setKeySerializer(stringRedisSerializer);//hash的key也是用string的序列化方式template.setHashKeySerializer(stringRedisSerializer);//value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);//hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;} } 封装redisTamplate 代码来自- package tracy.client.util;import org.springframework.data.redis.connection.DataType; import org.springframework.data.redis.core.*; import org.springframework.stereotype.Component;import javax.annotation.Resource; import java.sql.Date; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit;Component public class RedisUtil {Resourceprivate RedisTemplateString, Object redisTemplate;public void setRedisTemplate(RedisTemplateString, Object redisTemplate) {this.redisTemplate redisTemplate;}public RedisTemplateString, Object getRedisTemplate() {return this.redisTemplate;}/** -------------------key相关操作--------------------- *//*** 删除key** param key*/public void delete(String key) {redisTemplate.delete(key);}/*** 批量删除key** param keys*/public void delete(CollectionString keys) {redisTemplate.delete(keys);}/*** 序列化key** param key* return*/public byte[] dump(String key) {return redisTemplate.dump(key);}/*** 是否存在key** param key* return*/public Boolean hasKey(String key) {return redisTemplate.hasKey(key);}/*** 设置过期时间** param key* param timeout* param unit* return*/public Boolean expire(String key, long timeout, TimeUnit unit) {return redisTemplate.expire(key, timeout, unit);}/*** 设置过期时间** param key* param date* return*/public Boolean expireAt(String key, Date date) {return redisTemplate.expireAt(key, date);}/*** 查找匹配的key** param pattern* return*/public SetString keys(String pattern) {return redisTemplate.keys(pattern);}/*** 将当前数据库的 key 移动到给定的数据库 db 当中** param key* param dbIndex* return*/public Boolean move(String key, int dbIndex) {return redisTemplate.move(key, dbIndex);}/*** 移除 key 的过期时间key 将持久保持** param key* return*/public Boolean persist(String key) {return redisTemplate.persist(key);}/*** 返回 key 的剩余的过期时间** param key* param unit* return*/public Long getExpire(String key, TimeUnit unit) {return redisTemplate.getExpire(key, unit);}/*** 返回 key 的剩余的过期时间** param key* return*/public Long getExpire(String key) {return redisTemplate.getExpire(key);}/*** 从当前数据库中随机返回一个 key** return*/public String randomKey() {return (String) redisTemplate.randomKey();}/*** 修改 key 的名称** param oldKey* param newKey*/public void rename(String oldKey, String newKey) {redisTemplate.rename(oldKey, newKey);}/*** 仅当 newkey 不存在时将 oldKey 改名为 newkey** param oldKey* param newKey* return*/public Boolean renameIfAbsent(String oldKey, String newKey) {return redisTemplate.renameIfAbsent(oldKey, newKey);}/*** 返回 key 所储存的值的类型** param key* return*/public DataType type(String key) {return redisTemplate.type(key);}/** -------------------string相关操作--------------------- *//*** 设置指定 key 的值** param key* param value*/public void set(String key, String value) {redisTemplate.opsForValue().set(key, value);}/*** 获取指定 key 的值** param key* return*/public String get(String key) {return (String) redisTemplate.opsForValue().get(key);}/*** 返回 key 中字符串值的子字符** param key* param start* param end* return*/public String getRange(String key, long start, long end) {return redisTemplate.opsForValue().get(key, start, end);}/*** 将给定 key 的值设为 value 并返回 key 的旧值(old value)** param key* param value* return*/public String getAndSet(String key, String value) {return (String) redisTemplate.opsForValue().getAndSet(key, value);}/*** 对 key 所储存的字符串值获取指定偏移量上的位(bit)** param key* param offset* return*/public Boolean getBit(String key, long offset) {return redisTemplate.opsForValue().getBit(key, offset);}/*** 批量获取** param keys* return*/public ListObject multiGet(CollectionString keys) {return redisTemplate.opsForValue().multiGet(keys);}/*** 设置ASCII码, 字符串a的ASCII码是97, 转为二进制是01100001, 此方法是将二进制第offset位值变为value** param key 位置* param value 值,true为1, false为0* return*/public boolean setBit(String key, long offset, boolean value) {return redisTemplate.opsForValue().setBit(key, offset, value);}/*** 将值 value 关联到 key 并将 key 的过期时间设为 timeout** param key* param value* param timeout 过期时间* param unit 时间单位, 天:TimeUnit.DAYS 小时:TimeUnit.HOURS 分钟:TimeUnit.MINUTES* 秒:TimeUnit.SECONDS 毫秒:TimeUnit.MILLISECONDS*/public void setEx(String key, String value, long timeout, TimeUnit unit) {redisTemplate.opsForValue().set(key, value, timeout, unit);}/*** 只有在 key 不存在时设置 key 的值** param key* param value* return 之前已经存在返回false, 不存在返回true*/public boolean setIfAbsent(String key, String value) {return redisTemplate.opsForValue().setIfAbsent(key, value);}/*** 用 value 参数覆写给定 key 所储存的字符串值从偏移量 offset 开始** param key* param value* param offset 从指定位置开始覆写*/public void setRange(String key, String value, long offset) {redisTemplate.opsForValue().set(key, value, offset);}/*** 获取字符串的长度** param key* return*/public Long size(String key) {return redisTemplate.opsForValue().size(key);}/*** 批量添加** param maps*/public void multiSet(MapString, String maps) {redisTemplate.opsForValue().multiSet(maps);}/*** 同时设置一个或多个 key-value 对当且仅当所有给定 key 都不存在** param maps* return 之前已经存在返回false, 不存在返回true*/public boolean multiSetIfAbsent(MapString, String maps) {return redisTemplate.opsForValue().multiSetIfAbsent(maps);}/*** 增加(自增长), 负数则为自减** param key* return*/public Long incrBy(String key, long increment) {return redisTemplate.opsForValue().increment(key, increment);}/*** param key* return*/public Double incrByFloat(String key, double increment) {return redisTemplate.opsForValue().increment(key, increment);}/*** 追加到末尾** param key* param value* return*/public Integer append(String key, String value) {return redisTemplate.opsForValue().append(key, value);}/** -------------------hash相关操作------------------------- *//*** 获取存储在哈希表中指定字段的值** param key* param field* return*/public Object hGet(String key, String field) {return redisTemplate.opsForHash().get(key, field);}/*** 获取所有给定字段的值** param key* return*/public MapObject, Object hGetAll(String key) {return redisTemplate.opsForHash().entries(key);}/*** 获取所有给定字段的值** param key* param fields* return*/public ListObject hMultiGet(String key, CollectionObject fields) {return redisTemplate.opsForHash().multiGet(key, fields);}public void hPut(String key, String hashKey, String value) {redisTemplate.opsForHash().put(key, hashKey, value);}public void hPutAll(String key, MapString, String maps) {redisTemplate.opsForHash().putAll(key, maps);}/*** 仅当hashKey不存在时才设置** param key* param hashKey* param value* return*/public Boolean hPutIfAbsent(String key, String hashKey, String value) {return redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);}/*** 删除一个或多个哈希表字段** param key* param fields* return*/public Long hDelete(String key, Object... fields) {return redisTemplate.opsForHash().delete(key, fields);}/*** 查看哈希表 key 中指定的字段是否存在** param key* param field* return*/public boolean hExists(String key, String field) {return redisTemplate.opsForHash().hasKey(key, field);}/*** 为哈希表 key 中的指定字段的整数值加上增量 increment** param key* param field* param increment* return*/public Long hIncrBy(String key, Object field, long increment) {return redisTemplate.opsForHash().increment(key, field, increment);}/*** 为哈希表 key 中的指定字段的整数值加上增量 increment** param key* param field* param delta* return*/public Double hIncrByFloat(String key, Object field, double delta) {return redisTemplate.opsForHash().increment(key, field, delta);}/*** 获取所有哈希表中的字段** param key* return*/public SetObject hKeys(String key) {return redisTemplate.opsForHash().keys(key);}/*** 获取哈希表中字段的数量** param key* return*/public Long hSize(String key) {return redisTemplate.opsForHash().size(key);}/*** 获取哈希表中所有值** param key* return*/public ListObject hValues(String key) {return redisTemplate.opsForHash().values(key);}/*** 迭代哈希表中的键值对** param key* param options* return*/public CursorMap.EntryObject, Object hScan(String key, ScanOptions options) {return redisTemplate.opsForHash().scan(key, options);}/** ------------------------list相关操作---------------------------- *//*** 通过索引获取列表中的元素** param key* param index* return*/public String lIndex(String key, long index) {return (String) redisTemplate.opsForList().index(key, index);}/*** 获取列表指定范围内的元素** param key* param start 开始位置, 0是开始位置* param end 结束位置, -1返回所有* return*/public ListObject lRange(String key, long start, long end) {return redisTemplate.opsForList().range(key, start, end);}/*** 存储在list头部** param key* param value* return*/public Long lLeftPush(String key, String value) {return redisTemplate.opsForList().leftPush(key, value);}/*** param key* param value* return*/public Long lLeftPushAll(String key, String... value) {return redisTemplate.opsForList().leftPushAll(key, value);}/*** param key* param value* return*/public Long lLeftPushAll(String key, CollectionString value) {return redisTemplate.opsForList().leftPushAll(key, value);}/*** 当list存在的时候才加入** param key* param value* return*/public Long lLeftPushIfPresent(String key, String value) {return redisTemplate.opsForList().leftPushIfPresent(key, value);}/*** 如果pivot存在,再pivot前面添加** param key* param pivot* param value* return*/public Long lLeftPush(String key, String pivot, String value) {return redisTemplate.opsForList().leftPush(key, pivot, value);}/*** param key* param value* return*/public Long lRightPush(String key, String value) {return redisTemplate.opsForList().rightPush(key, value);}/*** param key* param value* return*/public Long lRightPushAll(String key, String... value) {return redisTemplate.opsForList().rightPushAll(key, value);}/*** param key* param value* return*/public Long lRightPushAll(String key, CollectionString value) {return redisTemplate.opsForList().rightPushAll(key, value);}/*** 为已存在的列表添加值** param key* param value* return*/public Long lRightPushIfPresent(String key, String value) {return redisTemplate.opsForList().rightPushIfPresent(key, value);}/*** 在pivot元素的右边添加值** param key* param pivot* param value* return*/public Long lRightPush(String key, String pivot, String value) {return redisTemplate.opsForList().rightPush(key, pivot, value);}/*** 通过索引设置列表元素的值** param key* param index 位置* param value*/public void lSet(String key, long index, String value) {redisTemplate.opsForList().set(key, index, value);}/*** 移出并获取列表的第一个元素** param key* return 删除的元素*/public String lLeftPop(String key) {return (String) redisTemplate.opsForList().leftPop(key);}/*** 移出并获取列表的第一个元素 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止** param key* param timeout 等待时间* param unit 时间单位* return*/public String lBLeftPop(String key, long timeout, TimeUnit unit) {return (String) redisTemplate.opsForList().leftPop(key, timeout, unit);}/*** 移除并获取列表最后一个元素** param key* return 删除的元素*/public String lRightPop(String key) {return (String) redisTemplate.opsForList().rightPop(key);}/*** 移出并获取列表的最后一个元素 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止** param key* param timeout 等待时间* param unit 时间单位* return*/public String lBRightPop(String key, long timeout, TimeUnit unit) {return (String) redisTemplate.opsForList().rightPop(key, timeout, unit);}/*** 移除列表的最后一个元素并将该元素添加到另一个列表并返回** param sourceKey* param destinationKey* return*/public String lRightPopAndLeftPush(String sourceKey, String destinationKey) {return (String) redisTemplate.opsForList().rightPopAndLeftPush(sourceKey,destinationKey);}/*** 从列表中弹出一个值将弹出的元素插入到另外一个列表中并返回它 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止** param sourceKey* param destinationKey* param timeout* param unit* return*/public String lBRightPopAndLeftPush(String sourceKey, String destinationKey,long timeout, TimeUnit unit) {return (String) redisTemplate.opsForList().rightPopAndLeftPush(sourceKey,destinationKey, timeout, unit);}/*** 删除集合中值等于value得元素** param key* param index index0, 删除所有值等于value的元素; index0, 从头部开始删除第一个值等于value的元素;* index0, 从尾部开始删除第一个值等于value的元素;* param value* return*/public Long lRemove(String key, long index, String value) {return redisTemplate.opsForList().remove(key, index, value);}/*** 裁剪list** param key* param start* param end*/public void lTrim(String key, long start, long end) {redisTemplate.opsForList().trim(key, start, end);}/*** 获取列表长度** param key* return*/public Long lLen(String key) {return redisTemplate.opsForList().size(key);}/** --------------------set相关操作-------------------------- *//*** set添加元素** param key* param values* return*/public Long sAdd(String key, String... values) {return redisTemplate.opsForSet().add(key, values);}/*** set移除元素** param key* param values* return*/public Long sRemove(String key, Object... values) {return redisTemplate.opsForSet().remove(key, values);}/*** 移除并返回集合的一个随机元素** param key* return*/public String sPop(String key) {return (String) redisTemplate.opsForSet().pop(key);}/*** 将元素value从一个集合移到另一个集合** param key* param value* param destKey* return*/public Boolean sMove(String key, String value, String destKey) {return redisTemplate.opsForSet().move(key, value, destKey);}/*** 获取集合的大小** param key* return*/public Long sSize(String key) {return redisTemplate.opsForSet().size(key);}/*** 判断集合是否包含value** param key* param value* return*/public Boolean sIsMember(String key, Object value) {return redisTemplate.opsForSet().isMember(key, value);}/*** 获取两个集合的交集** param key* param otherKey* return*/public SetObject sIntersect(String key, String otherKey) {return redisTemplate.opsForSet().intersect(key, otherKey);}/*** 获取key集合与多个集合的交集** param key* param otherKeys* return*/public SetObject sIntersect(String key, CollectionString otherKeys) {return redisTemplate.opsForSet().intersect(key, otherKeys);}/*** key集合与otherKey集合的交集存储到destKey集合中** param key* param otherKey* param destKey* return*/public Long sIntersectAndStore(String key, String otherKey, String destKey) {return redisTemplate.opsForSet().intersectAndStore(key, otherKey,destKey);}/*** key集合与多个集合的交集存储到destKey集合中** param key* param otherKeys* param destKey* return*/public Long sIntersectAndStore(String key, CollectionString otherKeys,String destKey) {return redisTemplate.opsForSet().intersectAndStore(key, otherKeys,destKey);}/*** 获取两个集合的并集** param key* param otherKeys* return*/public SetObject sUnion(String key, String otherKeys) {return redisTemplate.opsForSet().union(key, otherKeys);}/*** 获取key集合与多个集合的并集** param key* param otherKeys* return*/public SetObject sUnion(String key, CollectionString otherKeys) {return redisTemplate.opsForSet().union(key, otherKeys);}/*** key集合与otherKey集合的并集存储到destKey中** param key* param otherKey* param destKey* return*/public Long sUnionAndStore(String key, String otherKey, String destKey) {return redisTemplate.opsForSet().unionAndStore(key, otherKey, destKey);}/*** key集合与多个集合的并集存储到destKey中** param key* param otherKeys* param destKey* return*/public Long sUnionAndStore(String key, CollectionString otherKeys,String destKey) {return redisTemplate.opsForSet().unionAndStore(key, otherKeys, destKey);}/*** 获取两个集合的差集** param key* param otherKey* return*/public SetObject sDifference(String key, String otherKey) {return redisTemplate.opsForSet().difference(key, otherKey);}/*** 获取key集合与多个集合的差集** param key* param otherKeys* return*/public SetObject sDifference(String key, CollectionString otherKeys) {return redisTemplate.opsForSet().difference(key, otherKeys);}/*** key集合与otherKey集合的差集存储到destKey中** param key* param otherKey* param destKey* return*/public Long sDifference(String key, String otherKey, String destKey) {return redisTemplate.opsForSet().differenceAndStore(key, otherKey,destKey);}/*** key集合与多个集合的差集存储到destKey中** param key* param otherKeys* param destKey* return*/public Long sDifference(String key, CollectionString otherKeys,String destKey) {return redisTemplate.opsForSet().differenceAndStore(key, otherKeys,destKey);}/*** 获取集合所有元素** param key* return*/public SetObject setMembers(String key) {return redisTemplate.opsForSet().members(key);}/*** 随机获取集合中的一个元素** param key* return*/public String sRandomMember(String key) {return (String) redisTemplate.opsForSet().randomMember(key);}/*** 随机获取集合中count个元素** param key* param count* return*/public ListObject sRandomMembers(String key, long count) {return redisTemplate.opsForSet().randomMembers(key, count);}/*** 随机获取集合中count个元素并且去除重复的** param key* param count* return*/public SetObject sDistinctRandomMembers(String key, long count) {return redisTemplate.opsForSet().distinctRandomMembers(key, count);}/*** param key* param options* return*/public CursorObject sScan(String key, ScanOptions options) {return redisTemplate.opsForSet().scan(key, options);}/**------------------zSet相关操作--------------------------------*//*** 添加元素,有序集合是按照元素的score值由小到大排列** param key* param value* param score* return*/public Boolean zAdd(String key, String value, double score) {return redisTemplate.opsForZSet().add(key, value, score);}/*** param key* param values* return*/public Long zAdd(String key, SetZSetOperations.TypedTupleObject values) {return redisTemplate.opsForZSet().add(key, values);}/*** param key* param values* return*/public Long zRemove(String key, Object... values) {return redisTemplate.opsForZSet().remove(key, values);}/*** 增加元素的score值并返回增加后的值** param key* param value* param delta* return*/public Double zIncrementScore(String key, String value, double delta) {return redisTemplate.opsForZSet().incrementScore(key, value, delta);}/*** 返回元素在集合的排名,有序集合是按照元素的score值由小到大排列** param key* param value* return 0表示第一位*/public Long zRank(String key, Object value) {return redisTemplate.opsForZSet().rank(key, value);}/*** 返回元素在集合的排名,按元素的score值由大到小排列** param key* param value* return*/public Long zReverseRank(String key, Object value) {return redisTemplate.opsForZSet().reverseRank(key, value);}/*** 获取集合的元素, 从小到大排序** param key* param start 开始位置* param end 结束位置, -1查询所有* return*/public SetObject zRange(String key, long start, long end) {return redisTemplate.opsForZSet().range(key, start, end);}/*** 获取集合元素, 并且把score值也获取** param key* param start* param end* return*/public SetZSetOperations.TypedTupleObject zRangeWithScores(String key, long start,long end) {return redisTemplate.opsForZSet().rangeWithScores(key, start, end);}/*** 根据Score值查询集合元素** param key* param min 最小值* param max 最大值* return*/public SetObject zRangeByScore(String key, double min, double max) {return redisTemplate.opsForZSet().rangeByScore(key, min, max);}/*** 根据Score值查询集合元素, 从小到大排序** param key* param min 最小值* param max 最大值* return*/public SetZSetOperations.TypedTupleObject zRangeByScoreWithScores(String key,double min, double max) {return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max);}/*** param key* param min* param max* param start* param end* return*/public SetZSetOperations.TypedTupleObject zRangeByScoreWithScores(String key,double min, double max, long start, long end) {return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max,start, end);}/*** 获取集合的元素, 从大到小排序** param key* param start* param end* return*/public SetObject zReverseRange(String key, long start, long end) {return redisTemplate.opsForZSet().reverseRange(key, start, end);}/*** 获取集合的元素, 从大到小排序, 并返回score值** param key* param start* param end* return*/public SetZSetOperations.TypedTupleObject zReverseRangeWithScores(String key,long start, long end) {return redisTemplate.opsForZSet().reverseRangeWithScores(key, start,end);}/*** 根据Score值查询集合元素, 从大到小排序** param key* param min* param max* return*/public SetObject zReverseRangeByScore(String key, double min,double max) {return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max);}/*** 根据Score值查询集合元素, 从大到小排序** param key* param min* param max* return*/public SetZSetOperations.TypedTupleObject zReverseRangeByScoreWithScores(String key, double min, double max) {return redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key,min, max);}/*** param key* param min* param max* param start* param end* return*/public SetObject zReverseRangeByScore(String key, double min,double max, long start, long end) {return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max,start, end);}/*** 根据score值获取集合元素数量** param key* param min* param max* return*/public Long zCount(String key, double min, double max) {return redisTemplate.opsForZSet().count(key, min, max);}/*** 获取集合大小** param key* return*/public Long zSize(String key) {return redisTemplate.opsForZSet().size(key);}/*** 获取集合大小** param key* return*/public Long zZCard(String key) {return redisTemplate.opsForZSet().zCard(key);}/*** 获取集合中value元素的score值** param key* param value* return*/public Double zScore(String key, Object value) {return redisTemplate.opsForZSet().score(key, value);}/*** 移除指定索引位置的成员** param key* param start* param end* return*/public Long zRemoveRange(String key, long start, long end) {return redisTemplate.opsForZSet().removeRange(key, start, end);}/*** 根据指定的score值的范围来移除成员** param key* param min* param max* return*/public Long zRemoveRangeByScore(String key, double min, double max) {return redisTemplate.opsForZSet().removeRangeByScore(key, min, max);}/*** 获取key和otherKey的并集并存储在destKey中** param key* param otherKey* param destKey* return*/public Long zUnionAndStore(String key, String otherKey, String destKey) {return redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey);}/*** param key* param otherKeys* param destKey* return*/public Long zUnionAndStore(String key, CollectionString otherKeys,String destKey) {return redisTemplate.opsForZSet().unionAndStore(key, otherKeys, destKey);}/*** 交集** param key* param otherKey* param destKey* return*/public Long zIntersectAndStore(String key, String otherKey,String destKey) {return redisTemplate.opsForZSet().intersectAndStore(key, otherKey,destKey);}/*** 交集** param key* param otherKeys* param destKey* return*/public Long zIntersectAndStore(String key, CollectionString otherKeys,String destKey) {return redisTemplate.opsForZSet().intersectAndStore(key, otherKeys,destKey);}/*** param key* param options* return*/public CursorZSetOperations.TypedTupleObject zScan(String key, ScanOptions options) {return redisTemplate.opsForZSet().scan(key, options);}}五、rabbitMQ 以实现路由模式为例。 依赖 !-- rabbitMQ--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependency!-- json工具--dependencygroupIdorg.json/groupIdartifactIdjson/artifactIdversion20211205/version/dependencydependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion2.9.0/version/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.12.1/version/dependencyyml配置 spring:application:name: Spring-boot-rabbitmqrabbitmq:host: rabbitmq的ip地址port: 5673username: guestpassword: guestlistener:simple:# 表示消费者消费成功消息以后需要手工的进行签收ack确认默认为 autoacknowledge-mode: manual# 发送者开启 return 确认机制publisher-returns: true# 发送者开启 confirm 确认机制publisher-confirm-type: correlate配置类 package tracy.manage.config;import org.springframework.amqp.core.*; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.connection.CorrelationData; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class RabbitMQConfig {public static final String EXCHANGE_NAME direct-exchange;public static final String TEXT_QUEUE text-queue;public static final String CLAIM_QUEUE claim-queue;public static final String TEXT_RKEY text;public static final String CLAIM_RKEY claim;Value(${spring.rabbitmq.host})private String host;Value(${spring.rabbitmq.port})private int port;Value(${spring.rabbitmq.username})private String username;Value(${spring.rabbitmq.password})private String password;/*** 1.声明交换机*/Beanpublic DirectExchange directExchange() {/*** 参数说明:* 1. 交换机名称* 2. 是否持久化 true持久化交换机一直保留 false不持久化用完就删除* 3. 是否自动删除 false不自动删除 true自动删除*/return new DirectExchange(EXCHANGE_NAME, true, false);}/*** 2.声明队列*/Beanpublic Queue textQueue() {/*** Queue构造函数参数说明* 1. 队列名* 2. 是否持久化 true持久化 false不持久化*/return new Queue(TEXT_QUEUE, true);}Beanpublic Queue claimQueue() {/*** Queue构造函数参数说明* 1. 队列名* 2. 是否持久化 true持久化 false不持久化*/return new Queue(CLAIM_QUEUE, true);}/*** 3.队列与交换机绑定*/Beanpublic Binding textBinding() {return BindingBuilder.bind(textQueue()).to(directExchange()).with(TEXT_RKEY);}Beanpublic Binding claimBinding() {return BindingBuilder.bind(claimQueue()).to(directExchange()).with(CLAIM_RKEY);}/*** 4.声明连接工厂*/Beanpublic ConnectionFactory connectionFactory() {CachingConnectionFactory connectionFactory new CachingConnectionFactory(host,port);connectionFactory.setUsername(username);connectionFactory.setPassword(password);return connectionFactory;}/*** 5.将自定义的RabbitTemplate对象注入bean容器*/Beanpublic RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory) {RabbitTemplate rabbitTemplate new RabbitTemplate();rabbitTemplate.setConnectionFactory(connectionFactory);//设置开启消息推送结果回调rabbitTemplate.setMandatory(true);//设置ConfirmCallback回调rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {//这部分没写先空在这里}});//设置ReturnCallback回调rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {//这部分没写先空在这里}});return rabbitTemplate;}}生产者代码 package tracy.manage.mq;import org.json.JSONObject; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap;Service public class Producer {public static final String EXCHANGE_NAME direct-exchange;public static final String TEXT_RKEY text;public static final String CLAIM_RKEY claim;Autowiredprivate RabbitTemplate rabbitTemplate;public void send() {HashMapString,String map1new HashMap();HashMapString,String map2new HashMap();map1.put(message,text test);map2.put(message,claim test);String message1new JSONObject(map1).toString();String message2new JSONObject(map2).toString();rabbitTemplate.convertAndSend(EXCHANGE_NAME,TEXT_RKEY ,message1);rabbitTemplate.convertAndSend(EXCHANGE_NAME,CLAIM_RKEY,message2);} }消费者代码 我设置了两个消费者 package tracy.manage.mq;import com.rabbitmq.client.Channel; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Service;import java.io.IOException;Service RabbitListener(queues {text-queue}) //监听队列 public class TextConsumer {RabbitHandlerpublic void receive(String msg, Channel channel, Message message) throws IOException {try {System.out.println(text consumer接收到消息 msg);//消费确认channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {if (message.getMessageProperties().getRedelivered()) {//basicReject: 拒绝消息与basicNack区别在于不能进行批量操作其他用法很相似 false表示消息不再重新进入队列channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); // 拒绝消息} else {// basicNack:表示失败确认一般在消费消息业务异常时用到此方法可以将消息重新投递入队列channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);}}}} package tracy.manage.mq;import com.rabbitmq.client.Channel; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Service;import java.io.IOException;Service RabbitListener(queues {claim-queue}) //监听队列 public class ClaimConsumer {RabbitHandlerpublic void receive(String msg, Channel channel, Message message) throws IOException {try {System.out.println(claim consumer接收到消息 msg);//消费确认channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {if (message.getMessageProperties().getRedelivered()) {//basicReject: 拒绝消息与basicNack区别在于不能进行批量操作其他用法很相似 false表示消息不再重新进入队列channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); // 拒绝消息} else {// basicNack:表示失败确认一般在消费消息业务异常时用到此方法可以将消息重新投递入队列channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);}}}} 测试一下 在测试类中运行以下方法 Testvoid testProducer() {producer.send();}成功
http://www.hkea.cn/news/14286758/

相关文章:

  • 电商网站制作成手机app建筑工程网点代表什么
  • 泰安高品质网站建设dw代码大全基础
  • 网站建设能挣钱个人建什么网站最赚钱吗
  • 服务器 多个网站工业品牌设计公司
  • 建设网站怎样提要求wordpress页面的模板
  • 雨花区区网站建设公司做网站彩票网站
  • 摄影工作室网站设计百度检索入口
  • 开一家做网站公司成本电商图片助手
  • 中国空间站是干什么的百度导航
  • 广州技术支持:网站建设哪些建材网站可以做宣传
  • 太仓做网站邯郸本地网站
  • 伊春信息网手机优化大师官网
  • 简述网站推广方式android开发环境搭建
  • 做网站链接怎么弄什么网站做新产品代理
  • 网站开发工作室策划案时尚网站模板代码
  • 河北网站备案系统网页设计毕业设计理念
  • 广州网站制作方法网页设计是啥意思
  • 酒店类的电影网站模板免费下载怎么查网站流量
  • 昆明网站建设方案报价做ps的网站有哪些功能吗
  • 网站怎么做伪静态页面网站制作的总结与体会
  • 网站运营方案设计顺德营销型网站建设
  • 河北网站开发WordPress四栏主题
  • 企业形象网站建设网络工程师招聘
  • 伯爵手表网站网站建设的地方
  • 杭州做网站费用洛阳软件开发公司有哪些
  • 江苏省建设工程备案网站湖北seo优化诊断
  • wdcp 网站备份网站备案现状
  • 网站优化建设宁夏合肥网站建设-中国互联
  • 网站开发毕业答辩ppt项目建设综述
  • 国外的网页制作网站实物黄金哪个网站做的好