feign

feign

org.springframework.cloud
spring-cloud-starter-openfeign
2.0.2.RELEASE

package com.wpg.data.feign;

import feign.Logger;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Map;

/**

  • @author menghm.

  • @description表务统计相关接口

  • @date 2020/4/27.
    */
    @Component
    @FeignClient(name = “dbData”, url = “${wxdb.url}”, configuration = DbFeignClient.FormSupportConfig.class)
    public interface DbFeignClient {

    /**

    • 查询命令状态
    • @param cmdUuid
    • @return
      */
      @GetMapping(value = “/cmds/{cmdUuid}”)
      String querycmdInfo(@PathVariable(“cmdUuid”) String cmdUuid);

    /**

    • 查询设备详情
    • @param deviceId
    • @return
      */
      @GetMapping(value = “/devices/{deviceId}”)
      String queryDeviceInfo(@PathVariable(“deviceId”) String deviceId);

    /**

    • 查询设备历史数据
    • @param deviceId
    • @param date
    • @param limit
    • @param page
    • @return
      */
      @GetMapping(value = “/devices/{deviceId}/data”)
      String queryHistory(@PathVariable(“deviceId”) String deviceId,
      @RequestParam(required = false, value = “date”) String date,
      @RequestParam(required = false, value = “limit”) String limit,
      @RequestParam(required = false, value = “page”) String page

    );

    /**

    • 发送命令
    • @param queryParam
    • @return
      */
      @PostMapping(value = “/cmds”,
      consumes = {MediaType.MULTIPART_FORM_DATA_VALUE},
      produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}
      )
      String cmd(Map<String, ?> queryParam);

    /**

    • 查询设备历史命令
    • @param deviceId
    • @param limit
    • @param page
    • @return
      */
      @GetMapping(value = “/cmds/history/{deviceId}”)
      String queryHistoryCmd(@PathVariable(“deviceId”) String deviceId,
      @RequestParam(required = false, value = “limit”) String limit,
      @RequestParam(required = false, value = “page”) String page

    );

    class FormSupportConfig {
    @Autowired
    private ObjectFactory messageConverters;

     // new一个form编码器,实现支持form表单提交
     @Bean
     public Encoder feignFormEncoder() {
         return new SpringFormEncoder(new SpringEncoder(messageConverters));
     }
     // 开启Feign的日志
    
     @Bean
     public Logger.Level logger() {
         return Logger.Level.FULL;
     }
    

    }

}

objectutil obj转map

package com.wpg.data.utils;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Stream;

/**

  • @author menghm.

  • @description

  • @date 2019/11/22.
    */
    public class ObjectUtil {
    public ObjectUtil() {
    }

    public static Boolean isEmpty(Object obj) {
    if(obj == null) {
    return Boolean.valueOf(true);
    } else if(obj instanceof CharSequence) {
    return Boolean.valueOf(((CharSequence)obj).length() == 0);
    } else if(obj instanceof Collection) {
    return Boolean.valueOf(((Collection)obj).isEmpty());
    } else if(obj instanceof Map) {
    return Boolean.valueOf(((Map)obj).isEmpty());
    } else if(!(obj instanceof Object[])) {
    return Boolean.valueOf(false);
    } else {
    Object[] object = (Object[])((Object[])obj);
    if(object.length == 0) {
    return Boolean.valueOf(true);
    } else {
    boolean empty = true;

             for(int i = 0; i < object.length; ++i) {
                 if(!isEmpty(object[i]).booleanValue()) {
                     empty = false;
                     break;
                 }
             }
    
             return Boolean.valueOf(empty);
         }
     }
    

    }

    public static boolean nonEmpty(Object obj) {
    return !isEmpty(obj).booleanValue();
    }

    public static Map<String, Object> transBeanToMap(Object obj) {
    if(obj == null) {
    return null;
    } else if(obj instanceof Map) {
    return (Map)obj;
    } else {
    HashMap map = new HashMap();

         try {
             BeanInfo e = Introspector.getBeanInfo(obj.getClass());
             PropertyDescriptor[] propertyDescriptors = e.getPropertyDescriptors();
             PropertyDescriptor[] var4 = propertyDescriptors;
             int var5 = propertyDescriptors.length;
    
             for(int var6 = 0; var6 < var5; ++var6) {
                 PropertyDescriptor property = var4[var6];
                 String key = property.getName();
                 if(!key.equals("class")) {
                     Method getter = property.getReadMethod();
                     if(getter != null) {
                         Object value = getter.invoke(obj, new Object[0]);
                         if(value != null) {
                             map.put(key, value);
                         }
                     }
                 }
             }
         } catch (Exception var11) {
             System.out.println("transBean2Map Error " + var11);
         }
    
         return map;
     }
    

    }

    public static T nvl(T t, T d) {
    return Optional.ofNullable(t).orElse(d);
    }

    public static T nvl(T t, Supplier<? extends T> supplier) {
    return Optional.ofNullable(t).orElseGet(supplier);
    }

    public static Boolean anyEmpty(T… ts) {
    return Boolean.valueOf(Stream.of(ts).anyMatch(ObjectUtil::isEmpty));
    }

    public static List stringToList(String data, Class t) {
    return (List)(new Gson()).fromJson(data, TypeToken.getParameterized(ArrayList.class, new Type[]{t}).getType());
    }
    }

