ActiveMQ中数据表SQL的管理

  在ActiveMQ为了方便的切换数据库,更为了深入了解ActiveMQ中SQL语句的详细的信息,可以通过Statements获取各种SQL语句。在ActivMQ第一次加载的时候,通过Statements生产响应的Spring Bean,加载到内存中。在ActiveMQ的管理和监控的时候,从内容获取相关的SQL语句,简化了ActiveMQ的消息的管理和监控。

 

Java代码   收藏代码
  1. package com.easyway.activemq.proxy;  
  2.   
  3. import java.lang.reflect.InvocationTargetException;  
  4. import java.lang.reflect.Method;  
  5. import java.util.ArrayList;  
  6. import java.util.regex.Pattern;  
  7.   
  8. import org.apache.activemq.store.jdbc.Statements;  
  9.   
  10. /** 
  11.  * 获取ActiveMQ中SQL相关的各种语句 
  12.  * @author longgangbai 
  13.  * 
  14.  */  
  15. public class ActiveMQSQLManager {  
  16.      /** 
  17.       *  
  18.       * @param statement 
  19.       * @return 
  20.       */  
  21.      public static String returnStatement(Object statement){  
  22.             return ((String)statement).replace("<""&lt;").replace(">""&gt;");  
  23.               
  24.         }  
  25.         /** 
  26.          *  
  27.          * @param args 
  28.          */  
  29.         public static void main(String[] args) throws Exception{  
  30.             createSQLForActiveMQ();  
  31.         }  
  32.         /** 
  33.          * 创建ActiveMQ中语句 
  34.          * @throws IllegalAccessException 
  35.          * @throws InvocationTargetException 
  36.          */  
  37.         private static void createSQLForActiveMQ() throws IllegalAccessException, InvocationTargetException {  
  38.             Statements s=new Statements();  
  39.             //设置表的前缀  
  40.             s.setTablePrefix("ACTIVEMQ.");  
  41.             //获取Statements中创建的语句的集合  
  42.             String[] stats=s.getCreateSchemaStatements();  
  43.             //构建Statements的Bean  
  44.             System.out.println("<bean id=\"statements\" class=\"org.apache.activemq.store.jdbc.Statements\">");  
  45.             createSQLForTableIndex(stats);  
  46.               
  47.             createSQLForActiveMQBussine(s);  
  48.             //end of generating because of typo  
  49.             createSQLOfDropTable(s);  
  50.             System.out.println("</bean>");  
  51.         }  
  52.         /** 
  53.          * 创建ActiveMQ监控和管理使用的SQL语句 
  54.          * @param s 
  55.          * @throws IllegalAccessException 
  56.          * @throws InvocationTargetException 
  57.          */  
  58.         private static void createSQLForActiveMQBussine(Statements s) throws IllegalAccessException, InvocationTargetException {  
  59.             //获取Statements的方法  
  60.             Method[] methods=Statements.class.getMethods();  
  61.             //  
  62.             Pattern sPattern= Pattern.compile("get.*Statement$");  
  63.             Pattern setPattern= Pattern.compile("set.*Statement$");  
  64.             //获取存储Set方法  
  65.             ArrayList<String> setMethods=new ArrayList<String>();  
  66.             for(int i=0; i<methods.length;i++){  
  67.                 if(setPattern.matcher(methods[i].getName()).find()){  
  68.                     setMethods.add(methods[i].getName());  
  69.                 }  
  70.             }  
  71.             //  
  72.             for(int i=0; i<methods.length;i++){  
  73.                 if(sPattern.matcher(methods[i].getName()).find()&&setMethods.contains(methods[i].getName().replace("get","set"))){  
  74.                     System.out.println("<property name=\""+methods[i].getName().substring(3,4).toLowerCase()+methods[i].getName().substring(4)+"\" value=\""+returnStatement(methods[i].invoke(s, (Object[])null))+"\" />");  
  75.                 }  
  76.             }  
  77.             //for a typo is not needed if removeMessageStatment typo is corrected  
  78.             //获取get的方法  
  79.             Pattern sPattern2= Pattern.compile("get.*Statment$");  
  80.             for(int i=0; i<methods.length;i++){  
  81.                 if(sPattern2.matcher(methods[i].getName()).find()){  
  82.                     System.out.println("<property name=\""+methods[i].getName().substring(3,4).toLowerCase()+methods[i].getName().substring(4)+"\" value=\""+returnStatement(methods[i].invoke(s, (Object[])null))+"\" />");  
  83.                 }  
  84.             }  
  85.         }  
  86.         /** 
  87.          * 创建表的创建语句和索引语句 
  88.          * @param stats 
  89.          */  
  90.         private static void createSQLForTableIndex(String[] stats) {  
  91.             //获取创建表和索引的时候的Schema语句  
  92.             System.out.println("<property name=\"createSchemaStatements\">");  
  93.             System.out.println("<list>");  
  94.             for(int i=0; i<stats.length;i++){  
  95.                 System.out.println("<value>"+stats[i]+"</value>");  
  96.             }  
  97.             System.out.println("</list>");  
  98.             System.out.println("</property>");  
  99.         }  
  100.         /** 
  101.          * 获取删除语句 
  102.          * @param s 
  103.          */  
  104.         private static void createSQLOfDropTable(Statements s) {  
  105.             //构建删除语句  
  106.             String[] statsDrop=s.getDropSchemaStatements();  
  107.             System.out.println("<property name=\"dropSchemaStatements\">");  
  108.             System.out.println("<list>");  
  109.             for(int i=0; i<statsDrop.length;i++){  
  110.                 System.out.println("<value>"+statsDrop[i]+"</value>");  
  111.             }  
  112.             System.out.println("</list>");  
  113.             System.out.println("</property>");  
  114.         }  
  115. }  

 

 

