AdministrationProxy.java
上传用户:xfwatch
上传日期:2020-12-14
资源大小:872k
文件大小:19k
源码类别:

中间件编程

开发平台:

Java

  1. /*
  2.  * JBoss, Home of Professional Open Source
  3.  * Copyright 2008, Red Hat, Inc., and others contributors as indicated
  4.  * by the @authors tag. All rights reserved.
  5.  * See the copyright.txt in the distribution for a
  6.  * full listing of individual contributors.
  7.  * This copyrighted material is made available to anyone wishing to use,
  8.  * modify, copy, or redistribute it subject to the terms and conditions
  9.  * of the GNU Lesser General Public License, v. 2.1.
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT A
  11.  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  12.  * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
  13.  * You should have received a copy of the GNU Lesser General Public License,
  14.  * v.2.1 along with this distribution; if not, write to the Free Software
  15.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  16.  * MA  02110-1301, USA.
  17.  */
  18. package org.jboss.blacktie.administration.core;
  19. import java.io.IOException;
  20. import java.io.StringReader;
  21. import java.io.StringWriter;
  22. import java.util.ArrayList;
  23. import java.util.HashSet;
  24. import java.util.Iterator;
  25. import java.util.List;
  26. import java.util.Properties;
  27. import javax.jms.Destination;
  28. import javax.jms.Queue;
  29. import javax.management.MBeanServerConnection;
  30. import javax.management.ObjectName;
  31. import javax.management.remote.JMXConnector;
  32. import javax.management.remote.JMXConnectorFactory;
  33. import javax.management.remote.JMXServiceURL;
  34. import javax.xml.parsers.DocumentBuilder;
  35. import javax.xml.parsers.DocumentBuilderFactory;
  36. import javax.xml.transform.OutputKeys;
  37. import javax.xml.transform.Transformer;
  38. import javax.xml.transform.TransformerFactory;
  39. import javax.xml.transform.dom.DOMSource;
  40. import javax.xml.transform.stream.StreamResult;
  41. import org.apache.log4j.LogManager;
  42. import org.apache.log4j.Logger;
  43. import org.jboss.blacktie.jatmibroker.core.conf.ConfigurationException;
  44. import org.jboss.blacktie.jatmibroker.core.conf.XMLEnvHandler;
  45. import org.jboss.blacktie.jatmibroker.core.conf.XMLParser;
  46. import org.jboss.blacktie.jatmibroker.xatmi.Connection;
  47. import org.jboss.blacktie.jatmibroker.xatmi.ConnectionException;
  48. import org.jboss.blacktie.jatmibroker.xatmi.ConnectionFactory;
  49. import org.jboss.blacktie.jatmibroker.xatmi.Response;
  50. import org.jboss.blacktie.jatmibroker.xatmi.X_OCTET;
  51. import org.w3c.dom.Document;
  52. import org.w3c.dom.Element;
  53. import org.xml.sax.InputSource;
  54. public class AdministrationProxy {
  55. private static final Logger log = LogManager
  56. .getLogger(AdministrationProxy.class);
  57. private Properties prop = new Properties();
  58. private JMXConnector c;
  59. private MBeanServerConnection beanServerConnection;
  60. private Connection connection;
  61. private List<String> servers;
  62. public static Boolean isDomainPause = false;
  63. public AdministrationProxy() throws IOException, ConfigurationException,
  64. ConnectionException {
  65. log.debug("Administration Proxy");
  66. XMLEnvHandler handler = new XMLEnvHandler(prop);
  67. XMLParser xmlenv = new XMLParser(handler, "btconfig.xsd");
  68. xmlenv.parse("btconfig.xml");
  69. servers = (List<String>) prop.get("blacktie.domain.servers");
  70. ConnectionFactory cf = ConnectionFactory.getConnectionFactory();
  71. connection = cf.getConnection();
  72. JMXServiceURL u = new JMXServiceURL((String) prop.get("JMXURL"));
  73. c = JMXConnectorFactory.connect(u);
  74. beanServerConnection = c.getMBeanServerConnection();
  75. log.debug("Created Administration Proxy");
  76. }
  77. private Element stringToElement(String s) throws Exception {
  78. StringReader sreader = new StringReader(s.trim());
  79. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  80. DocumentBuilder parser = factory.newDocumentBuilder();
  81. Document doc = parser.parse(new InputSource(sreader));
  82. return doc.getDocumentElement();
  83. }
  84. private String elementToString(Element element) throws Exception {
  85. // Set up the output transformer
  86. TransformerFactory transfac = TransformerFactory.newInstance();
  87. Transformer trans = transfac.newTransformer();
  88. trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
  89. trans.setOutputProperty(OutputKeys.INDENT, "yes");
  90. StringWriter sw = new StringWriter();
  91. StreamResult sr = new StreamResult(sw);
  92. DOMSource source = new DOMSource(element);
  93. trans.transform(source, sr);
  94. return sw.toString();
  95. }
  96. private Response callAdminService(String serverName, int id, String command)
  97. throws ConnectionException {
  98. log.trace("callAdminService");
  99. int sendlen = command.length() + 1;
  100. X_OCTET sendbuf = (X_OCTET) connection.tpalloc("X_OCTET", null);
  101. sendbuf.setByteArray(command.getBytes());
  102. String service = serverName + "_ADMIN_" + id;
  103. Response rcvbuf = connection.tpcall(service, sendbuf, sendlen, 0);
  104. return rcvbuf;
  105. }
  106. private Boolean callAdminCommand(String serverName, int id, String command) {
  107. log.trace("callAdminCommand");
  108. try {
  109. Response buf = callAdminService(serverName, id, command);
  110. if (buf != null) {
  111. byte[] received = ((X_OCTET) buf.getBuffer()).getByteArray();
  112. return (received[0] == '1');
  113. }
  114. } catch (ConnectionException e) {
  115. log.error("call server " + serverName + " id " + id + " command "
  116. + command + " failed with " + e.getTperrno());
  117. }
  118. return false;
  119. }
  120. private Boolean advertise(String serverName, int id, String serviceName) {
  121. log.trace("advertise");
  122. String command = "advertise," + serviceName + ",";
  123. return callAdminCommand(serverName, id, command);
  124. }
  125. private Boolean unadvertise(String serverName, int id, String serviceName) {
  126. log.trace("unadvertise");
  127. String command = "unadvertise," + serviceName + ",";
  128. return callAdminCommand(serverName, id, command);
  129. }
  130. public String getDomainName() {
  131. log.trace("getDomainName");
  132. return prop.getProperty("blacktie.domain.name");
  133. }
  134. public String getSoftwareVersion() {
  135. log.trace("getSoftwareVersion");
  136. return prop.getProperty("blacktie.domain.version");
  137. }
  138. public Boolean getDomainStatus() {
  139. return isDomainPause;
  140. }
  141. public Boolean pauseDomain() {
  142. log.trace("pauseDomain");
  143. Boolean result = true;
  144. List<String> servers = listRunningServers();
  145. for (int i = 0; i < servers.size(); i++) {
  146. result = pauseServer(servers.get(i)) && result;
  147. }
  148. if (result == true && isDomainPause == false) {
  149. isDomainPause = true;
  150. log.info("Domain pause");
  151. }
  152. return result;
  153. }
  154. public Boolean pauseServer(String serverName) {
  155. log.trace("pauseServer");
  156. Boolean result = true;
  157. List<Integer> ids = listRunningInstanceIds(serverName);
  158. for (int i = 0; i < ids.size(); i++) {
  159. result = pauseServerById(serverName, ids.get(i)) && result;
  160. }
  161. return result;
  162. }
  163. public Boolean pauseServerById(String serverName, int id) {
  164. log.trace("pauseServerById");
  165. return callAdminCommand(serverName, id, "pause");
  166. }
  167. public Boolean resumeDomain() {
  168. log.trace("resumeDomain");
  169. Boolean result = true;
  170. List<String> servers = listRunningServers();
  171. for (int i = 0; i < servers.size(); i++) {
  172. result = resumeServer(servers.get(i)) && result;
  173. }
  174. if (result == true && isDomainPause == true) {
  175. isDomainPause = false;
  176. log.info("Domain resume");
  177. }
  178. return result;
  179. }
  180. public Boolean resumeServer(String serverName) {
  181. log.trace("resumeServer");
  182. Boolean result = true;
  183. List<Integer> ids = listRunningInstanceIds(serverName);
  184. for (int i = 0; i < ids.size(); i++) {
  185. result = resumeServerById(serverName, ids.get(i)) && result;
  186. }
  187. return result;
  188. }
  189. public Boolean resumeServerById(String serverName, int id) {
  190. log.trace("resumeServerById");
  191. return callAdminCommand(serverName, id, "resume");
  192. }
  193. public List<String> getServerList() {
  194. log.trace("getServerList");
  195. ArrayList<String> serverList = new ArrayList<String>();
  196. for (String server : servers) {
  197. serverList.add(server);
  198. }
  199. return serverList;
  200. }
  201. @SuppressWarnings("unchecked")
  202. public List<String> listRunningServers() {
  203. log.trace("listRunningServers");
  204. List<String> runningServerList = new ArrayList<String>();
  205. try {
  206. ObjectName objName = new ObjectName(
  207. "jboss.messaging:service=ServerPeer");
  208. HashSet dests = (HashSet) beanServerConnection.getAttribute(
  209. objName, "Destinations");
  210. Iterator<Destination> it = dests.iterator();
  211. while (it.hasNext()) {
  212. Destination dest = it.next();
  213. if (dest instanceof Queue) {
  214. String qname = ((Queue) dest).getQueueName();
  215. for (String server : servers) {
  216. // int index = qname.indexOf(server + "_ADMIN_");
  217. // log.debug("server is " + server + " qname is " +
  218. // qname + " index is " + index);
  219. if (qname.indexOf(server + "_ADMIN_") >= 0
  220. && !runningServerList.contains(server)) {
  221. runningServerList.add(server);
  222. }
  223. }
  224. }
  225. }
  226. } catch (Exception e) {
  227. log.error(e);
  228. }
  229. return runningServerList;
  230. }
  231. @SuppressWarnings("unchecked")
  232. public List<Integer> listRunningInstanceIds(String serverName) {
  233. log.trace("listRunningInstanceIds");
  234. ArrayList<Integer> ids = new ArrayList<Integer>();
  235. try {
  236. ObjectName objName = new ObjectName(
  237. "jboss.messaging:service=ServerPeer");
  238. HashSet dests = (HashSet) beanServerConnection.getAttribute(
  239. objName, "Destinations");
  240. Iterator<Destination> it = dests.iterator();
  241. while (it.hasNext()) {
  242. Destination dest = it.next();
  243. if (dest instanceof Queue) {
  244. String qname = ((Queue) dest).getQueueName();
  245. int index = qname.indexOf(serverName + "_ADMIN_");
  246. if (index >= 0) {
  247. ids.add(new Integer(qname.substring(index
  248. + serverName.length() + 7)));
  249. }
  250. }
  251. }
  252. } catch (Exception e) {
  253. log.error(e);
  254. }
  255. return ids;
  256. }
  257. public Element getServersStatus() {
  258. log.trace("getServersStatus");
  259. try {
  260. String status = "<servers>n";
  261. for (String server : servers) {
  262. status += "t<server>n";
  263. status += "tt<name>" + server + "</name>n";
  264. List<Integer> ids = listRunningInstanceIds(server);
  265. if (ids.size() > 0) {
  266. status += "tt<instances>n";
  267. for (int i = 0; i < ids.size(); i++) {
  268. status += "ttt<instance>n";
  269. status += "tttt<id>" + ids.get(i) + "</id>n";
  270. status += "tttt<status>1</status>n";
  271. status += "ttt</instance>n";
  272. }
  273. status += "tt</instances>n";
  274. }
  275. status += "t</server>n";
  276. }
  277. status += "</servers>";
  278. return stringToElement(status);
  279. } catch (Exception e) {
  280. log.error(e);
  281. return null;
  282. }
  283. }
  284. public Element listServiceStatus(String serverName, String serviceName) {
  285. log.trace("listServiceStatus");
  286. String servers;
  287. Element status = null;
  288. List<Integer> ids = listRunningInstanceIds(serverName);
  289. if (ids.size() == 0) {
  290. return null;
  291. }
  292. try {
  293. servers = "<servers>";
  294. for (int i = 0; i < ids.size(); i++) {
  295. Element result = listServiceStatusById(serverName, ids.get(i),
  296. serviceName);
  297. if (result != null) {
  298. servers += "<instance><id>" + ids.get(i) + "</id>";
  299. servers += elementToString(result);
  300. servers += "</instance>";
  301. }
  302. }
  303. servers += "</servers>";
  304. status = stringToElement(servers);
  305. } catch (Exception e) {
  306. log.error(e);
  307. }
  308. return status;
  309. }
  310. public Boolean advertise(String serverName, String serviceName) {
  311. log.trace("advertise");
  312. List<Integer> ids = listRunningInstanceIds(serverName);
  313. Boolean result = true;
  314. if (ids.size() == 0) {
  315. log.warn("Server was not running: " + serverName);
  316. return false;
  317. }
  318. for (int i = 0; i < ids.size(); i++) {
  319. result = advertise(serverName, ids.get(i), serviceName) && result;
  320. log.warn("Failed to advertise service at: " + ids.get(i));
  321. }
  322. return result;
  323. }
  324. public Boolean unadvertise(String serverName, String serviceName) {
  325. log.trace("unadvertise");
  326. List<Integer> ids = listRunningInstanceIds(serverName);
  327. Boolean result = true;
  328. if (ids.size() == 0) {
  329. log.warn("Server was not running: " + serverName);
  330. return false;
  331. }
  332. for (int i = 0; i < ids.size(); i++) {
  333. result = unadvertise(serverName, ids.get(i), serviceName) && result;
  334. log.warn("Failed to unadvertise service at: " + ids.get(i));
  335. }
  336. return result;
  337. }
  338. public Boolean shutdown(String serverName, int id) {
  339. log.trace("shutdown");
  340. if (servers.contains(serverName)) {
  341. String command = "serverdone";
  342. boolean shutdown = false;
  343. try {
  344. if (id == 0) {
  345. List<Integer> ids = listRunningInstanceIds(serverName);
  346. for (int i = 0; i < ids.size(); i++) {
  347. callAdminService(serverName, ids.get(i), command);
  348. }
  349. } else {
  350. callAdminService(serverName, id, command);
  351. }
  352. int timeout = 40;
  353. while (true) {
  354. List<Integer> ids = listRunningInstanceIds(serverName);
  355. if (id == 0 && ids.size() > 0 || ids.contains(id)) {
  356. try {
  357. Thread.currentThread().sleep(3000);
  358. } catch (InterruptedException e) {
  359. e.printStackTrace();
  360. }
  361. timeout--;
  362. } else {
  363. shutdown = true;
  364. break;
  365. }
  366. if (timeout == 0) {
  367. log.warn("Server did not shutdown in time: "
  368. + serverName + ": " + id);
  369. break;
  370. }
  371. }
  372. return shutdown;
  373. } catch (ConnectionException e) {
  374. log.error("call server " + serverName + " id " + id
  375. + " failed with " + e.getTperrno(), e);
  376. return false;
  377. } catch (RuntimeException e) {
  378. log.error("Could not shutdown server: " + e.getMessage(), e);
  379. throw e;
  380. }
  381. } else {
  382. log.error("Server not configured: " + serverName);
  383. return false;
  384. }
  385. }
  386. public String getResponseTimeById(String serverName, int id,
  387. String serviceName) {
  388. log.trace("getResponseTimeById");
  389. String command = "responsetime," + serviceName + ",";
  390. log.trace("response command is " + command);
  391. try {
  392. Response buf = callAdminService(serverName, id, command);
  393. if (buf != null) {
  394. byte[] received = ((X_OCTET) buf.getBuffer()).getByteArray();
  395. String result = new String(received, 1, received.length - 1);
  396. log.trace("response result is " + result);
  397. return result;
  398. }
  399. } catch (ConnectionException e) {
  400. log.error("call server " + serverName + " id " + id
  401. + " failed with " + e.getTperrno(), e);
  402. } catch (RuntimeException e) {
  403. log.error("Could not get response time from server: "
  404. + e.getMessage(), e);
  405. throw e;
  406. }
  407. return null;
  408. }
  409. public String getResponseTime(String serverName, String serviceName) {
  410. log.trace("getResponseTime");
  411. List<Integer> ids = listRunningInstanceIds(serverName);
  412. String responseTime;
  413. long min = 0;
  414. long avg = 0;
  415. long max = 0;
  416. long total = 0;
  417. for (int i = 0; i < ids.size(); i++) {
  418. responseTime = getResponseTimeById(serverName, ids.get(i),
  419. serviceName);
  420. String[] times = responseTime.split(",");
  421. if (times.length == 3) {
  422. long t = Long.valueOf(times[0]);
  423. if (min == 0 || t < min) {
  424. min = t;
  425. }
  426. t = Long.valueOf(times[2]);
  427. if (t > max) {
  428. max = t;
  429. }
  430. long counter = getServiceCounterById(serverName, ids.get(i),
  431. serviceName);
  432. t = Long.valueOf(times[1]);
  433. if (total != 0 || counter != 0) {
  434. avg = (avg * total + t * counter) / (total + counter);
  435. }
  436. }
  437. }
  438. return String.format("%d,%d,%d", min, avg, max);
  439. }
  440. public long getServiceCounterById(String serverName, int id,
  441. String serviceName) {
  442. log.trace("getServiceCounterById");
  443. long counter = 0;
  444. String command = "counter," + serviceName + ",";
  445. try {
  446. Response buf = callAdminService(serverName, id, command);
  447. if (buf != null) {
  448. byte[] received = ((X_OCTET) buf.getBuffer()).getByteArray();
  449. counter = Long.parseLong(new String(received, 1,
  450. received.length - 1));
  451. }
  452. } catch (ConnectionException e) {
  453. log.error("call server " + serverName + " id " + id
  454. + " failed with " + e.getTperrno());
  455. }
  456. return counter;
  457. }
  458. public long getServiceCounter(String serverName, String serviceName) {
  459. log.trace("getServiceCounter");
  460. long counter = 0;
  461. List<Integer> ids = listRunningInstanceIds(serverName);
  462. for (int i = 0; i < ids.size(); i++) {
  463. counter += getServiceCounterById(serverName, ids.get(i),
  464. serviceName);
  465. }
  466. return counter;
  467. }
  468. public long getErrorCounterById(String serverName, int id,
  469. String serviceName) {
  470. log.trace("getErrorCounterById");
  471. long counter = 0;
  472. String command = "error_counter," + serviceName + ",";
  473. try {
  474. Response buf = callAdminService(serverName, id, command);
  475. if (buf != null) {
  476. byte[] received = ((X_OCTET) buf.getBuffer()).getByteArray();
  477. counter = Long.parseLong(new String(received, 1,
  478. received.length - 1));
  479. }
  480. } catch (ConnectionException e) {
  481. log.error("call server " + serverName + " id " + id
  482. + " failed with " + e.getTperrno());
  483. }
  484. return counter;
  485. }
  486. public long getErrorCounter(String serverName, String serviceName) {
  487. log.trace("getErrorCounter");
  488. long counter = 0;
  489. List<Integer> ids = listRunningInstanceIds(serverName);
  490. for (int i = 0; i < ids.size(); i++) {
  491. counter += getErrorCounterById(serverName, ids.get(i), serviceName);
  492. }
  493. return counter;
  494. }
  495. public Boolean reloadDomain() {
  496. log.trace("reloadDomain");
  497. Boolean result = true;
  498. List<String> servers = listRunningServers();
  499. for (int i = 0; i < servers.size(); i++) {
  500. result = reloadServer(servers.get(i)) && result;
  501. }
  502. return result;
  503. }
  504. public Boolean reloadServer(String serverName) {
  505. log.trace("reloadServer");
  506. Boolean result = true;
  507. List<Integer> ids = listRunningInstanceIds(serverName);
  508. for (int i = 0; i < ids.size(); i++) {
  509. result = reloadServerById(serverName, ids.get(i)) && result;
  510. }
  511. return result;
  512. }
  513. public Boolean reloadServerById(String serverName, int id) {
  514. log.trace("reloadServerById");
  515. return false;
  516. }
  517. public Element listServiceStatusById(String serverName, int id,
  518. String serviceName) {
  519. log.trace("listServiceStatusById");
  520. String command = "status";
  521. Response buf = null;
  522. String status = null;
  523. try {
  524. if (serviceName != null) {
  525. command = command + "," + serviceName + ",";
  526. }
  527. buf = callAdminService(serverName, id, command);
  528. if (buf != null) {
  529. byte[] received = ((X_OCTET) buf.getBuffer()).getByteArray();
  530. if (received[0] == '1') {
  531. status = new String(received, 1, received.length - 1);
  532. log.info("status is " + status);
  533. return stringToElement(status);
  534. }
  535. }
  536. } catch (ConnectionException e) {
  537. log.error("call server " + serverName + " id " + id
  538. + " failed with " + e.getTperrno());
  539. } catch (Exception e) {
  540. log.error("response " + status + " error with " + e);
  541. }
  542. return null;
  543. }
  544. public MBeanServerConnection getBeanServerConnection() {
  545. log.trace("getBeanServerConnection");
  546. return beanServerConnection;
  547. }
  548. public void close() throws ConnectionException, IOException {
  549. log.debug("Closed Administration Proxy");
  550. connection.close();
  551. c.close();
  552. }
  553. public int getQueueDepth(String serverName, String serviceName) {
  554. Integer depth;
  555. try {
  556. ObjectName objName = new ObjectName(
  557. "jboss.messaging.destination:service=Queue,name="
  558. + serviceName);
  559. depth = (Integer) beanServerConnection.getAttribute(objName,
  560. "MessageCount");
  561. } catch (Exception e) {
  562. log.error("getQueueDepth failed with " + e);
  563. return -1;
  564. }
  565. return depth.intValue();
  566. }
  567. public String getServerName(String serviceName) {
  568. return prop.getProperty("blacktie." + serviceName + ".server");
  569. }
  570. public String getServerVersionById(String serverName, int id) {
  571. log.trace("getServerVersionById");
  572. String command = "version";
  573. Response buf = null;
  574. String version = null;
  575. try {
  576. buf = callAdminService(serverName, id, command);
  577. if (buf != null) {
  578. byte[] received = ((X_OCTET) buf.getBuffer()).getByteArray();
  579. if (received[0] == '1') {
  580. version = new String(received, 1, received.length - 1);
  581. log.debug("version is " + version);
  582. }
  583. }
  584. } catch (ConnectionException e) {
  585. log.error("call server " + serverName + " id " + id
  586. + " failed with " + e.getTperrno());
  587. }
  588. return version;
  589. }
  590. }