/**
* 开始定时统计RTU设备数据
*/
public void getRTUData() {
//获取需要采集的RTU设备
List deviceRtuList = deviceRtuMapper.getDevice();
if (CollectionUtil.isNotEmpty(deviceRtuList)) {
//调接口查询数据
for (DeviceRtu deviceRtu : deviceRtuList) {
String deviceId = deviceRtu.getDeviceId();
String date = this.getCurrentDay();
DbHistoryDTO dbHistoryDTO = new DbHistoryDTO(deviceId, date, “”, “”);
String result = “”;
try {
result = dbFeignClient.queryHistory(dbHistoryDTO.getDeviceId(), dbHistoryDTO.getDate(),
dbHistoryDTO.getLimit(), dbHistoryDTO.getPage()
);
log.debug("======" + result);
if (StringUtils.isEmpty(result)) {
continue;
}
DbResultVO resultVO = JSONObject.parseObject(result,
new TypeReference<DbResultVO>() {
});
if (ObjectUtil.isEmpty(resultVO)) {
continue;
}
if (!resultVO.getStat()) {
continue;
}
HistoryResultVO deviceInfoVO = resultVO.getData();
if (ObjectUtil.isEmpty(deviceInfoVO)) {
continue;
}
List list = deviceInfoVO.getItems();
if (CollectionUtil.isEmpty(list)) {
continue;
}
//组装数据
List serviceList = new ArrayList<>();
List mqList = new ArrayList<>();
for (HistoryInfoVO historyInfoVO : list) {
String addressId = historyInfoVO.getDeviceId();
if (com.xiaoleilu.hutool.util.ObjectUtil.isNotNull(historyInfoVO.getUploadTime())) {
historyInfoVO.setDate(
ftf.format(LocalDateTime.ofInstant(
Instant.ofEpochMilli(historyInfoVO.getUploadTime() * 1000),
ZoneId.systemDefault())));
}
String timeStamp = historyInfoVO.getDate();
String sumFlow = historyInfoVO.getSumFlow();
String pipePressure = historyInfoVO.getPipePressure();
Integer valve = historyInfoVO.getValveStatus();
//累计流量
ServiceValueDTO cumulativeFlow = new ServiceValueDTO(
addressId, addressId + “\” + “CumulativeFlow”,
“CumulativeFlow”, timeStamp
, sumFlow
);
serviceList.add(cumulativeFlow);
//水压1 管网压力
ServiceValueDTO pressureOne = new ServiceValueDTO(
addressId, addressId + “\” + “PipePressure”,
“PipePressure”, timeStamp, pipePressure
);
serviceList.add(pressureOne);
//阀门状态
ServiceValueDTO valveStatus = new ServiceValueDTO(
addressId, addressId + “\” + “ValveState”,
“ValveState”, timeStamp, valve == 0 ? “true” : “false”
);
serviceList.add(valveStatus);

                    //入mq
                    SortedMap<String, String> values = new TreeMap<>();
                    values.put("CumulativeFlow", sumFlow);
                    values.put("PipePressure", pipePressure);
                    values.put("ValveState", String.valueOf(valve));
                    MqttInfoDTO mqttInfoDTO = new MqttInfoDTO(addressId, timeStamp, values);
                    mqList.add(mqttInfoDTO);

                }
                //入库
                this.insertDeviceValue(serviceList);
                //入mq
                this.sendMqtt(mqList);

            } catch (Exception e) {
                log.error("调用接口失败");
            }
        }

    }
}  feign
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>

