首页 > 其他 > 详细

直接访问dubbo 服务的工具类,返回success

时间:2020-08-03 00:26:13      阅读:120      评论:0      收藏:0      [点我收藏+]

最近在写一个监控,主要目前是监控服务是否挂了,原理很简单,用脚本定时的去访问一下服务的接口,看服务是关挂了,监控dubbo的时候我需要一个工具类,指定ip端口服务名直接访问dubbo服务,找资料的过程中我发现cmd也可以直接调用dubbo服务
cmd调用dubbo方法

  1. telnet 127.0.0.1 8089

这时候输入ls 就可以直接查出服务列表

查服务中可以调用的方法

  1. ls com.phpsong.DemoService

服务端写个接口,返回success,就表示成功

  1. invoke com.phpsong.service.HeartBeatService.heartbeat()

调用当时如果是一个对象的方式

  1. invoke com.phpsong.service.GoodsService.getGoods({"class":"com.phpsong.dto.GoodsDTO","goodsCode":"XXXXXX"})

根据这个方式找到一个工具类

  1. package com.phpsong.monitor.utils;
  2.  
  3. import java.io.InputStream;
  4. import java.io.PrintWriter;
  5. import java.net.Socket;
  6. import java.util.Map;
  7. import java.util.Scanner;
  8.  
  9. public class DubboUtil {
  10.  
  11. /**
  12. * 为了监控服务是否能正常访问,没有参数
  13. * @param ip
  14. * @param methodName 包路径.类名.方法名
  15. * @return
  16. */
  17. public static String noParamInvokeDubbo(String ip,int port,String methodName){
  18. String request = methodName + "()";
  19.  
  20. //String ip = dubboUrl.split(":")[0];
  21.  
  22. //int port = Integer.parseInt(dubboUrl.split(":")[1]);
  23.  
  24. return telnetDubbo(ip, port, request);
  25. }
  26.  
  27.  
  28. public static String invokeDubbo(String dubboUrl, Map<String, String> map) {
  29.  
  30. String className = map.get("className");
  31. String methodName = map.get("methodName");
  32. String params = map.get("params");
  33.  
  34. String request = className + "." + methodName + "(" + params + ")";
  35.  
  36. String ip = dubboUrl.split(":")[0];
  37.  
  38. int port = Integer.parseInt(dubboUrl.split(":")[1]);
  39.  
  40. return telnetDubbo(ip, port, request);
  41. }
  42.  
  43. public static String telnetDubbo2(String ip, int port, String request) {
  44.  
  45. Socket socket;
  46. String result = "";
  47. try {
  48. socket = new Socket(ip, port);
  49. PrintWriter pw = new PrintWriter(socket.getOutputStream());
  50.  
  51. String msg = "\r\n";
  52. pw.write(msg);
  53. pw.flush();
  54.  
  55. InputStream ins = socket.getInputStream();
  56. byte[] tt = new byte[1024];
  57. ins.read(tt, 0, tt.length);
  58.  
  59. pw.write("invoke " + request + "\r\n");
  60. pw.flush();
  61. ins.read(tt, 0, tt.length);
  62. result = new String(tt, "gbk");
  63.  
  64. } catch (Exception e) {
  65. result=e.toString();
  66. }
  67.  
  68. return result;
  69. }
  70.  
  71.  
  72. public static String telnetDubbo(String ip, int port, String request) {
  73.  
  74. Socket socket;
  75. String result = "";
  76. try {
  77. socket = new Socket(ip, port);
  78. PrintWriter pw = new PrintWriter(socket.getOutputStream());
  79.  
  80. String msg = "\r\n";
  81. pw.write(msg);
  82. pw.flush();
  83.  
  84. InputStream ins = socket.getInputStream();
  85. Scanner sc = new Scanner(System.in);
  86.  
  87. byte[] tt = new byte[1024];
  88. int len = 0;
  89.  
  90. len = ins.read(tt, 0, tt.length);
  91.  
  92. pw.write("invoke " + request + "\r\n");
  93. pw.flush();
  94. len = ins.read(tt, 0, tt.length);
  95. result = new String(tt, 0, len, "gbk");
  96. result = result.split("\r\n")[0];
  97. } catch (Exception e) {
  98. //e.printStackTrace();
  99. result=e.toString();
  100. }
  101.  
  102. return result;
  103. }
  104. }

