# eagle-simples **Repository Path**: huangdf/eagle-simples ## Basic Information - **Project Name**: eagle-simples - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2017-07-02 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## eagle-dubbbo provider的例子 ##### 例子包含功能 1.采用dubbo 自带 com.alibaba.dubbo.container.Main 启动类(可以实现优雅关机),maven 打包后直接可以jar -jar 运行dubbo服务,生产推荐使用。 ``` java -jar eagle-dubbo-demo-provider.jar ``` ``` org.apache.maven.plugins maven-jar-plugin 2.4 target/classes/ com.alibaba.dubbo.container.Main false true lib/ . ``` 开发的时候测试用例继承DubboJunitTest 可以发布dubbo服务。 2.整合内嵌jetty ,利用spring mvc 发布restful 服务(dubbox resteasy 很难用,性能也没有springmvc 好 )。***测试***阶段可以使用如下命令启动dubbo rest服务。 ``` java -jar eagle-dubbo-demo-provider.jar jetty1 ``` jetty1 为eagel-dubbo 中遵循dubbo SPI机制扩展的Container. 开发环境测试类继承DubboHttpTest即可发布dubbo,rest 服务 内嵌的jetty 不建议用于生产环境,如果需要生产环境,可以将eagle-dubbo-demo-provider.jar放入servlet 容器中,以tomcat 为例 放入webapp/ROOT/WEB-INF/lib 中,同时WEB-INF/web.xml 配置如 ``` contextConfigLocation classpath*:spring-context*.xml org.springframework.web.context.ContextLoaderListener org.springframework.web.context.request.RequestContextListener WebFilter com.seezoon.eagle.dubbo.filter.WebFilter WebFilter /* encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true encodingFilter /* springServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath*:spring-mvc*.xml 1 springServlet / ``` 启动tomcat 就可以发布dubbo,rest。多个工程jar 放入都可以。 以下开源工具推荐使用 dubbo-admin dubbo-monitor zk 的监控推荐taokeeper rest 服务推荐用kong 做网关。 ## eagle-mybatis 的例子 ``` 具体使用见src/test/java ``` 主要使用eagel-mybatis 提供的CrudService,分页工具类采用开源PageHelper ``` /** * 当需要自动拥有增删改查功能时候继承 * @author hdf * */ @Transactional(rollbackFor=Exception.class) public abstract class CrudService,T extends BaseEntity>{ /** * 日志对象 */ protected Logger logger = LoggerFactory.getLogger(getClass()); @Autowired protected D dao; public int insert(T t){ return dao.insert(t); } public int insertSelective(T t){ return dao.insert(t); } public int updateByPrimaryKeySelective(T t){ return dao.updateByPrimaryKeySelective(t); } public int updateByPrimaryKey(T t){ return dao.updateByPrimaryKey(t); } @Transactional(readOnly=true) public T selectByPrimaryKey(Serializable id){ return dao.selectByPrimaryKey(id); } public int deleteByPrimaryKey(Serializable id){ return dao.deleteByPrimaryKey(id); } @Transactional(readOnly=true) public List findList(T t){ return dao.findList(t); } @Transactional(readOnly=true) public PageInfo findByPage(T t,int pageNum,int pageSize,boolean count){ PageHelper.startPage(pageNum, pageSize, count); List list = this.findList(t); PageInfo pageInfo = new PageInfo(list); return pageInfo; } @Transactional(readOnly=true) public PageInfo findByPage(T t,int pageNum,int pageSize){ PageHelper.startPage(pageNum, pageSize, Boolean.TRUE); List list = this.findList(t); PageInfo pageInfo = new PageInfo(list); return pageInfo; } } ``` ## eagle-mongo 的例子 ``` 具体使用见src/test/java ``` 例子使用eagle-mongo 封装的DAO,采用spring-data-mongo 中提供的MongoTemplate,分页工具类采用开源PageHelper ``` public abstract class MongoBaseDao { protected Logger logger = LoggerFactory.getLogger(getClass()); @Autowired protected MongoTemplate mongoTemplate; /** * 保存或更新一个对象, * @param t * @return */ public void saveOrUpdate(T t) { this.mongoTemplate.save(t); } /** * 保存一个对象 * @param t */ public void insert(T t){ this.mongoTemplate.insert(t); } /** * 根据Id从Collection中查询对象 * @return */ public T queryById(String id) { Query query = new Query(); Criteria criteria = Criteria.where("_id").is(id); query.addCriteria(criteria); return this.mongoTemplate.findOne(query, this.getEntityClass()); } /** * 根据条件查询集合 * @param query 查询条件 * @return 满足条件的集合 */ public List queryList(Query query) { return this.mongoTemplate.find(query, this.getEntityClass()); } /** * 通过条件查询单个实体,有一个结果的话取第一个 * @param query * @return */ public T queryOne(Query query) { return this.mongoTemplate.findOne(query, this.getEntityClass()); } /** * 根据条件查询库中符合记录的总数,为分页查询服务 * @param query 查询条件 * @return 满足条件的记录总数 */ public Long getPageCount(Query query) { return this.mongoTemplate.count(query, this.getEntityClass()); } /** * 通过条件进行分页查询 * @param query 查询条件 * @param pageNum 查询起始值 , * @param pageSize 查询大小 ,类似mysql查询中的 limit start, size 中的 size * @return 满足条件的集合 */ public PageInfo getPage(Query query, int pageNum,int pageSize){ Page page = new Page(pageNum, pageSize); query.skip(page.getStartRow()); query.limit(page.getPageSize()); List lists = this.mongoTemplate.find(query, this.getEntityClass()); PageInfo pageInfo = new PageInfo(lists); pageInfo.setTotal(this.getPageCount(query)); return pageInfo; } /** * 根据Id删除用户 * @param id */ public void deleteById(String id) { Criteria criteria = Criteria.where("_id").in(id); if(null!=criteria){ Query query = new Query(criteria); if(null!=query && this.queryOne(query)!=null){ this.mongoTemplate.remove(query, this.getEntityClass()); } } } /** * 根据条件删除 * @param query */ public void delete(Query query){ this.mongoTemplate.remove(query, this.getEntityClass()); } /** * 删除对象 * @param t */ public void delete(T t){ this.mongoTemplate.remove(t); } /** * 更新满足条件的第一个记录 * @param query * @param update */ public void updateFirst(Query query,Update update){ this.mongoTemplate.updateFirst(query, update, this.getEntityClass()); } /** * 更新满足条件的所有记录 * @param query * @param update */ public void updateMulti(Query query, Update update){ this.mongoTemplate.updateMulti(query, update, this.getEntityClass()); } /** * 查找更新,如果没有找到符合的记录,则将更新的记录插入库中 * @param query * @param update */ public void updateInser(Query query, Update update){ this.mongoTemplate.upsert(query, update, this.getEntityClass()); } /** * 钩子方法,由子类实现返回反射对象的类型 * @return */ protected Class getEntityClass(){ return GenericsUtils.getSuperClassGenricType(this.getClass()); }; ``` ## eagle-redis 的例子 ``` 具体使用见src/test/java ``` #例子包含 1.连接redis-cluster,为了测试方便建议采用[docker redis cluster](https://hub.docker.com/r/tommy351/redis-cluster/),其他的也可以,如果docker不会请加群 ***514685454*** 自己搭建见楼主csdn [redis-cluster搭建](http://blog.csdn.net/hdf734839030/article/details/52155815) 使用spring-data RedisTemplate ``` ``` 2.redis set list hash基础数据结构操作 ``` @Test public void redisTemplateStr(){ redisTemplateStr.opsForValue().set("123", "1223"); String value = redisTemplateStr.opsForValue().get("123"); logger.debug(JSON.toJSONString(value)); } @Test public void redisTemplateStu(){ redisTemplateStu.opsForValue().set("s1", new Student("a", 12, new Date()), 10, TimeUnit.MINUTES); Student student = redisTemplateStu.opsForValue().get("s1"); logger.debug(JSON.toJSONString(student)); } @Test public void valueOps(){ valueOps.set("123", "1223"); String value = valueOps.get("123"); logger.debug(JSON.toJSONString(value)); } @Test public void listOps(){ listOps.leftPush("list1", new Student("a", 12, new Date())); List list = listOps.range("list1",0, 1); logger.debug(JSON.toJSONString(list)); Student leftPop = listOps.leftPop("list1"); logger.debug(JSON.toJSONString(leftPop)); listOps.leftPush("list1", new Student("a", 13, new Date())); try { System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void setOps(){ setOps.add("set1", new Student("a", 12, new Date())); setOps.add("set2", new Student("a", 12, new Date())); logger.debug(JSON.toJSONString(setOps.members("set1"))); logger.debug(JSON.toJSONString(setOps.pop("set1"))); } @Test public void hashOps(){ hashOps.put("hash1", "hash1", new Student("a", 12, new Date())); Student student = hashOps.get("hash1","hash1"); logger.debug(JSON.toJSONString(student)); } ``` 3.redis 作为队列使用,其实利用的是list结构 ``` @Test public void listOps(){ listOps.leftPush("list1", new Student("a", 12, new Date())); List list = listOps.range("list1",0, 1); logger.debug(JSON.toJSONString(list)); Student leftPop = listOps.leftPop("list1"); logger.debug(JSON.toJSONString(leftPop)); listOps.leftPush("list1", new Student("a", 13, new Date())); try { System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ``` ``` @Component public class DemoQueue extends AbstractRedisQueue{ @Resource(name="redisTemplate") private ListOperations ListOps; @Override public void handleMessage(Student value) { logger.debug(JSON.toJSONString(value)); } @Override public String getKeyName() { return "list1"; } @Override public long getTimeout() { return 1000; } @Override public ListOperations getListOperations() { return ListOps; } } ``` 4.redis 发布订阅例子 ``` /** * 发布消息 */ @Test public void publisMsg(){ redisTemplateStu.convertAndSend("chatroom", new Student("a", 12, new Date())); try { System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ``` ``` ``` ``` /** * 演示订阅者 * @author hdf * */ public class DemoSubscriber implements RedisSubscriber{ @Override public void handleMessage(Student value) { System.out.println(JSON.toJSONString(value)); } } ``` ## eagle-rocketmq 的例子 ``` 具体使用见src/test/java ``` 几种消息发布 ``` /** * 同步发确保直接返回回执 * @throws */ @Test public void send() { Message msg = new Message("TopicTest", "hello rocketmq".getBytes()) ; msg.putUserProperty("threadId", NDCUtils.push()); try { SendResult send = defaultMQProducer.send(msg); logger.debug("DefaultMQProducer send:{}",JSON.toJSONString(send)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 不关心发送结果 */ @Test public void sendOneway(){ Message msg = new Message("TopicTest", "hello rocketmq".getBytes()) ; try { defaultMQProducer.sendOneway(msg); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 关心发送结果 */ @Test public void sendCallback(){ Message msg = new Message("TopicTest", "hello rocketmq".getBytes()) ; try { defaultMQProducer.send(msg,new SendCallback() { @Override public void onSuccess(SendResult sendResult) { logger.debug("sendCallback onSuccess :{}",JSON.toJSONString(sendResult)); } @Override public void onException(Throwable e) { logger.error(e.getMessage()); } }); System.in.read(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 有序消息 接收需要用MessageListenerOrderly 保证发入一个queue 就可以 利用MessageQueueSelector */ @Test public void sendOrdered(){ Message msg = new Message("TopicTest", "hello rocketmq1".getBytes()) ; MessageQueueSelector messageQueueSelector = new DemoMessageQueueSelector(); try { defaultMQProducer.send(msg, messageQueueSelector, 1); defaultMQProducer.send(new Message("TopicTest", "hello rocketmq2".getBytes()) , messageQueueSelector, 1); defaultMQProducer.send(new Message("TopicTest", "hello rocketmq3".getBytes()) , messageQueueSelector, 1); defaultMQProducer.send(new Message("TopicTest", "hello rocketmq4".getBytes()) , messageQueueSelector, 1); defaultMQProducer.send(new Message("TopicTest", "hello rocketmq5".getBytes()) , messageQueueSelector, 1); System.in.read(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } ``` 接受例子见src/main/java