package com.wpg.data.feign;

import feign.Logger;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Map;

/**

  • @author menghm.

  • @description表务统计相关接口

  • @date 2020/4/27.
    */
    @Component
    @FeignClient(name = “dbData”, url = “${wxdb.url}”, configuration = DbFeignClient.FormSupportConfig.class)
    public interface DbFeignClient {

    /**

    • 查询命令状态
    • @param cmdUuid
    • @return
      */
      @GetMapping(value = “/cmds/{cmdUuid}”)
      String querycmdInfo(@PathVariable(“cmdUuid”) String cmdUuid);

    /**

    • 查询设备详情
    • @param deviceId
    • @return
      */
      @GetMapping(value = “/devices/{deviceId}”)
      String queryDeviceInfo(@PathVariable(“deviceId”) String deviceId);

    /**

    • 查询设备历史数据
    • @param deviceId
    • @param date
    • @param limit
    • @param page
    • @return
      */
      @GetMapping(value = “/devices/{deviceId}/data”)
      String queryHistory(@PathVariable(“deviceId”) String deviceId,
      @RequestParam(required = false, value = “date”) String date,
      @RequestParam(required = false, value = “limit”) String limit,
      @RequestParam(required = false, value = “page”) String page

    );

    /**

    • 发送命令
    • @param queryParam
    • @return
      */
      @PostMapping(value = “/cmds”,
      consumes = {MediaType.MULTIPART_FORM_DATA_VALUE},
      produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}
      )
      String cmd(Map<String, ?> queryParam);

    /**

    • 查询设备历史命令
    • @param deviceId
    • @param limit
    • @param page
    • @return
      */
      @GetMapping(value = “/cmds/history/{deviceId}”)
      String queryHistoryCmd(@PathVariable(“deviceId”) String deviceId,
      @RequestParam(required = false, value = “limit”) String limit,
      @RequestParam(required = false, value = “page”) String page

    );

    class FormSupportConfig {
    @Autowired
    private ObjectFactory messageConverters;

     // new一个form编码器,实现支持form表单提交
     @Bean
     public Encoder feignFormEncoder() {
         return new SpringFormEncoder(new SpringEncoder(messageConverters));
     }
     // 开启Feign的日志
    
     @Bean
     public Logger.Level logger() {
         return Logger.Level.FULL;
     }
    

    }

}

objectutil obj转map

package com.wpg.data.utils;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Stream;

/**

  • @author menghm.

  • @description

  • @date 2019/11/22.
    */
    public class ObjectUtil {
    public ObjectUtil() {
    }

    public static Boolean isEmpty(Object obj) {
    if(obj == null) {
    return Boolean.valueOf(true);
    } else if(obj instanceof CharSequence) {
    return Boolean.valueOf(((CharSequence)obj).length() == 0);
    } else if(obj instanceof Collection) {
    return Boolean.valueOf(((Collection)obj).isEmpty());
    } else if(obj instanceof Map) {
    return Boolean.valueOf(((Map)obj).isEmpty());
    } else if(!(obj instanceof Object[])) {
    return Boolean.valueOf(false);
    } else {
    Object[] object = (Object[])((Object[])obj);
    if(object.length == 0) {
    return Boolean.valueOf(true);
    } else {
    boolean empty = true;

             for(int i = 0; i < object.length; ++i) {
                 if(!isEmpty(object[i]).booleanValue()) {
                     empty = false;
                     break;
                 }
             }
    
             return Boolean.valueOf(empty);
         }
     }
    

    }

    public static boolean nonEmpty(Object obj) {
    return !isEmpty(obj).booleanValue();
    }

    public static Map<String, Object> transBeanToMap(Object obj) {
    if(obj == null) {
    return null;
    } else if(obj instanceof Map) {
    return (Map)obj;
    } else {
    HashMap map = new HashMap();

         try {
             BeanInfo e = Introspector.getBeanInfo(obj.getClass());
             PropertyDescriptor[] propertyDescriptors = e.getPropertyDescriptors();
             PropertyDescriptor[] var4 = propertyDescriptors;
             int var5 = propertyDescriptors.length;
    
             for(int var6 = 0; var6 < var5; ++var6) {
                 PropertyDescriptor property = var4[var6];
                 String key = property.getName();
                 if(!key.equals("class")) {
                     Method getter = property.getReadMethod();
                     if(getter != null) {
                         Object value = getter.invoke(obj, new Object[0]);
                         if(value != null) {
                             map.put(key, value);
                         }
                     }
                 }
             }
         } catch (Exception var11) {
             System.out.println("transBean2Map Error " + var11);
         }
    
         return map;
     }
    

    }

    public static T nvl(T t, T d) {
    return Optional.ofNullable(t).orElse(d);
    }

    public static T nvl(T t, Supplier<? extends T> supplier) {
    return Optional.ofNullable(t).orElseGet(supplier);
    }

    public static Boolean anyEmpty(T… ts) {
    return Boolean.valueOf(Stream.of(ts).anyMatch(ObjectUtil::isEmpty));
    }

    public static List stringToList(String data, Class t) {
    return (List)(new Gson()).fromJson(data, TypeToken.getParameterized(ArrayList.class, new Type[]{t}).getType());
    }
    }