生成的spring bean如下:

Java代码   收藏代码
  1. <bean id="statements" class="org.apache.activemq.store.jdbc.Statements">  
  2. <property name="createSchemaStatements">  
  3. <list>  
  4. <value>CREATE TABLE ACTIVEMQ.ACTIVEMQ_MSGS(ID BIGINT NOT NULL, CONTAINER VARCHAR(250), MSGID_PROD VARCHAR(250), MSGID_SEQ BIGINT, EXPIRATION BIGINT, MSG BLOB, PRIMARY KEY ( ID ) )</value>  
  5. <value>CREATE INDEX ACTIVEMQ.ACTIVEMQ_MSGS_MIDX ON ACTIVEMQ.ACTIVEMQ_MSGS (MSGID_PROD,MSGID_SEQ)</value>  
  6. <value>CREATE INDEX ACTIVEMQ.ACTIVEMQ_MSGS_CIDX ON ACTIVEMQ.ACTIVEMQ_MSGS (CONTAINER)</value>  
  7. <value>CREATE INDEX ACTIVEMQ.ACTIVEMQ_MSGS_EIDX ON ACTIVEMQ.ACTIVEMQ_MSGS (EXPIRATION)</value>  
  8. <value>CREATE TABLE ACTIVEMQ.ACTIVEMQ_ACKS(CONTAINER VARCHAR(250) NOT NULL, SUB_DEST VARCHAR(250), CLIENT_ID VARCHAR(250) NOT NULL, SUB_NAME VARCHAR(250) NOT NULL, SELECTOR VARCHAR(250), LAST_ACKED_ID BIGINT, PRIMARY KEY ( CONTAINER, CLIENT_ID, SUB_NAME))</value>  
  9. <value>CREATE TABLE ACTIVEMQ.ACTIVEMQ_LOCK( ID BIGINT NOT NULL, TIME BIGINT, BROKER_NAME VARCHAR(250), PRIMARY KEY (ID) )</value>  
  10. <value>INSERT INTO ACTIVEMQ.ACTIVEMQ_LOCK(ID) VALUES (1)</value>  
  11. <value>ALTER TABLE ACTIVEMQ.ACTIVEMQ_MSGS ADD PRIORITY BIGINT</value>  
  12. <value>CREATE INDEX ACTIVEMQ.ACTIVEMQ_MSGS_PIDX ON ACTIVEMQ.ACTIVEMQ_MSGS (PRIORITY)</value>  
  13. <value>ALTER TABLE ACTIVEMQ.ACTIVEMQ_ACKS ADD PRIORITY BIGINT DEFAULT 5 NOT NULL</value>  
  14. <value>ALTER TABLE ACTIVEMQ.ACTIVEMQ_ACKS DROP PRIMARY KEY</value>  
  15. <value>ALTER TABLE ACTIVEMQ.ACTIVEMQ_ACKS ADD PRIMARY KEY (CONTAINER, CLIENT_ID, SUB_NAME, PRIORITY)</value>  
  16. </list>  
  17. </property>  
  18. <property name="addMessageStatement" value="INSERT INTO ACTIVEMQ.ACTIVEMQ_MSGS(ID, MSGID_PROD, MSGID_SEQ, CONTAINER, EXPIRATION, PRIORITY, MSG) VALUES (?, ?, ?, ?, ?, ?, ?)" />  
  19. <property name="updateMessageStatement" value="UPDATE ACTIVEMQ.ACTIVEMQ_MSGS SET MSG=? WHERE ID=?" />  
  20. <property name="findMessageSequenceIdStatement" value="SELECT ID, PRIORITY FROM ACTIVEMQ.ACTIVEMQ_MSGS WHERE MSGID_PROD=? AND MSGID_SEQ=? AND CONTAINER=?" />  
  21. <property name="findMessageStatement" value="SELECT MSG FROM ACTIVEMQ.ACTIVEMQ_MSGS WHERE MSGID_PROD=? AND MSGID_SEQ=?" />  
  22. <property name="findMessageByIdStatement" value="SELECT MSG FROM ACTIVEMQ.ACTIVEMQ_MSGS WHERE ID=?" />  
  23. <property name="findAllMessagesStatement" value="SELECT ID, MSG FROM ACTIVEMQ.ACTIVEMQ_MSGS WHERE CONTAINER=? ORDER BY ID" />  
  24. <property name="findLastSequenceIdInMsgsStatement" value="SELECT MAX(ID) FROM ACTIVEMQ.ACTIVEMQ_MSGS" />  
  25. <property name="lastProducerSequenceIdStatement" value="SELECT MAX(MSGID_SEQ) FROM ACTIVEMQ.ACTIVEMQ_MSGS WHERE MSGID_PROD=?" />  
  26. <property name="findLastSequenceIdInAcksStatement" value="SELECT MAX(LAST_ACKED_ID) FROM ACTIVEMQ.ACTIVEMQ_ACKS" />  
  27. <property name="createDurableSubStatement" value="INSERT INTO ACTIVEMQ.ACTIVEMQ_ACKS(CONTAINER, CLIENT_ID, SUB_NAME, SELECTOR, LAST_ACKED_ID, SUB_DEST, PRIORITY) VALUES (?, ?, ?, ?, ?, ?, ?)" />  
  28. <property name="findDurableSubStatement" value="SELECT SELECTOR, SUB_DEST FROM ACTIVEMQ.ACTIVEMQ_ACKS WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=?" />  
  29. <property name="findAllDurableSubsStatement" value="SELECT SELECTOR, SUB_NAME, CLIENT_ID, SUB_DEST FROM ACTIVEMQ.ACTIVEMQ_ACKS WHERE CONTAINER=? AND PRIORITY=0" />  
  30. <property name="updateLastPriorityAckRowOfDurableSubStatement" value="UPDATE ACTIVEMQ.ACTIVEMQ_ACKS SET LAST_ACKED_ID=? WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=? AND PRIORITY=?" />  
  31. <property name="deleteSubscriptionStatement" value="DELETE FROM ACTIVEMQ.ACTIVEMQ_ACKS WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=?" />  
  32. <property name="findAllDurableSubMessagesStatement" value="SELECT M.ID, M.MSG FROM ACTIVEMQ.ACTIVEMQ_MSGS M, ACTIVEMQ.ACTIVEMQ_ACKS D  WHERE D.CONTAINER=? AND D.CLIENT_ID=? AND D.SUB_NAME=? AND M.CONTAINER=D.CONTAINER AND M.ID &gt; D.LAST_ACKED_ID ORDER BY M.PRIORITY DESC, M.ID" />  
  33. <property name="findDurableSubMessagesStatement" value="SELECT M.ID, M.MSG FROM ACTIVEMQ.ACTIVEMQ_MSGS M, ACTIVEMQ.ACTIVEMQ_ACKS D  WHERE D.CONTAINER=? AND D.CLIENT_ID=? AND D.SUB_NAME=? AND M.CONTAINER=D.CONTAINER AND M.ID &gt; D.LAST_ACKED_ID AND M.ID &gt; ? ORDER BY M.ID" />  
  34. <property name="nextDurableSubscriberMessageStatement" value="SELECT M.ID, M.MSG FROM ACTIVEMQ.ACTIVEMQ_MSGS M, ACTIVEMQ.ACTIVEMQ_ACKS D  WHERE D.CONTAINER=? AND D.CLIENT_ID=? AND D.SUB_NAME=? AND M.CONTAINER=D.CONTAINER AND M.ID &gt; ? ORDER BY M.ID " />  
  35. <property name="durableSubscriberMessageCountStatement" value="SELECT COUNT(*) FROM ACTIVEMQ.ACTIVEMQ_MSGS M, ACTIVEMQ.ACTIVEMQ_ACKS D  WHERE D.CONTAINER=? AND D.CLIENT_ID=? AND D.SUB_NAME=? AND M.CONTAINER=D.CONTAINER      AND M.ID &gt;          ( SELECT LAST_ACKED_ID FROM ACTIVEMQ.ACTIVEMQ_ACKS           WHERE CONTAINER=D.CONTAINER AND CLIENT_ID=D.CLIENT_ID           AND SUB_NAME=D.SUB_NAME )" />  
  36. <property name="findAllDestinationsStatement" value="SELECT DISTINCT CONTAINER FROM ACTIVEMQ.ACTIVEMQ_ACKS" />  
  37. <property name="removeAllMessagesStatement" value="DELETE FROM ACTIVEMQ.ACTIVEMQ_MSGS WHERE CONTAINER=?" />  
  38. <property name="removeAllSubscriptionsStatement" value="DELETE FROM ACTIVEMQ.ACTIVEMQ_ACKS WHERE CONTAINER=?" />  
  39. <property name="deleteOldMessagesStatement" value="DELETE FROM ACTIVEMQ.ACTIVEMQ_MSGS WHERE ( EXPIRATION&lt;&gt;0 AND EXPIRATION&lt;?) OR (ID &lt;=      ( SELECT min(ACTIVEMQ.ACTIVEMQ_ACKS.LAST_ACKED_ID)       FROM ACTIVEMQ.ACTIVEMQ_ACKS WHERE ACTIVEMQ.ACTIVEMQ_ACKS.CONTAINER=ACTIVEMQ.ACTIVEMQ_MSGS.CONTAINER )   )" />  
  40. <property name="lockCreateStatement" value="SELECT * FROM ACTIVEMQ.ACTIVEMQ_LOCK FOR UPDATE" />  
  41. <property name="lockUpdateStatement" value="UPDATE ACTIVEMQ.ACTIVEMQ_LOCK SET TIME = ? WHERE ID = 1" />  
  42. <property name="destinationMessageCountStatement" value="SELECT COUNT(*) FROM ACTIVEMQ.ACTIVEMQ_MSGS WHERE CONTAINER=?" />  
  43. <property name="findNextMessagesStatement" value="SELECT ID, MSG FROM ACTIVEMQ.ACTIVEMQ_MSGS WHERE CONTAINER=? AND ID &gt; ? ORDER BY ID" />  
  44. <property name="lastAckedDurableSubscriberMessageStatement" value="SELECT MAX(LAST_ACKED_ID) FROM ACTIVEMQ.ACTIVEMQ_ACKS WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=?" />  
  45. <property name="selectDurablePriorityAckStatement" value="SELECT LAST_ACKED_ID FROM ACTIVEMQ.ACTIVEMQ_ACKS WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=? AND PRIORITY = ?" />  
  46. <property name="insertDurablePriorityAckStatement" value="INSERT INTO ACTIVEMQ.ACTIVEMQ_ACKS(CONTAINER, CLIENT_ID, SUB_NAME, PRIORITY) VALUES (?, ?, ?, ?)" />  
  47. <property name="updateDurableLastAckStatement" value="UPDATE ACTIVEMQ.ACTIVEMQ_ACKS SET LAST_ACKED_ID = ? WHERE CONTAINER=? AND CLIENT_ID=? AND SUB_NAME=?" />  
  48. <property name="dropSchemaStatements">  
  49. <list>  
  50. <value>DROP TABLE ACTIVEMQ.ACTIVEMQ_ACKS</value>  
  51. <value>DROP TABLE ACTIVEMQ.ACTIVEMQ_MSGS</value>  
  52. <value>DROP TABLE ACTIVEMQ.ACTIVEMQ_LOCK</value>  
  53. </list>  
  54. </property>  
  55. </bean>  

你可能感兴趣的:(ActiveMQ中数据表SQL的管理)