我的监控的时候是没有参数于是有重新写了一个没有参数的访问 noParamInvokeDubbo这样方便使用

springboot返回的对象都是json的,如果直接返回字符串,在字符串外层会加上双引号,这个要注意
如果是控制器中可以输出,来解决字符串加引号的问题

  1. response.getWriter().write("success");
  2. dubbo service层目前没有好的解决方式,有好的方式请留言

使用的是dubbo服务,主要找了一下是否有工具类直接访问dubbo服务,

最近优化了一下系统里的excel大文件的导入和导出,
导出修改的比较多,因为poi版本的问题,无法使用easyexcel来处理,在老版本poi只上修改的

pom.xml

  1. <!-- poi -->
  2. <dependency>
  3. <groupId>org.apache.poi</groupId>
  4. <artifactId>poi</artifactId>
  5. <version>3.9</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
  8. <dependency>
  9. <groupId>org.apache.poi</groupId>
  10. <artifactId>poi-ooxml</artifactId>
  11. <version>3.9</version>
  12. </dependency>
  13. <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
  14. <dependency>
  15. <groupId>org.apache.poi</groupId>
  16. <artifactId>poi-ooxml-schemas</artifactId>
  17. <version>3.9</version>
  18. </dependency>
  19.  
  20. <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
  21. <dependency>
  22. <groupId>org.apache.commons</groupId>
  23. <artifactId>commons-collections4</artifactId>
  24. <version>4.1</version>
  25. </dependency>