/**
* 开始定时统计RTU设备数据
*/
public void getRTUData() {
//获取需要采集的RTU设备
List deviceRtuList = deviceRtuMapper.getDevice();
if (CollectionUtil.isNotEmpty(deviceRtuList)) {
//调接口查询数据
for (DeviceRtu deviceRtu : deviceRtuList) {
String deviceId = deviceRtu.getDeviceId();
String date = this.getCurrentDay();
DbHistoryDTO dbHistoryDTO = new DbHistoryDTO(deviceId, date, “”, “”);
String result = “”;
try {
result = dbFeignClient.queryHistory(dbHistoryDTO.getDeviceId(), dbHistoryDTO.getDate(),
dbHistoryDTO.getLimit(), dbHistoryDTO.getPage()
);
log.debug("======" + result);
if (StringUtils.isEmpty(result)) {
continue;
}
DbResultVO resultVO = JSONObject.parseObject(result,
new TypeReference<DbResultVO>() {
});
if (ObjectUtil.isEmpty(resultVO)) {
continue;
}
if (!resultVO.getStat()) {
continue;
}
HistoryResultVO deviceInfoVO = resultVO.getData();
if (ObjectUtil.isEmpty(deviceInfoVO)) {
continue;
}
List list = deviceInfoVO.getItems();
if (CollectionUtil.isEmpty(list)) {
continue;
}
//组装数据
List serviceList = new ArrayList<>();
List mqList = new ArrayList<>();
for (HistoryInfoVO historyInfoVO : list) {
String addressId = historyInfoVO.getDeviceId();
if (com.xiaoleilu.hutool.util.ObjectUtil.isNotNull(historyInfoVO.getUploadTime())) {
historyInfoVO.setDate(
ftf.format(LocalDateTime.ofInstant(
Instant.ofEpochMilli(historyInfoVO.getUploadTime() * 1000),
ZoneId.systemDefault())));
}
String timeStamp = historyInfoVO.getDate();
String sumFlow = historyInfoVO.getSumFlow();
String pipePressure = historyInfoVO.getPipePressure();
Integer valve = historyInfoVO.getValveStatus();
//累计流量
ServiceValueDTO cumulativeFlow = new ServiceValueDTO(
addressId, addressId + “\” + “CumulativeFlow”,
“CumulativeFlow”, timeStamp
, sumFlow
);
serviceList.add(cumulativeFlow);
//水压1 管网压力
ServiceValueDTO pressureOne = new ServiceValueDTO(
addressId, addressId + “\” + “PipePressure”,
“PipePressure”, timeStamp, pipePressure
);
serviceList.add(pressureOne);
//阀门状态
ServiceValueDTO valveStatus = new ServiceValueDTO(
addressId, addressId + “\” + “ValveState”,
“ValveState”, timeStamp, valve == 0 ? “true” : “false”
);
serviceList.add(valveStatus);

                    //入mq
                    SortedMap<String, String> values = new TreeMap<>();
                    values.put("CumulativeFlow", sumFlow);
                    values.put("PipePressure", pipePressure);
                    values.put("ValveState", String.valueOf(valve));
                    MqttInfoDTO mqttInfoDTO = new MqttInfoDTO(addressId, timeStamp, values);
                    mqList.add(mqttInfoDTO);

                }
                //入库
                this.insertDeviceValue(serviceList);
                //入mq
                this.sendMqtt(mqList);

            } catch (Exception e) {
                log.error("调用接口失败");
            }
        }

    }
}
上一篇:Feign(远程调用)与注册中心


下一篇:C语言题目:5-14 穷举问题-搬砖 (25 分)