# 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