添加工具类

  1. import java.io.InputStream;
  2. import java.util.List;
  3. import java.util.Objects;
  4.  
  5. import org.apache.log4j.Logger;
  6. import org.apache.poi.openxml4j.opc.OPCPackage;
  7. import org.apache.poi.xssf.eventusermodel.XSSFReader;
  8. import org.apache.poi.xssf.model.SharedStringsTable;
  9. import org.xml.sax.InputSource;
  10. import org.xml.sax.XMLReader;
  11. import org.xml.sax.helpers.XMLReaderFactory;
  12.  
  13. public class LargeExcelFileReadUtil {
  14. /** logger日志. */
  15. public static final Logger LOGGER = Logger.getLogger(LargeExcelFileReadUtil.class);
  16.  
  17. // 处理一个sheet
  18. public static List<String> getRowFromSheetOne(String filename, Integer rowNum) throws Exception {
  19. InputStream inputStream = null;
  20. OPCPackage pkg = null;
  21. SingleRowHandler singleRowHandler = null;
  22. try {
  23. pkg = OPCPackage.open(filename);
  24. XSSFReader r = new XSSFReader(pkg);
  25. SharedStringsTable sst = r.getSharedStringsTable();
  26. singleRowHandler = new SingleRowHandler(sst, rowNum);
  27. XMLReader parser = XMLReaderFactory.createXMLReader("com.sun.org.apache.xerces.internal.parsers.SAXParser");
  28. parser.setContentHandler(singleRowHandler);
  29. inputStream = r.getSheet("rId1");
  30. InputSource sheetSource = new InputSource(inputStream);
  31. parser.parse(sheetSource);
  32. return singleRowHandler.getRow();
  33. } catch (Exception e) {
  34. String message = e.getMessage();
  35. if (Objects.nonNull(rowNum) && Objects.nonNull(singleRowHandler)
  36. && SingleRowHandler.FINISH_ROW_MESSAGE.equalsIgnoreCase(message)) {
  37. // 获取某一行数据完成 ,暂时不知道怎么能终止excel解析,直接抛出了异常,实际是成功的
  38. return singleRowHandler.getRow();
  39. }
  40. throw e;
  41. } finally {
  42. if (Objects.nonNull(pkg)) {
  43. pkg.close();
  44. }
  45. if (Objects.nonNull(inputStream)) {
  46. inputStream.close();
  47. }
  48. }
  49. }
  50.  
  51. // 处理一个sheet
  52. public static List<List<String>> getRowsFromSheetOne(String filename) throws Exception {
  53. InputStream inputStream = null;
  54. OPCPackage pkg = null;
  55. MultiRowHandler multiRowHandler = null;
  56. try {
  57. pkg = OPCPackage.open(filename);
  58. XSSFReader r = new XSSFReader(pkg);
  59. SharedStringsTable sst = r.getSharedStringsTable();
  60. multiRowHandler = new MultiRowHandler(sst);
  61. XMLReader parser = XMLReaderFactory.createXMLReader("com.sun.org.apache.xerces.internal.parsers.SAXParser");
  62. parser.setContentHandler(multiRowHandler);
  63. inputStream = r.getSheet("rId1");
  64. InputSource sheetSource = new InputSource(inputStream);
  65. parser.parse(sheetSource);
  66. return multiRowHandler.getRows();
  67. } catch (Exception e) {
  68. throw e;
  69. } finally {
  70. if (Objects.nonNull(pkg)) {
  71. pkg.close();
  72. }
  73. if (Objects.nonNull(inputStream)) {
  74. inputStream.close();
  75. }
  76. }
  77. }
  78.  
  79. public static List<List<String>> getRowsFromSheetOne(InputStream inputStream) throws Exception {
  80.  
  81. OPCPackage pkg = null;
  82. MultiRowHandler multiRowHandler = null;
  83. try {
  84. pkg = OPCPackage.open(inputStream);
  85. XSSFReader r = new XSSFReader(pkg);
  86. SharedStringsTable sst = r.getSharedStringsTable();
  87. multiRowHandler = new MultiRowHandler(sst);
  88. XMLReader parser = XMLReaderFactory.createXMLReader("com.sun.org.apache.xerces.internal.parsers.SAXParser");
  89. parser.setContentHandler(multiRowHandler);
  90. inputStream = r.getSheet("rId1");
  91. InputSource sheetSource = new InputSource(inputStream);
  92. parser.parse(sheetSource);
  93. return multiRowHandler.getRows();
  94. } catch (Exception e) {
  95. throw e;
  96. } finally {
  97. if (Objects.nonNull(pkg)) {
  98. pkg.close();
  99. }
  100. if (Objects.nonNull(inputStream)) {
  101. inputStream.close();
  102. }
  103. }
  104. }
  105.  
  106. public static void main(String[] args) throws Exception {
  107. List<List<String>> rowsFromSheetOne = LargeExcelFileReadUtil.getRowsFromSheetOne("E:/20200511/22.xlsx");
  108. System.out.println(rowsFromSheetOne);
  109.  
  110. }
  111.  
  112. }
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Objects;
  4. import java.util.regex.Pattern;
  5.  
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.apache.poi.xssf.model.SharedStringsTable;
  8. import org.apache.poi.xssf.usermodel.XSSFRichTextString;
  9. import org.xml.sax.Attributes;
  10. import org.xml.sax.SAXException;
  11. import org.xml.sax.helpers.DefaultHandler;
  12.  
  13. /**
  14. * 获取完整excel数据的handler<br/>
  15. *
  16. * @author Administrator
  17. *
  18. */
  19. public class MultiRowHandler extends DefaultHandler {
  20. private int curRowNum = 0;// 行号,从1开始
  21. private int curColIndex = -1;// 列索引,从0开始
  22. private int colCnt = 0;// 列数,取第一行列数做为列总数
  23. private String cellType = "";
  24. private SharedStringsTable sst;
  25. private String lastContents;
  26. private boolean nextIsString;
  27. private String cellPosition;
  28. private List<String> head = null;
  29. private List<String> curRowData = null;
  30. private boolean curRowIsBlank = true;// 当前是个空行
  31. private List<List<String>> rows = new ArrayList<>();
  32.  
  33. public List<List<String>> getRows() {
  34. return rows;
  35. }
  36.  
  37. public MultiRowHandler(SharedStringsTable sst) {
  38. this.sst = sst;
  39. }
  40.  
  41. @Override
  42. public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
  43. if (name.equals("c")) {
  44. cellPosition = attributes.getValue("r");
  45. curColIndex = getColIndex(cellPosition);
  46. // 这是一个新行
  47. if (isNewRow(cellPosition)) {
  48. curRowNum = getRowNum(cellPosition);
  49. if (2 == curRowNum && Objects.nonNull(curRowData)) {
  50. head = curRowData;
  51. colCnt = head.size();
  52. }
  53. curRowData = getBlankRow(colCnt);
  54. }
  55. cellType = "";
  56. cellType = attributes.getValue("t");
  57. if ("s".equals(cellType)) {
  58. nextIsString = true;
  59. } else {
  60. nextIsString = false;
  61. }
  62. }
  63. // 清楚缓存内容
  64. lastContents = "";
  65. }
  66.  
  67. private boolean isNewRow(String cellPosition) {
  68. // 坐标以A开头,后面跟数字 或者坐标行和当前行不一致的
  69. boolean newRow = Pattern.compile("^A[0-9]+$").matcher(cellPosition).find();
  70. if (!newRow) {
  71. int cellRowNum = getRowNum(cellPosition);
  72. newRow = (cellRowNum != curRowNum);
  73. }
  74. return newRow;
  75. }
  76.  
  77. /**
  78. * 根据列坐标获取行号,从1开始,返回0时标示出错
  79. *
  80. * @param cellPosition
  81. * 列坐标,为A1,B23等
  82. * @return 行号,从1开始,返回0是为失败
  83. */
  84. private static int getRowNum(String cellPosition) {
  85. String strVal = Pattern.compile("[^0-9]").matcher(cellPosition).replaceAll("").trim();// 获取坐标中的数字
  86. if (StringUtils.isNotBlank(strVal)) {
  87. return Integer.valueOf(strVal);
  88. }
  89. return 0;
  90. }
  91.  
  92. /**
  93. * 根据列坐标返回当前列索引,从0开始,返回-1时标示出错<br/>
  94. * A1->0; B1->1...AA1->26
  95. *
  96. * @param cellPosition
  97. * 列坐标,为A1,B23等
  98. * @return 列索引,从0开始,返回-1是为失败,A1->0; B1->1...AA1->26
  99. */
  100. private static int getColIndex(String cellPosition) {
  101. int index = -1;
  102. int num = 65;// A的Unicode码
  103. int length = cellPosition.length();
  104. for (int i = 0; i < length; i++) {
  105. char c = cellPosition.charAt(i);
  106. if (Character.isDigit(c)) {
  107. break;// 确定指定的char值是否为数字
  108. }
  109. index = (index + 1) * 26 + (int) c - num;
  110. }
  111. return index;
  112. }
  113.  
  114. /**
  115. * 返回一个全部为空字符串的空行
  116. *
  117. * @param cnt
  118. * @return
  119. */
  120. private List<String> getBlankRow(int cnt) {
  121. List<String> result = new ArrayList<>(cnt);
  122. for (int i = 0; i < cnt; i++) {
  123. result.add(i, "");
  124. }
  125. curRowIsBlank = true;
  126. return result;
  127. }
  128.  
  129. @Override
  130. public void endElement(String uri, String localName, String name) throws SAXException {
  131. if (nextIsString) {
  132. int idx = Integer.parseInt(lastContents);
  133. lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
  134. nextIsString = false;
  135. }
  136.  
  137. if (name.equals("v")) {
  138. // System.out.println(MessageFormat.format("当前列定位:{0},当前行:{1},当前列:{2},当前值:{3}",
  139. // cellPosition, curRowNum,
  140. // curColIndex, lastContents));
  141. if (Objects.isNull(head)) {
  142. curRowData.add(lastContents);
  143. } else {
  144. curRowData.set(curColIndex, lastContents);
  145. }
  146. curRowIsBlank = false;
  147. // 这是一个新行
  148. if (isNewRow(cellPosition)) {
  149. if (Objects.nonNull(curRowData)) {
  150. if (curRowIsBlank) {
  151. curRowData.clear();// 如果当前行是空行,则清空当前行数据
  152. }
  153. rows.add(curRowData);
  154. }
  155. }
  156.  
  157. }
  158. }
  159.  
  160. @Override
  161. public void endDocument() throws SAXException {
  162. if (Objects.nonNull(curRowData) && !curRowIsBlank) {
  163. rows.add(curRowData);// 最后一行在上面不好加入,最后一行全是空行的不加入
  164. }
  165. super.endDocument();
  166. }
  167.  
  168. @Override
  169. public void characters(char[] ch, int start, int length) throws SAXException {
  170. lastContents += new String(ch, start, length);
  171. }
  172.  
  173. @Override
  174. public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
  175. lastContents += "";
  176. }
  177.  
  178. public static void main(String[] args) {
  179. System.out.println(getColIndex("BC2"));
  180. }
  181. }
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Objects;
  4. import java.util.regex.Pattern;
  5.  
  6. import org.apache.poi.xssf.model.SharedStringsTable;
  7. import org.apache.poi.xssf.usermodel.XSSFRichTextString;
  8. import org.xml.sax.Attributes;
  9. import org.xml.sax.SAXException;
  10. import org.xml.sax.helpers.DefaultHandler;
  11.  
  12. public class SingleRowHandler extends DefaultHandler {
  13. public final static String FINISH_ROW_MESSAGE = "row data process finish";
  14.  
  15. private Integer rowNum = null;// rowNum不为空时则标示只需要获取这一行的数据
  16. private int curRowNum = 1;
  17. private String cellType = "";
  18. private SharedStringsTable sst;
  19. private String lastContents;
  20. private boolean nextIsString;
  21. private String cellPosition;
  22. private List<String> row = new ArrayList<>();
  23.  
  24. public List<String> getRow() {
  25. return row;
  26. }
  27.  
  28. public SingleRowHandler(SharedStringsTable sst, Integer rowNum) {
  29. this.sst = sst;
  30. this.rowNum = rowNum;
  31. }
  32.  
  33. public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
  34. if (name.equals("c")) {
  35. cellPosition = attributes.getValue("r");
  36. // 这是一个新行
  37. if (Pattern.compile("^A[0-9]+$").matcher(cellPosition).find()) {
  38. curRowNum = Integer.valueOf(cellPosition.substring(1));
  39. }
  40. cellType = "";
  41. cellType = attributes.getValue("t");
  42. if ("s".equals(cellType)) {
  43. nextIsString = true;
  44. } else {
  45. nextIsString = false;
  46. }
  47. }
  48. // 清楚缓存内容
  49. lastContents = "";
  50. if (Objects.nonNull(rowNum) && curRowNum > rowNum) {
  51. // 获取某一行数据完成 ,暂时不知道怎么能终止excel解析,直接抛出了异常,实际是成功的
  52. throw new SAXException(FINISH_ROW_MESSAGE);
  53. }
  54. }
  55.  
  56. public void endElement(String uri, String localName, String name) throws SAXException {
  57. if (nextIsString) {
  58. int idx = Integer.parseInt(lastContents);
  59. lastContents = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
  60. nextIsString = false;
  61. }
  62.  
  63. if (name.equals("v")) {
  64. if (Objects.isNull(rowNum) || rowNum == curRowNum) {
  65. row.add(lastContents);
  66. }
  67. }
  68. }
  69.  
  70. public void characters(char[] ch, int start, int length) throws SAXException {
  71. lastContents += new String(ch, start, length);
  72. }
  73. }

目前的瓶颈在数据库层,有大量的数据有更新,目前还没有想到比较好的方式去处理大量的更新

直接访问dubbo 服务的工具类,返回success

原文:https://www.cnblogs.com/ynog/p/13423888.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!