Explorar o código

Merge branch 'feature-b2b-mysql' into dev

# Conflicts:
#	mall-search/src/main/java/com/uas/search/util/ObjectToDocumentUtils.java
sunyj %!s(int64=8) %!d(string=hai) anos
pai
achega
8ea9dca06d
Modificáronse 44 ficheiros con 3666 adicións e 1620 borrados
  1. 0 4
      mall-search/pom.xml
  2. 0 12
      pom.xml
  3. 52 0
      search-common/src/main/java/com/uas/search/util/CodeGenerator.java
  4. 2217 0
      search-console-b2b/init-b2b.sql
  5. 62 0
      search-console-b2b/init-platformmanager.sql
  6. 4 15
      search-console-b2b/pom.xml
  7. 9 24
      search-console-b2b/src/main/java/com/uas/search/console/b2b/Application.java
  8. 0 26
      search-console-b2b/src/main/java/com/uas/search/console/b2b/CacheConfiguration.java
  9. 4 1
      search-console-b2b/src/main/java/com/uas/search/console/b2b/DruidDBConfiguration.java
  10. 2 2
      search-console-b2b/src/main/java/com/uas/search/console/b2b/Platformb2bRepositoryConfiguration.java
  11. 2 2
      search-console-b2b/src/main/java/com/uas/search/console/b2b/PlatformmanagerRepositoryConfiguration.java
  12. 27 19
      search-console-b2b/src/main/java/com/uas/search/console/b2b/controller/IndexController.java
  13. 0 281
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/AQListener.java
  14. 269 0
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/JmsListener.java
  15. 22 0
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneMessageDaoInterface.java
  16. 42 0
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneMessageInterface.java
  17. 30 0
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneMessageService.java
  18. 91 0
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneMessageServiceImpl.java
  19. 0 111
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneQueueMessage.java
  20. 0 202
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneQueueMessageDao.java
  21. 92 0
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/ParsedQueueMessage.java
  22. 51 107
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/QueueMessageParser.java
  23. 0 58
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/QueueMessageTypeFactory.java
  24. 155 0
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/platformb2b/LuceneMessage.java
  25. 47 0
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/platformb2b/LuceneMessageDao.java
  26. 155 0
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/platformmanager/LuceneMessage.java
  27. 47 0
      search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/platformmanager/LuceneMessageDao.java
  28. 0 86
      search-console-b2b/src/main/java/com/uas/search/console/b2b/model/ParsedQueueMessage.java
  29. 2 8
      search-console-b2b/src/main/java/com/uas/search/console/b2b/model/PurcProofingapprovalSimpleInfo.java
  30. 4 4
      search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/model/DailyTaskInformation.java
  31. 100 39
      search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/model/TaskInformation.java
  32. 17 2
      search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/service/TaskService.java
  33. 57 24
      search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/service/impl/TaskServiceImpl.java
  34. 26 57
      search-console-b2b/src/main/java/com/uas/search/console/b2b/service/IndexService.java
  35. 38 89
      search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/IndexServiceImpl.java
  36. 18 30
      search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/UpdateVirtualColumnServiceImpl.java
  37. 0 112
      search-console-b2b/src/main/java/com/uas/search/console/b2b/support/RealTimeUpdateMonitor.java
  38. 6 6
      search-console-b2b/src/main/java/com/uas/search/console/b2b/util/ObjectToDocumentUtils.java
  39. 0 6
      search-console-b2b/src/main/resources/application.yml
  40. 6 5
      search-console-b2b/src/main/resources/config/application-dev.properties
  41. 6 5
      search-console-b2b/src/main/resources/config/application-prod.properties
  42. 6 5
      search-console-b2b/src/main/resources/config/application-test.properties
  43. 0 8
      search-console-b2b/src/main/resources/spring/ehcache.xml
  44. 0 270
      search-console-b2b/src/main/resources/spring/ehcache.xsd

+ 0 - 4
mall-search/pom.xml

@@ -64,10 +64,6 @@
 			<groupId>com.alibaba</groupId>
 			<artifactId>druid</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-ehcache</artifactId>
-		</dependency>
 		<dependency>
 			<groupId>org.hibernate</groupId>
 			<artifactId>hibernate-entitymanager</artifactId>

+ 0 - 12
pom.xml

@@ -55,9 +55,7 @@
 		<fastjson.version>1.2.15</fastjson.version>
 		<zkclient.version>0.1</zkclient.version>
 		<druid.version>1.0.24</druid.version>
-		<hibernate.ehcache.version>4.3.7.Final</hibernate.ehcache.version>
 		<oracle.jdbc.version>11.2.0</oracle.jdbc.version>
-		<jms.version>1.1</jms.version>
 		<lucene.version>5.2.0</lucene.version>
 		<ikanalyzer.version>2012_v5</ikanalyzer.version>
 	</properties>
@@ -120,16 +118,6 @@
 				<artifactId>druid</artifactId>
 				<version>${druid.version}</version>
 			</dependency>
-			<dependency>
-				<groupId>org.hibernate</groupId>
-				<artifactId>hibernate-ehcache</artifactId>
-				<version>${hibernate.ehcache.version}</version>
-			</dependency>
-			<dependency>
-				<groupId>javax.jms</groupId>
-				<artifactId>jms</artifactId>
-				<version>${jms.version}</version>
-			</dependency>
 
 			<!-- lucene -->
 			<dependency>

+ 52 - 0
search-common/src/main/java/com/uas/search/util/CodeGenerator.java

@@ -0,0 +1,52 @@
+package com.uas.search.util;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 生成唯一 code
+ *
+ * @author sunyj
+ * @since 2017年8月22日 上午11:34:44
+ */
+public class CodeGenerator {
+
+    private final static int MAX_OFFSET = 16 * 16 - 16;
+    /**
+     * 生成 code 时的偏移量
+     */
+    private static int offset = 0;
+    private static CodeGenerator generator;
+
+    private CodeGenerator() {
+    }
+
+    public static CodeGenerator getGenerator() {
+        if (generator == null) {
+            synchronized (CodeGenerator.class) {
+                if (generator == null) {
+                    generator = new CodeGenerator();
+                }
+            }
+        }
+        return generator;
+    }
+
+    /**
+     * 生成唯一 code (一秒内不超过 {@link CodeGenerator#MAX_OFFSET} 个,超过则不唯一)
+     */
+    public synchronized String generate() {
+        // 偏移量,不超过 MAX_OFFSET 个
+        offset = (offset + 1) % MAX_OFFSET + 16;
+        // 当前毫秒数
+        long now = new Date().getTime();
+        // 起始时间 2017-01-01 00:00:00:000
+        Calendar startCalendar = Calendar.getInstance();
+        startCalendar.set(2017, 0, 1, 0, 0, 0);
+        startCalendar.set(Calendar.MILLISECOND, 0);
+        // 偏移量加16,保证得到的是两位16进制字符
+        String hex = Long.toHexString(now - startCalendar.getTimeInMillis()) + Integer.toHexString(offset);
+        // 最后反转并转为大写
+        return hex.toUpperCase();
+    }
+}

+ 2217 - 0
search-console-b2b/init-b2b.sql

@@ -0,0 +1,2217 @@
+-- 创建消息表
+drop table if exists lucene$message;
+create table lucene$message(
+    me_id bigint not null primary key auto_increment,
+    me_table_name varchar(64) not null,
+    me_method_type varchar(6) not null,
+    me_data_id int not null,
+    me_data text,
+    me_priority int default 0,
+    me_retry_count int default 0,
+    me_create_time datetime not null
+);
+
+-- 创建消息历史表
+drop table if exists lucene$message_history;
+create table lucene$message_history(
+    mh_id bigint not null primary key auto_increment,
+    mh_dequeue_time datetime not null,
+    me_id bigint not null,
+    me_table_name varchar(64) not null,
+    me_method_type varchar(6) not null,
+    me_data_id int not null,
+    me_data text,
+    me_priority int default 0,
+    me_create_time datetime not null
+);
+
+-- 创建存储过程 入队消息
+drop procedure if exists enqueue_lucene_message;
+delimiter $$
+create procedure enqueue_lucene_message(in v_table_name varchar(64), v_method_type varchar(6), v_data_id int, v_data text, v_priority int)
+begin
+	insert into lucene$message (me_table_name, me_method_type, me_data_id, me_data, me_priority, me_create_time) values(v_table_name, v_method_type, v_data_id, v_data, v_priority, sysdate());
+end;$$
+delimiter ;
+
+-- 创建存储过程 出队消息
+drop procedure if exists dequeue_lucene_message;
+delimiter $$
+create procedure dequeue_lucene_message(in v_id bigint)
+begin
+	insert into lucene$message_history (mh_dequeue_time, me_id, me_table_name, me_method_type, me_data_id, me_data, me_priority, me_create_time) select sysdate(), me_id, me_table_name, me_method_type, me_data_id, me_data, me_priority, me_create_time from lucene$message where me_id = v_id;
+	delete from lucene$message where me_id = v_id;
+end;$$
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$CHANGES
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_changes_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_changes_i` AFTER INSERT ON `PURC$CHANGES` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'PURC$CHANGES';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.pc_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$CHANGES
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_changes_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_changes_u` AFTER UPDATE ON `PURC$CHANGES` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'PURC$CHANGES';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pc_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$changes
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_changes_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_changes_d` AFTER DELETE ON `purc$changes` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$changes';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pc_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$forecast
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_forecast_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_forecast_i` AFTER INSERT ON `purc$forecast` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$forecast';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.pf_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$forecast
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_forecast_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_forecast_u` AFTER UPDATE ON `purc$forecast` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$forecast';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pf_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$forecast
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_forecast_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_forecast_d` AFTER DELETE ON `purc$forecast` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$forecast';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pf_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority); 
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$mrb
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_mrb_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_mrb_i` AFTER INSERT ON `purc$mrb` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$mrb';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.pm_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$mrb
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_mrb_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_mrb_u` AFTER UPDATE ON `purc$mrb` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$mrb';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pm_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$mrb
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_mrb_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_mrb_d` AFTER DELETE ON `purc$mrb` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$mrb';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pm_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$notice
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_notice_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_notice_i` AFTER INSERT ON `purc$notice` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$notice';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.pn_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$notice
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_notice_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_notice_u` AFTER UPDATE ON `purc$notice` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$notice';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pn_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$notice
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_notice_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_notice_d` AFTER DELETE ON `purc$notice` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$notice';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pn_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$orders
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_orders_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_orders_i` AFTER INSERT ON `purc$orders` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$orders';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.pu_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$orders
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_orders_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_orders_u` AFTER UPDATE ON `purc$orders` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$orders';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pu_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$orders
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_orders_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_orders_d` AFTER DELETE ON `purc$orders` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$orders';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pu_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$proofingapproval
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_proofingapproval_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_proofingapproval_i` AFTER INSERT ON `purc$proofingapproval` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$proofingapproval';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.psa_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$proofingapproval
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_proofingapproval_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_proofingapproval_u` AFTER UPDATE ON `purc$proofingapproval` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$proofingapproval';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.psa_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$proofingapproval
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_proofingapproval_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_proofingapproval_d` AFTER DELETE ON `purc$proofingapproval` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$proofingapproval';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.psa_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$proofingsend
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_proofingsend_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_proofingsend_i` AFTER INSERT ON `purc$proofingsend` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$proofingsend';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.pps_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$proofingsend
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_proofingsend_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_proofingsend_u` AFTER UPDATE ON `purc$proofingsend` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$proofingsend';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pps_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$proofingsend
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_proofingsend_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_proofingsend_d` AFTER DELETE ON `purc$proofingsend` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$proofingsend';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pps_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$return
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_return_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_return_i` AFTER INSERT ON `purc$return` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$return';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.pr_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$return
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_return_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_return_u` AFTER UPDATE ON `purc$return` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$return';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pr_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$return
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_return_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_return_d` AFTER DELETE ON `purc$return` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$return';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pr_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+-- ----------------------------
+-- Triggers structure for table purc$tender
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_tender_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_tender_i` AFTER INSERT ON `purc$tender` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$tender';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.pt_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$tender
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_tender_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_tender_u` AFTER UPDATE ON `purc$tender` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$tender';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pt_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$tender
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_tender_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_tender_d` AFTER DELETE ON `purc$tender` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$tender';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.pt_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$vendors
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_vendors_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_vendors_i` AFTER INSERT ON `purc$vendors` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$vendors';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.ve_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$vendors
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_vendors_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_vendors_u` AFTER UPDATE ON `purc$vendors` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$vendors';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.ve_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$vendors
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_vendors_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_vendors_d` AFTER DELETE ON `purc$vendors` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$vendors';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.ve_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$vendors_cust
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_vendors_cust_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_vendors_cust_i` AFTER INSERT ON `purc$vendors` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$vendors_cust';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.ve_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$vendors_cust
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_vendors_cust_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_vendors_cust_u` AFTER UPDATE ON `purc$vendors` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$vendors_cust';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.ve_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$vendors_cust
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_vendors_cust_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_vendors_cust_d` AFTER DELETE ON `purc$vendors` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$vendors_cust';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.ve_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+
+-- ----------------------------
+-- Triggers structure for table sale$archeck
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_archeck_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_archeck_i` AFTER INSERT ON `sale$archeck` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$archeck';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.sac_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table SALE$ARCHECK
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_archeck_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_archeck_u` AFTER UPDATE ON `sale$archeck` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$archeck';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.sac_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table SALE$ARCHECK
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_archeck_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_archeck_d` AFTER DELETE ON `sale$archeck` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$archeck';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.sac_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+-- ----------------------------
+-- Triggers structure for table sale$quotation
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_quotation_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_quotation_i` AFTER INSERT ON `sale$quotation` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$quotation';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.qu_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$quotation
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_quotation_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_quotation_u` AFTER UPDATE ON `sale$quotation` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$quotation';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.qu_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$quotation
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_quotation_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_quotation_d` AFTER DELETE ON `sale$quotation` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$quotation';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.qu_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$send
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_send_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_send_i` AFTER INSERT ON `sale$send` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$send';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.ss_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$send
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_send_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_send_u` AFTER UPDATE ON `sale$send` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$send';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.ss_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$send
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_send_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_send_d` AFTER DELETE ON `sale$send` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$send';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.ss_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$tender
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_tender_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_tender_i` AFTER INSERT ON `sale$tender` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$tender';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.st_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$tender
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_tender_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_tender_u` AFTER UPDATE ON `sale$tender` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$tender';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.st_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$tender
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_tender_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_tender_d` AFTER DELETE ON `sale$tender` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$tender';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.st_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$tender_b2b
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_tender_b2b_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_tender_b2b_i` AFTER INSERT ON `sale$tender` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$tender_b2b';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.st_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$tender_b2b
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_tender_b2b_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_tender_b2b_u` AFTER UPDATE ON `sale$tender` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$tender_b2b';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.st_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$tender_b2b
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_sale_tender_b2b_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_sale_tender_b2b_d` AFTER DELETE ON `sale$tender` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'sale$tender_b2b';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.st_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+
+-- ----------------------------
+-- Triggers structure for table purc$proofingitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_proofingitems_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_proofingitems_i` AFTER INSERT ON `purc$proofingitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$proofingitems';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.ppi_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$proofingitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_proofingitems_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_proofingitems_u` AFTER UPDATE ON `purc$proofingitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$proofingitems';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.ppi_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$proofingitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_proofingitems_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_proofingitems_d` AFTER DELETE ON `purc$proofingitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$proofingitems';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.ppi_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table invitationrecords
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_invitationrecords_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_invitationrecords_i` AFTER INSERT ON `invitationrecords` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'invitationrecords';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table invitationrecords
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_invitationrecords_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_invitationrecords_u` AFTER UPDATE ON `invitationrecords` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'invitationrecords';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table invitationrecords
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_invitationrecords_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_invitationrecords_d` AFTER DELETE ON `invitationrecords` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'invitationrecords';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table public$inquiryitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_public_inquiryitems_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_public_inquiryitems_i` AFTER INSERT ON `public$inquiryitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'public$inquiryitems';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.id_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table public$inquiryitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_public_inquiryitems_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_public_inquiryitems_u` AFTER UPDATE ON `public$inquiryitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'public$inquiryitems';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.id_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table public$inquiryitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_public_inquiryitems_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_public_inquiryitems_d` AFTER DELETE ON `public$inquiryitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'public$inquiryitems';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.id_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$puinquiry
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_inquiry_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_inquiry_i` AFTER INSERT ON `purc$puinquiry` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$puinquiry';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$puinquiry
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_inquiry_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_inquiry_u` AFTER UPDATE ON `purc$puinquiry` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$puinquiry';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$puinquiry
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_inquiry_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_inquiry_d` AFTER DELETE ON `purc$puinquiry` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$puinquiry';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$puinquiryitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_puinquiryitems_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_puinquiryitems_i` AFTER INSERT ON `purc$puinquiryitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$puinquiryitems';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.id_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$puinquiryitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_puinquiryitems_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_puinquiryitems_u` AFTER UPDATE ON `purc$puinquiryitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$puinquiryitems';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.id_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$puinquiryitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_puinquiryitems_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_puinquiryitems_d` AFTER DELETE ON `purc$puinquiryitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$puinquiryitems';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.id_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$inquiryitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_inquiryitems_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_inquiryitems_i` AFTER INSERT ON `purc$inquiryitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$inquiryitems';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.id_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$inquiryitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_inquiryitems_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_inquiryitems_u` AFTER UPDATE ON `purc$inquiryitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$inquiryitems';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.id_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$inquiryitems
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_inquiryitems_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_inquiryitems_d` AFTER DELETE ON `purc$inquiryitems` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$inquiryitems';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.id_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$inquirymould
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_inquirymould_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_inquirymould_i` AFTER INSERT ON `purc$inquirymould` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$inquirymould';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.im_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$inquirymould
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_inquirymould_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_inquirymould_u` AFTER UPDATE ON `purc$inquirymould` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$inquirymould';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.im_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$inquirymould
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_purc_inquirymould_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_purc_inquirymould_d` AFTER DELETE ON `purc$inquirymould` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'purc$inquirymould';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.im_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table invitationrecords
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_invitationrecords_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_invitationrecords_i` AFTER INSERT ON `invitationrecords` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'invitationrecords';
+    declare v_method_type varchar(6) default 'insert';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=new.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table invitationrecords
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_invitationrecords_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_invitationrecords_u` AFTER UPDATE ON `invitationrecords` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'invitationrecords';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table invitationrecords
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_invitationrecords_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_invitationrecords_d` AFTER DELETE ON `invitationrecords` FOR EACH ROW begin
+	declare v_table_name varchar(64) default 'invitationrecords';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 0;
+    
+    set v_data_id=old.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+
+-- ---hyy---------------------
+-- ----------------------------
+-- Triggers structure for table sale$tenderquestion
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_tenderquestion_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_tenderquestion_i` AFTER INSERT ON `sale$tenderquestion` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'sale$tenderquestion';
+    declare v_method_type varchar(6) default 'delete';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.stq_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$tenderquestion
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_tenderquestion_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_tenderquestion_u` AFTER UPDATE ON `sale$tenderquestion` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'sale$tenderquestion';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.stq_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$tenderquestion
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_tenderquestion_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_tenderquestion_d` AFTER DELETE ON `sale$tenderquestion` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'sale$tenderquestion';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.stq_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table sale$tenderquestion
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_tenderquestion_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_tenderquestion_d` AFTER DELETE ON `sale$tenderquestion` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'sale$tenderquestion';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.stq_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$DEPUTYORDERS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_DEPUTYORDERS_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_DEPUTYORDERS_i` AFTER INSERT ON `PURC$DEPUTYORDERS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$deputyorders';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.deo_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$DEPUTYORDERS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_DEPUTYORDERS_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_DEPUTYORDERS_u` AFTER update ON `PURC$DEPUTYORDERS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$deputyorders';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.deo_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$DEPUTYORDERS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_DEPUTYORDERS_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_DEPUTYORDERS_d` AFTER DELETE ON `PURC$DEPUTYORDERS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$deputyorders';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.deo_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$puinquiry
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_puinquiry_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_puinquiry_d` AFTER DELETE ON `purc$puinquiry` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$puinquiry';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$puinquiry
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_puinquiry_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_puinquiry_u` AFTER update ON `purc$puinquiry` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$puinquiry';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table purc$puinquiry
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_puinquiry_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_puinquiry_i` AFTER INSERT ON `purc$puinquiry` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$puinquiry';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.in_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$ACCEPT
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_ACCEPT_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_ACCEPT_i` AFTER INSERT ON `MAKE$ACCEPT` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$ACCEPT';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.ma_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$ACCEPT
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_ACCEPT_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_ACCEPT_u` AFTER UPDATE ON `MAKE$ACCEPT` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$ACCEPT';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.ma_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$ACCEPT
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_ACCEPT_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_ACCEPT_d` AFTER DELETE ON `MAKE$ACCEPT` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$ACCEPT';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.ma_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$ORDERS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_ORDERS_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_ORDERS_d` AFTER DELETE ON `MAKE$ORDERS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$ORDERS';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.ma_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$ORDERS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_ORDERS_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_ORDERS_u` AFTER UPDATE ON `MAKE$ORDERS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$ORDERS';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.ma_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$ORDERS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_ORDERS_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_ORDERS_i` AFTER INSERT ON `MAKE$ORDERS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$ORDERS';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.ma_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$RETURN
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_RETURN_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_RETURN_i` AFTER INSERT ON `MAKE$RETURN` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$RETURN';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.mr_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$RETURN
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_RETURN_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_RETURN_u` AFTER UPDATE ON `MAKE$RETURN` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$RETURN';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.mr_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$RETURN
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_RETURN_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_RETURN_d` AFTER DELETE ON `MAKE$RETURN` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$RETURN';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.mr_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$CHANGEITEMS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_CHANGEITEMS_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_CHANGEITEMS_d` AFTER DELETE ON `MAKE$CHANGEITEMS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$CHANGEITEMS';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.mcd_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$CHANGEITEMS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_CHANGEITEMS_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_CHANGEITEMS_u` AFTER UPDATE ON `MAKE$CHANGEITEMS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$CHANGEITEMS';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.mcd_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table MAKE$CHANGEITEMS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_CHANGEITEMS_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_CHANGEITEMS_i` AFTER INSERT ON `MAKE$CHANGEITEMS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'MAKE$CHANGEITEMS';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.mcd_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$PAGINGRELEASEDETAIL
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_PAGINGRELEASEDETAIL_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_PAGINGRELEASEDETAIL_i` AFTER INSERT ON `PURC$PAGINGRELEASEDETAIL` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PURC$PAGINGRELEASEDETAIL';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.prd_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$PAGINGRELEASEDETAIL
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_PAGINGRELEASEDETAIL_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_PAGINGRELEASEDETAIL_u` AFTER UPDATE ON `PURC$PAGINGRELEASEDETAIL` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PURC$PAGINGRELEASEDETAIL';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.prd_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$PAGINGRELEASEDETAIL
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_PAGINGRELEASEDETAIL_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_PAGINGRELEASEDETAIL_d` AFTER DELETE ON `PURC$PAGINGRELEASEDETAIL` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PURC$PAGINGRELEASEDETAIL';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.prd_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PRODUCT$USERS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_USERS_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_USERS_d` AFTER DELETE ON `PRODUCT$USERS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PRODUCT$USERS';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pu_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PRODUCT$USERS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_USERS_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_USERS_u` AFTER UPDATE ON `PRODUCT$USERS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PRODUCT$USERS';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pu_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PRODUCT$USERS
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_USERS_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_USERS_i` AFTER INSERT ON `PRODUCT$USERS` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PRODUCT$USERS';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.pu_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table products
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_products_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_products_i` AFTER INSERT ON `products` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'v$products';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.pr_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table products
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_products_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_products_u` AFTER UPDATE ON `products` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'v$products';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pr_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table products
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_products_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_products_d` AFTER DELETE ON `products` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'v$products';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pr_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$ACCEPT
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_ACCEPT_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_ACCEPT_u` AFTER UPDATE ON `PURC$ACCEPT` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PURC$ACCEPT';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pa_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$ACCEPT
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_ACCEPT_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_ACCEPT_d` AFTER DELETE ON `PURC$ACCEPT` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PURC$ACCEPT';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pa_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$ACCEPT
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_ACCEPT_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_ACCEPT_i` AFTER INSERT ON `PURC$ACCEPT` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PURC$ACCEPT';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.pa_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$APBILL
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_APBILL_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_APBILL_i` AFTER INSERT ON `PURC$APBILL` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PURC$APBILL';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.pab_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$APBILL
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_APBILL_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_APBILL_u` AFTER UPDATE ON `PURC$APBILL` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PURC$APBILL';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pab_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$APBILL
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_APBILL_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_APBILL_d` AFTER DELETE ON `PURC$APBILL` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'PURC$APBILL';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pab_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$APCHECK
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_APCHECK_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_APCHECK_d` AFTER DELETE ON `PURC$APCHECK` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$apcheck';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pa_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$APCHECK
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_APCHECK_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_APCHECK_u` AFTER update ON `PURC$APCHECK` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$apcheck';
+    declare v_method_type varchar(6) default 'update';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pa_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$APCHECK
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_APCHECK_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_APCHECK_i` AFTER INSERT ON `PURC$APCHECK` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$apcheck';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.pa_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$BADIN
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_BADIN_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_BADIN_i` AFTER INSERT ON `PURC$BADIN` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$badin';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.pb_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$BADIN
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_BADIN_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_BADIN_u` AFTER UPDATE ON `PURC$BADIN` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$badin';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pb_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$BADIN
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_BADIN_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_BADIN_d` AFTER DELETE ON `PURC$BADIN` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$badin';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.pb_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$BADOUT
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_BADOUT_d`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_BADOUT_d` AFTER DELETE ON `PURC$BADOUT` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$badout';
+    declare v_method_type varchar(6) default 'DELETE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.po_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$BADOUT
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_BADOUT_u`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_BADOUT_u` AFTER UPDATE ON `PURC$BADOUT` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$badout';
+    declare v_method_type varchar(6) default 'UPDATE';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=old.po_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;
+
+-- ----------------------------
+-- Triggers structure for table PURC$BADOUT
+-- ----------------------------
+DROP TRIGGER IF EXISTS `lucene_BADOUT_i`;
+delimiter ;;
+CREATE DEFINER = `root`@`%` TRIGGER `lucene_BADOUT_i` AFTER INSERT ON `PURC$BADOUT` FOR EACH ROW 
+begin	
+    declare v_table_name varchar(64) default 'purc$badout';
+    declare v_method_type varchar(6) default 'INSERT';
+    declare v_data_id int;
+    declare v_data text default null;
+    declare v_priority int default 1;
+    
+    set v_data_id=new.po_id;
+    call enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end
+;;
+delimiter ;

+ 62 - 0
search-console-b2b/init-platformmanager.sql

@@ -0,0 +1,62 @@
+-- 创建消息表
+drop table lucene$message;
+create table lucene$message(
+    me_id number generated always as identity(start with 1 increment by 1) primary key,
+    me_table_name varchar(64) not null,
+    me_method_type varchar(6) not null,
+    me_data_id number not null,
+    me_data varchar(1024),
+    me_priority number(2) default 0,
+    me_retry_count number(1) default 0,
+    me_create_time date not null
+);
+
+-- 创建消息历史表
+drop table lucene$message_history;
+create table lucene$message_history(
+    mh_id number generated always as identity(start with 1 increment by 1) primary key,
+    mh_dequeue_time date not null,
+    me_id number not null,
+    me_table_name varchar(64) not null,
+    me_method_type varchar(6) not null,
+    me_data_id number not null,
+    me_data varchar(1024),
+    me_priority number(2) default 0,
+    me_create_time date not null
+);
+
+-- 创建存储过程 入队消息
+create or replace procedure enqueue_lucene_message(v_table_name in varchar, v_method_type in varchar, v_data_id in number, v_data in varchar, v_priority in number) is
+begin
+	insert into lucene$message (me_table_name, me_method_type, me_data_id, me_data, me_priority, me_create_time) values(v_table_name, v_method_type, v_data_id, v_data, v_priority, sysdate());
+end enqueue_lucene_message;
+
+-- 创建存储过程 出队消息
+create procedure dequeue_lucene_message(v_id in number) is
+begin
+	insert into lucene$message_history (mh_dequeue_time, me_id, me_table_name, me_method_type, me_data_id, me_data, me_priority, me_create_time) select sysdate(), me_id, me_table_name, me_method_type, me_data_id, me_data, me_priority, me_create_time from lucene$message where me_id = v_id;
+	delete from lucene$message where me_id = v_id;
+end dequeue_lucene_message;
+
+-- ----------------------------
+-- Triggers structure for table PURC$CHANGES
+-- ----------------------------
+CREATE or replace trigger lucene_purc_changes
+after insert or update of name, shortname, id, industry, adminname, profession, tags or delete on AC$US$DETAIL
+for each row
+declare
+  v_table_name varchar(64) default 'PURC$CHANGES';
+  v_method_type varchar(6) default 'insert';
+  v_data_id number;
+  v_data varchar(1024) default null;
+  v_priority number(2) default 1;
+begin
+  if inserting then
+    v_data_id := :new.id;
+  elsif updating then
+    v_data_id := :old.id;
+  elsif deleting then
+    v_data_id := :old.id;
+  end if;
+  enqueue_lucene_message(v_table_name, v_method_type, v_data_id, v_data, v_priority);
+end;

+ 4 - 15
search-console-b2b/pom.xml

@@ -96,26 +96,15 @@
 			<groupId>com.oracle</groupId>
 			<artifactId>ojdbc6</artifactId>
 		</dependency>
-		<!-- Lucene实时建索引时用于监听Oracle消息队列 -->
-		<dependency>
-			<groupId>javax.jms</groupId>
-			<artifactId>jms</artifactId>
-		</dependency>
-		<!-- Oracle消息队列处理 -->
-		<dependency>
-			<groupId>org.oracle</groupId>
-			<artifactId>aqapi</artifactId>
-			<version>1.0</version>
-		</dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
 		<!-- druid -->
 		<dependency>
 			<groupId>com.alibaba</groupId>
 			<artifactId>druid</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.hibernate</groupId>
-			<artifactId>hibernate-ehcache</artifactId>
-		</dependency>
 		<dependency>
 			<groupId>org.hibernate</groupId>
 			<artifactId>hibernate-entitymanager</artifactId>

+ 9 - 24
search-console-b2b/src/main/java/com/uas/search/console/b2b/Application.java

@@ -1,31 +1,20 @@
 package com.uas.search.console.b2b;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.NotSerializableException;
-import java.io.PrintStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import com.uas.search.console.b2b.model.*;
+import com.uas.search.console.b2b.schedule.model.TaskInformation;
+import com.uas.search.console.b2b.schedule.service.TaskService;
+import com.uas.search.console.b2b.service.UpdateVirtualColumnService;
+import com.uas.search.console.b2b.util.ContextUtils;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.ImportResource;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 import org.springframework.web.servlet.config.annotation.EnableWebMvc;
 
-import com.uas.search.console.b2b.util.ContextUtils;
-import com.uas.search.console.b2b.model.B2BSaleTenderSimpleInfo;
-import com.uas.search.console.b2b.model.PurchaseInquiryItemSimpleInfo;
-import com.uas.search.console.b2b.model.PurchaseInquiryMouldSimpleInfo;
-import com.uas.search.console.b2b.model.PurchaseTenderSimpleInfo;
-import com.uas.search.console.b2b.model.SaleQuotationSimpleInfo;
-import com.uas.search.console.b2b.schedule.model.TaskInformation;
-import com.uas.search.console.b2b.schedule.service.TaskService;
-import com.uas.search.console.b2b.service.UpdateVirtualColumnService;
-import com.uas.search.console.b2b.support.RealTimeUpdateMonitor;
-import com.uas.search.console.b2b.util.SearchConstants.DataSourceQualifier;
+import java.io.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @EnableTransactionManagement
 @EnableWebMvc
@@ -98,10 +87,6 @@ public class Application {
 		saleTenderFields.put("result", Short.class);
 		updateVirtualColumnService.newDailyTask(B2BSaleTenderSimpleInfo.class, saleTenderFields, hour, minute, second);
 
-		// 定时监控实时更新异常情况
-		new RealTimeUpdateMonitor(DataSourceQualifier.PLATFORMB2B_DATASOURCE).newTask();
-		new RealTimeUpdateMonitor(DataSourceQualifier.PLATFORMMANAGER_DATASOURCE).newTask();
-
 		// 开启定时任务
 		TaskService taskService = ContextUtils.getBean(TaskService.class);
 		if (!taskService.isStopped()) {

+ 0 - 26
search-console-b2b/src/main/java/com/uas/search/console/b2b/CacheConfiguration.java

@@ -1,26 +0,0 @@
-package com.uas.search.console.b2b;
-
-import org.springframework.cache.annotation.EnableCaching;
-import org.springframework.cache.ehcache.EhCacheCacheManager;
-import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.io.ClassPathResource;
-
-@Configuration
-@EnableCaching
-public class CacheConfiguration {
-
-	@Bean
-	public EhCacheCacheManager cacheManager(EhCacheManagerFactoryBean bean) {
-		return new EhCacheCacheManager(bean.getObject());
-	}
-
-	@Bean
-	public EhCacheManagerFactoryBean ehcache() {
-		EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
-		ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("spring/ehcache.xml"));
-		ehCacheManagerFactoryBean.setShared(true);
-		return ehCacheManagerFactoryBean;
-	}
-}

+ 4 - 1
search-console-b2b/src/main/java/com/uas/search/console/b2b/DruidDBConfiguration.java

@@ -90,6 +90,9 @@ public class DruidDBConfiguration {
 	@Value("${platformmanager.datasource.password}")
 	private String platformmanagerPassword;
 
+    @Value("${platformmanager.datasource.driverClassName}")
+    private String platformmanagerDriverClassName;
+
 	public int getMaxActive() {
 		return maxActive;
 	}
@@ -136,7 +139,7 @@ public class DruidDBConfiguration {
 		dataSource.setUrl(platformmanagerUrl);
 		dataSource.setUsername(platformmanagerUsername);
 		dataSource.setPassword(platformmanagerPassword);
-		dataSource.setDriverClassName(driverClassName);
+		dataSource.setDriverClassName(platformmanagerDriverClassName);
 
 		// configuration
 		dataSource.setInitialSize(initialSize);

+ 2 - 2
search-console-b2b/src/main/java/com/uas/search/console/b2b/Platformb2bRepositoryConfiguration.java

@@ -25,7 +25,7 @@ import com.uas.search.console.b2b.util.SearchConstants;
  */
 @Configuration
 @EnableJpaRepositories(entityManagerFactoryRef = "platformb2bEntityManagerFactory", transactionManagerRef = "platformb2bTransactionManager", basePackages = {
-		"com.uas.search.console.b2b.dao" })
+		"com.uas.search.console.b2b.dao", "com.uas.search.console.b2b.jms.platformb2b"})
 public class Platformb2bRepositoryConfiguration {
 
 	@Autowired
@@ -40,7 +40,7 @@ public class Platformb2bRepositoryConfiguration {
 	public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
 		return builder.dataSource(platformb2bDataSource)
 				.properties(jpaProperties.getHibernateProperties(platformb2bDataSource))
-				.packages("com.uas.search.console.b2b.model").persistenceUnit("platformb2bPersistenceUnit").build();
+				.packages("com.uas.search.console.b2b.model", "com.uas.search.console.b2b.jms.platformb2b").persistenceUnit("platformb2bPersistenceUnit").build();
 	}
 
 	@Bean(name = "platformb2bEntityManager")

+ 2 - 2
search-console-b2b/src/main/java/com/uas/search/console/b2b/PlatformmanagerRepositoryConfiguration.java

@@ -24,7 +24,7 @@ import com.uas.search.console.b2b.util.SearchConstants;
  */
 @Configuration
 @EnableJpaRepositories(entityManagerFactoryRef = "platformmanagerEntityManagerFactory", transactionManagerRef = "platformmanagerTransactionManager", basePackages = {
-		"com.uas.search.console.b2b.platformmanager.dao" })
+		"com.uas.search.console.b2b.platformmanager.dao", "com.uas.search.console.b2b.jms.platformmanager"})
 public class PlatformmanagerRepositoryConfiguration {
 
 	@Autowired
@@ -38,7 +38,7 @@ public class PlatformmanagerRepositoryConfiguration {
 	public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
 		return builder.dataSource(platformmanagerDataSource)
 				.properties(jpaProperties.getHibernateProperties(platformmanagerDataSource))
-				.packages("com.uas.search.console.b2b.platformmanager.model")
+				.packages("com.uas.search.console.b2b.platformmanager.model", "com.uas.search.console.b2b.jms.platformmanager")
 				.persistenceUnit("platformmanagerPersistenceUnit").build();
 	}
 

+ 27 - 19
search-console-b2b/src/main/java/com/uas/search/console/b2b/controller/IndexController.java

@@ -2,8 +2,10 @@ package com.uas.search.console.b2b.controller;
 
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.service.SearchService.Table_name;
-import com.uas.search.console.b2b.jms.AQListener;
-import com.uas.search.console.b2b.jms.LuceneQueueMessage;
+import com.uas.search.console.b2b.jms.JmsListener;
+import com.uas.search.console.b2b.jms.LuceneMessageDaoInterface;
+import com.uas.search.console.b2b.jms.LuceneMessageInterface;
+import com.uas.search.console.b2b.jms.LuceneMessageService;
 import com.uas.search.console.b2b.service.IndexService;
 import com.uas.search.console.b2b.support.DownloadHelper;
 import com.uas.search.console.b2b.util.SearchConstants.DataSourceQualifier;
@@ -15,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -33,11 +36,14 @@ public class IndexController {
 	private IndexService indexService;
 
 	@Autowired
-	private AQListener aqListener;
+	private JmsListener jmsListener;
+
+    @Autowired
+    private LuceneMessageService luceneMessageService;
 
 	@RequestMapping("/create")
 	@ResponseBody
-	public String createIndexs(String tableNames, Boolean fromFiles, Boolean ifStartListener) {
+	public String createIndexs(String tableNames, Boolean fromFiles, Boolean ifStartListener) throws IOException, InterruptedException {
 		List<Table_name> tableNameList = getTableNames(tableNames);
 		return String.format("Indexes created success in %.2fs",
 				indexService.createIndexes(tableNameList, fromFiles, ifStartListener) / 1000.0);
@@ -95,27 +101,27 @@ public class IndexController {
 	@RequestMapping("/listen/start")
 	@ResponseBody
 	public String start(String dataSourceQualifiers, Long waitInterval) {
-		return aqListener.start(getDataSourceQualifiers(dataSourceQualifiers), waitInterval);
+		return jmsListener.start(getDataSourceQualifiers(dataSourceQualifiers), waitInterval);
 	}
 
 	@RequestMapping("/listen/stop")
 	@ResponseBody
 	public String stop(String dataSourceQualifiers) {
-		return aqListener.stop(getDataSourceQualifiers(dataSourceQualifiers));
+		return jmsListener.stop(getDataSourceQualifiers(dataSourceQualifiers));
 	}
 
 	@RequestMapping("/listen/isRunning")
 	@ResponseBody
 	public boolean isRunning(String dataSourceQualifier) {
-		return aqListener.isRunning(DataSourceQualifier.checkDataSourceType(dataSourceQualifier));
+		return jmsListener.isRunning(DataSourceQualifier.checkDataSourceType(dataSourceQualifier));
 	}
 
 	@RequestMapping("/listen/restart")
 	@ResponseBody
 	public String restart(String dataSourceQualifiers, Long waitInterval) {
 		HashSet<DataSourceQualifier> qualifiers = getDataSourceQualifiers(dataSourceQualifiers);
-		aqListener.stop(qualifiers);
-		return aqListener.start(qualifiers, waitInterval);
+		jmsListener.stop(qualifiers);
+		return jmsListener.start(qualifiers, waitInterval);
 	}
 
 	private HashSet<DataSourceQualifier> getDataSourceQualifiers(String dataSourceQualifiers) {
@@ -132,33 +138,35 @@ public class IndexController {
 
 	@RequestMapping("/listen/details")
 	@ResponseBody
-	public SPage<LuceneQueueMessage> listenDetails(String dataSourceQualifier, Integer page, Integer size,
-			String searchContent) {
+	public SPage<LuceneMessageInterface> listenDetails(String dataSourceQualifier, Integer page, Integer size,
+                                                       String searchContent) {
 		DataSourceQualifier qualifier = null;
 		if (dataSourceQualifier != null) {
 			qualifier = DataSourceQualifier.checkDataSourceType(dataSourceQualifier);
 		}
-		return indexService.getListenDetails(qualifier, page, size, searchContent);
+		return luceneMessageService.findAll(qualifier, page, size);
 	}
 
 	@RequestMapping("/maintain")
 	@ResponseBody
-	public String maintainIndexes(@RequestParam String tableName, String ids, String data,
-			@RequestParam String method) {
-		if (!StringUtils.isEmpty(ids)) {
-			return "已维护:" + indexService.maintainIndexesByIds(tableName, ids, method);
+	public String maintainIndexes(@RequestParam String tableName, @RequestParam Long dataId, String data,
+			@RequestParam String methodType) {
+		if (dataId != null) {
+			return "已维护:" + indexService.maintainIndexesById(tableName, dataId, methodType, data);
 		} else {
-			return "已维护:" + indexService.maintainIndexesByData(tableName, data, method);
+			return "已维护:" + indexService.maintainIndexesByData(tableName, data, methodType);
 		}
 	}
 
 	@RequestMapping("/dequeue")
 	@ResponseBody
-	public boolean dequeueLuceneQueueMessage(String dataSourceQualifier, String messageId) {
+	public boolean dequeueLuceneQueueMessage(String dataSourceQualifier, Long id) {
 		DataSourceQualifier qualifier = null;
 		if (dataSourceQualifier != null) {
 			qualifier = DataSourceQualifier.checkDataSourceType(dataSourceQualifier);
 		}
-		return indexService.dequeueLuceneQueueMessage(qualifier, messageId);
+        LuceneMessageDaoInterface luceneMessageDao = luceneMessageService.getLuceneMessageDao(qualifier);
+        luceneMessageDao.dequeueLuceneMessage(id);
+		return true;
 	}
 }

+ 0 - 281
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/AQListener.java

@@ -1,281 +0,0 @@
-package com.uas.search.console.b2b.jms;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import com.alibaba.fastjson.JSONException;
-import com.uas.search.console.b2b.DruidDBConfiguration;
-import com.uas.search.console.b2b.model.ParsedQueueMessage;
-import com.uas.search.console.b2b.service.IndexService;
-import com.uas.search.console.b2b.util.SearchConstants;
-import com.uas.search.console.b2b.util.SearchConstants.DataSourceQualifier;
-import com.uas.search.util.CollectionUtils;
-import oracle.jms.AQjmsAdtMessage;
-import oracle.jms.AQjmsFactory;
-import oracle.jms.AQjmsSession;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.jms.*;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * 对数据库的消息队列进行实时监听
- * 
- * @author sunyj
- * @since 2016年11月9日 上午11:29:33
- */
-@Service
-public class AQListener implements InitializingBean {
-
-	@Autowired
-	private IndexService indexService;
-
-	@Autowired
-	private QueueMessageParser queueMessageParser;
-
-	/**
-	 * 数据源
-	 */
-	private Map<DataSourceQualifier, DruidDataSource> dataSources = new ConcurrentHashMap<>();
-
-	/**
-	 * 消息队列的消费者
-	 */
-	private Map<DataSourceQualifier, MessageConsumer> consumers = new ConcurrentHashMap<>();
-
-	private Logger logger = LoggerFactory.getLogger(getClass());
-
-	@Override
-	public void afterPropertiesSet() throws Exception {
-		for (DataSourceQualifier dataSourceQualifier : DataSourceQualifier.values()) {
-			dataSources.put(dataSourceQualifier, DruidDBConfiguration.getDataSource(dataSourceQualifier));
-		}
-	}
-
-	/**
-	 * 开启实时更新索引
-	 * 
-	 * @param waitInterval
-	 *            每次接收到jms消息后等待的时间(秒)
-	 * @return 开启成功与否的提示信息
-	 */
-	public String start(HashSet<DataSourceQualifier> dataSourceQualifiers, Long waitInterval) {
-		// 不指定数据源标识时,开启所有监听器
-		if (CollectionUtils.isEmpty(dataSourceQualifiers)) {
-			dataSourceQualifiers = allDataSourceTypes();
-		}
-		String message = "";
-		try {
-			for (DataSourceQualifier qualifier : dataSourceQualifiers) {
-				message += "\n" + startListener(qualifier, waitInterval);
-			}
-		} catch (Throwable e) {
-			logger.error(e.getMessage(), e);
-		}
-		return message;
-	}
-
-	/**
-	 * 添加监听器
-	 * 
-	 * @param dataSourceQualifier
-	 * @param waitInterval
-	 * @throws JMSException
-	 */
-	private String startListener(DataSourceQualifier dataSourceQualifier, Long waitInterval) {
-		String message = "";
-		if (isRunning(dataSourceQualifier)) {
-			message = "已存在运行的索引实时更新服务:" + dataSourceQualifier.getQualifier();
-			logger.warn(message);
-			return message;
-		}
-		DruidDataSource dataSource = dataSources.get(dataSourceQualifier);
-		try {
-			QueueConnection connection = getQueueConnection(dataSource);
-			MessageConsumer consumer = getMessageConsumer(connection, dataSource.getUsername());
-			consumers.put(dataSourceQualifier, consumer);
-			// 添加监听器,队列中一旦有消息入队,就会接受该消息(并不是真的实时,一般会有10秒以内的延迟)
-			consumer.setMessageListener(new JmsMessageListener(waitInterval));
-			connection.start();
-			message = "索引实时更新服务开启成功:" + dataSourceQualifier.getQualifier();
-			logger.info(message);
-		} catch (Throwable e) {
-			message = "索引实时更新服务开启失败:" + dataSourceQualifier.getQualifier();
-			logger.error(message, e);
-			try {
-				closeConsumer(dataSourceQualifier);
-			} catch (JMSException e1) {
-				logger.error("", e1);
-			}
-		}
-		return message;
-	}
-
-	/**
-	 * 根据数据源获取QueueConnection
-	 * 
-	 * @param dataSource
-	 * @return
-	 * @throws JMSException
-	 */
-	private QueueConnection getQueueConnection(DruidDataSource dataSource) throws JMSException {
-		QueueConnectionFactory queueConnectionFactory = AQjmsFactory.getQueueConnectionFactory(dataSource.getUrl(),
-				new Properties());
-		return queueConnectionFactory.createQueueConnection(dataSource.getUsername(), dataSource.getPassword());
-	}
-
-	/**
-	 * 根据QueueConnection和数据库用户名获取MessageConsumer
-	 * 
-	 * @param connection
-	 * @return
-	 * @throws JMSException
-	 */
-	private MessageConsumer getMessageConsumer(QueueConnection connection, String userName) throws JMSException {
-		AQjmsSession session = (AQjmsSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-		Queue queue = session.getQueue(userName, SearchConstants.LUCENE_QUEUE_NAME);
-		return session.createConsumer(queue, null, QueueMessageTypeFactory.getFactory(), null, false);
-	}
-
-	/**
-	 * 关闭实时更新索引服务
-	 * 
-	 * @param dataSourceQualifiers
-	 * @return 关闭成功与否的提示信息
-	 */
-	public String stop(HashSet<DataSourceQualifier> dataSourceQualifiers) {
-		// 不指定数据源标识时,关闭所有监听器
-		if (CollectionUtils.isEmpty(dataSourceQualifiers)) {
-			dataSourceQualifiers = allDataSourceTypes();
-		}
-		String message = "";
-		try {
-			for (DataSourceQualifier qualifier : dataSourceQualifiers) {
-				message += "\n" + stopListener(qualifier);
-			}
-		} catch (Throwable e) {
-			logger.error(e.getMessage(), e);
-		}
-		return message;
-	}
-
-	/**
-	 * 关闭监听器
-	 * 
-	 * @param dataSourceQualifier
-	 * @return
-	 */
-	private String stopListener(DataSourceQualifier dataSourceQualifier) {
-		String message = "";
-		if (!isRunning(dataSourceQualifier)) {
-			message = "索引实时更新服务未开启或已关闭:" + dataSourceQualifier.getQualifier();
-			logger.warn(message);
-		} else {
-			try {
-				closeConsumer(dataSourceQualifier);
-				message = "索引实时更新服务关闭成功:" + dataSourceQualifier.getQualifier();
-				logger.info(message);
-			} catch (Throwable e) {
-				message = "索引实时更新服务关闭失败:" + dataSourceQualifier.getQualifier();
-				logger.error(message, e);
-			}
-		}
-		return message;
-	}
-
-	/**
-	 * 关闭消息队列的消费者
-	 * 
-	 * @param dataSourceQualifier
-	 * @throws JMSException
-	 */
-	private void closeConsumer(DataSourceQualifier dataSourceQualifier) throws JMSException {
-		MessageConsumer consumer = consumers.get(dataSourceQualifier);
-		if (consumer != null) {
-			consumer.close();
-			consumers.remove(dataSourceQualifier);
-		}
-	}
-
-	/**
-	 * @param dataSourceQualifier
-	 * @return 索引实时更新服务是否正在运行
-	 */
-	public boolean isRunning(DataSourceQualifier dataSourceQualifier) {
-		if (dataSourceQualifier == null) {
-			throw new IllegalArgumentException("dataSourceQualifier 为空");
-		}
-		MessageConsumer consumer = consumers.get(dataSourceQualifier);
-		return consumer != null;
-	}
-
-	/**
-	 * @return 所有数据源标识
-	 */
-	private HashSet<DataSourceQualifier> allDataSourceTypes() {
-		HashSet<DataSourceQualifier> dataSourceQualifiers = new HashSet<>();
-		DataSourceQualifier[] types = DataSourceQualifier.values();
-		for (DataSourceQualifier qualifier : types) {
-			dataSourceQualifiers.add(qualifier);
-		}
-		return dataSourceQualifiers;
-	}
-
-	/**
-	 * 对得到的队列消息进行解析,之后根据解析出来的对象,对lucene索引进行添加、更新或删除操作
-	 * 
-	 * @param message
-	 */
-	private void process(String message) {
-		ParsedQueueMessage parsedQueueMessage = null;
-		logger.info(message);
-		try {
-			parsedQueueMessage = queueMessageParser.parse(message);
-		} catch (JSONException e) {
-			logger.error("", e);
-		}
-
-		if (parsedQueueMessage == null) {
-			logger.error("message parsing failed!");
-			return;
-		}
-		indexService.maintainIndexes(parsedQueueMessage);
-	}
-
-	class JmsMessageListener implements MessageListener {
-
-		private Long waitInterval;
-
-		public JmsMessageListener(Long waitInterval) {
-			this.waitInterval = waitInterval;
-		}
-
-		@Override
-		public void onMessage(Message message) {
-			try {
-				if (waitInterval != null) {
-					// 等待waitInterval秒,为了等待数据表变动的事务提交
-					// 如果时间过短,事务可能还未提交
-					// 如果时间过长,实时更新速度很慢
-					Thread.sleep(waitInterval * 1000);
-				}
-			} catch (InterruptedException e) {
-				logger.error("", e);
-			}
-			AQjmsAdtMessage adtMessage = (AQjmsAdtMessage) message;
-			try {
-				QueueMessageTypeFactory payload = (QueueMessageTypeFactory) adtMessage.getAdtPayload();
-				// 对出队的消息进行解析、处理
-				process(payload.getMessage());
-			} catch (Throwable e) {
-				logger.error("", e);
-			}
-		}
-	}
-
-}

+ 269 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/JmsListener.java

@@ -0,0 +1,269 @@
+package com.uas.search.console.b2b.jms;
+
+import com.uas.search.b2b.model.SPage;
+import com.uas.search.console.b2b.schedule.model.TaskInformation;
+import com.uas.search.console.b2b.schedule.service.Executable;
+import com.uas.search.console.b2b.schedule.service.TaskService;
+import com.uas.search.console.b2b.service.IndexService;
+import com.uas.search.console.b2b.util.ContextUtils;
+import com.uas.search.console.b2b.util.SearchConstants.DataSourceQualifier;
+import com.uas.search.util.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 对数据库的消息队列进行实时监听
+ * 
+ * @author sunyj
+ * @since 2016年11月9日 上午11:29:33
+ */
+@Service
+public class JmsListener {
+
+    /**
+     * 第一次执行的延迟时间间隔为 3 秒,以防止日志交杂错乱,不好查看
+     */
+    private static final long INITIAL_DELAY = 3000;
+    /**
+     * 两次任务之间的等待时间间隔为 1 秒钟
+     */
+    private static final long INTERVAL = 1000;
+
+	@Autowired
+	private IndexService indexService;
+
+    @Autowired
+    private TaskService taskService;
+
+    @Autowired
+    private LuceneMessageService luceneMessageService;
+
+	@Autowired
+	private QueueMessageParser queueMessageParser;
+
+	/**
+	 * 消息队列的消费者
+	 */
+	private Map<DataSourceQualifier, TaskInformation> consumers = new ConcurrentHashMap<>();
+
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+	/**
+	 * 开启实时更新索引
+	 * 
+	 * @param waitInterval
+	 *            每次接收到jms消息后等待的时间(秒)
+	 * @return 开启成功与否的提示信息
+	 */
+	public String start(HashSet<DataSourceQualifier> dataSourceQualifiers, Long waitInterval) {
+		// 不指定数据源标识时,开启所有监听器
+		if (CollectionUtils.isEmpty(dataSourceQualifiers)) {
+			dataSourceQualifiers = allDataSourceTypes();
+		}
+		String message = "";
+		try {
+			for (DataSourceQualifier qualifier : dataSourceQualifiers) {
+				message += "\n" + startListener(qualifier, waitInterval);
+			}
+		} catch (Throwable e) {
+			logger.error(e.getMessage(), e);
+		}
+		return message;
+	}
+
+	/**
+	 * 添加监听器
+	 * 
+	 * @param dataSourceQualifier 数据源标识
+	 * @param waitInterval
+	 */
+	private String startListener(DataSourceQualifier dataSourceQualifier, Long waitInterval) {
+        if(waitInterval == null){
+            waitInterval = INTERVAL;
+        }else{
+            waitInterval *= 1000;
+        }
+        if(waitInterval <= 0){
+            throw new IllegalArgumentException("waitInterval 不合法:" + waitInterval);
+        }
+		String message;
+		if (isRunning(dataSourceQualifier)) {
+			message = "已存在运行的索引实时更新服务:" + dataSourceQualifier.getQualifier();
+			logger.warn(message);
+			return message;
+		}
+
+		try {
+			TaskInformation consumer = getMessageConsumer(dataSourceQualifier, waitInterval);
+			consumers.put(dataSourceQualifier, consumer);
+            taskService.newTask(consumer);
+            if (!taskService.isStopped()) {
+                taskService.stop();
+            }
+            taskService.start();
+			message = "索引实时更新服务开启成功:" + dataSourceQualifier.getQualifier();
+			logger.info(message);
+		} catch (Exception e) {
+			message = "索引实时更新服务开启失败:" + dataSourceQualifier.getQualifier();
+			logger.error(message, e);
+			try {
+				closeConsumer(dataSourceQualifier);
+			} catch (Exception e1) {
+				logger.error("", e1);
+			}
+		}
+		return message;
+	}
+
+	/**
+     * @param dataSourceQualifier 数据源标识
+     * @param waitInterval
+	 */
+	private TaskInformation getMessageConsumer(final DataSourceQualifier dataSourceQualifier, Long waitInterval) {
+        String title = "实时更新[" + dataSourceQualifier + "]";
+        Executable command = new Executable() {
+            @Override
+            public String execute() {
+                SPage<LuceneMessageInterface> sPage = luceneMessageService.findAll(dataSourceQualifier, 1, 100);
+                List<LuceneMessageInterface> luceneMessages = sPage.getContent();
+                if (CollectionUtils.isEmpty(luceneMessages)) {
+                    return "无消息";
+                }
+                for(LuceneMessageInterface luceneMessage : luceneMessages){
+                    try {
+                        process(luceneMessage);
+                    } catch (Throwable e) {
+                        logger.error("", e);
+                    }
+                }
+                // 如果消息不止一页,立即消费下一页
+                if(sPage.getTotalPage() > 1){
+                    execute();
+                }
+                return "正常";
+            }
+        };
+        return new TaskInformation(title, command, INITIAL_DELAY, waitInterval, TaskInformation.ScheduleType.FixedDelay);
+	}
+
+	/**
+	 * 关闭实时更新索引服务
+	 * 
+	 * @param dataSourceQualifiers 数据源标识
+	 * @return 关闭成功与否的提示信息
+	 */
+	public String stop(HashSet<DataSourceQualifier> dataSourceQualifiers) {
+		// 不指定数据源标识时,关闭所有监听器
+		if (CollectionUtils.isEmpty(dataSourceQualifiers)) {
+			dataSourceQualifiers = allDataSourceTypes();
+		}
+		String message = "";
+		try {
+			for (DataSourceQualifier qualifier : dataSourceQualifiers) {
+				message += "\n" + stopListener(qualifier);
+			}
+		} catch (Throwable e) {
+			logger.error(e.getMessage(), e);
+		}
+		return message;
+	}
+
+	/**
+	 * 关闭监听器
+	 * 
+	 * @param dataSourceQualifier 数据源标识
+	 * @return
+	 */
+	private String stopListener(DataSourceQualifier dataSourceQualifier) {
+		String message = "";
+		if (!isRunning(dataSourceQualifier)) {
+			message = "索引实时更新服务未开启或已关闭:" + dataSourceQualifier.getQualifier();
+			logger.warn(message);
+		} else {
+			try {
+				closeConsumer(dataSourceQualifier);
+				message = "索引实时更新服务关闭成功:" + dataSourceQualifier.getQualifier();
+				logger.info(message);
+			} catch (Throwable e) {
+				message = "索引实时更新服务关闭失败:" + dataSourceQualifier.getQualifier();
+				logger.error(message, e);
+			}
+		}
+		return message;
+	}
+
+	/**
+	 * 关闭消息队列的消费者
+	 * 
+	 * @param dataSourceQualifier 数据源标识
+	 */
+	private void closeConsumer(DataSourceQualifier dataSourceQualifier) {
+        if (!isRunning(dataSourceQualifier)) {
+            throw new IllegalStateException("索引实时更新服务未开启或已关闭");
+        } else {
+            TaskInformation consumer = consumers.get(dataSourceQualifier);
+            taskService.remove(consumer.getCode());
+            if (!taskService.isStopped()) {
+                taskService.stop();
+            }
+            taskService.start();
+            consumers.remove(dataSourceQualifier);
+        }
+	}
+
+	/**
+	 * @param dataSourceQualifier 数据源标识
+	 * @return 索引实时更新服务是否正在运行
+	 */
+	public boolean isRunning(DataSourceQualifier dataSourceQualifier) {
+		if (dataSourceQualifier == null) {
+			throw new IllegalArgumentException("dataSourceQualifier 为空");
+		}
+        TaskInformation consumer = consumers.get(dataSourceQualifier);
+		return consumer != null && taskService.exist(consumer.getCode());
+	}
+
+	/**
+	 * @return 所有数据源标识
+	 */
+	private HashSet<DataSourceQualifier> allDataSourceTypes() {
+		HashSet<DataSourceQualifier> dataSourceQualifiers = new HashSet<>();
+		DataSourceQualifier[] types = DataSourceQualifier.values();
+        dataSourceQualifiers.addAll(Arrays.asList(types));
+		return dataSourceQualifiers;
+	}
+
+	/**
+	 * 对得到的队列消息进行解析,之后根据解析出来的对象,对lucene索引进行添加、更新或删除操作
+	 * 
+	 * @param luceneMessage 消息
+	 */
+    private void process(LuceneMessageInterface luceneMessage) {
+        logger.info(luceneMessage.toString());
+        try {
+            ParsedQueueMessage parsedQueueMessage = queueMessageParser.parse(luceneMessage.getTableName(), luceneMessage.getDataId(), luceneMessage.getMethodType(), luceneMessage.getData());
+            List<Object> maintainedObjects = indexService.maintainIndexes(parsedQueueMessage);
+            logger.info("Maintained... " + maintainedObjects);
+        } finally {
+            Long id = luceneMessage.getId();
+            luceneMessage.setRetryCount(luceneMessage.getRetryCount() + 1);
+            if (luceneMessage instanceof com.uas.search.console.b2b.jms.platformb2b.LuceneMessage) {
+                com.uas.search.console.b2b.jms.platformb2b.LuceneMessageDao luceneMessageDao = ContextUtils.getBean(com.uas.search.console.b2b.jms.platformb2b.LuceneMessageDao.class);
+                luceneMessageDao.save((com.uas.search.console.b2b.jms.platformb2b.LuceneMessage) luceneMessage);
+                luceneMessageDao.dequeueLuceneMessage(id);
+            } else {
+                com.uas.search.console.b2b.jms.platformmanager.LuceneMessageDao luceneMessageDao = ContextUtils.getBean(com.uas.search.console.b2b.jms.platformmanager.LuceneMessageDao.class);
+                luceneMessageDao.save((com.uas.search.console.b2b.jms.platformmanager.LuceneMessage) luceneMessage);
+                luceneMessageDao.dequeueLuceneMessage(id);
+            }
+        }
+    }
+}

+ 22 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneMessageDaoInterface.java

@@ -0,0 +1,22 @@
+package com.uas.search.console.b2b.jms;
+
+/**
+ * @author sunyj
+ * @since 2018/5/3 17:35
+ */
+public interface LuceneMessageDaoInterface {
+
+    /**
+     * 统计行数
+     *
+     * @return 行数
+     */
+    long count();
+
+    /**
+     * 出队消息
+     *
+     * @param id 消息 id
+     */
+    void dequeueLuceneMessage(Long id);
+}

+ 42 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneMessageInterface.java

@@ -0,0 +1,42 @@
+package com.uas.search.console.b2b.jms;
+
+import java.util.Date;
+
+/**
+ * @author sunyj
+ * @since 2018/5/3 15:48
+ */
+public interface LuceneMessageInterface {
+
+    Long getId();
+
+    void setId(Long id);
+
+    String getTableName();
+
+    void setTableName(String tableName);
+
+    String getMethodType();
+
+    void setMethodType(String methodType);
+
+    Long getDataId();
+
+    void setDataId(Long dataId);
+
+    String getData();
+
+    void setData(String data);
+
+    Long getPriority();
+
+    void setPriority(Long priority);
+
+    Long getRetryCount();
+
+    void setRetryCount(Long retryCount);
+
+    String getCreateTime();
+
+    void setCreateTime(Date createTime);
+}

+ 30 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneMessageService.java

@@ -0,0 +1,30 @@
+package com.uas.search.console.b2b.jms;
+
+import com.uas.search.b2b.model.SPage;
+import com.uas.search.console.b2b.util.SearchConstants;
+
+/**
+ * 消息
+ *
+ * @author sunyj
+ * @since 2017/10/11 17:31
+ */
+public interface LuceneMessageService {
+
+    /**
+     * 获取消息
+     *
+     * @param dataSourceQualifier 数据源标识
+     * @param page                页码
+     * @param size                页大小
+     * @return 消息(实时更新情况的详细信息)
+     */
+    SPage<LuceneMessageInterface> findAll(SearchConstants.DataSourceQualifier dataSourceQualifier, Integer page, Integer size);
+
+    /**
+     * 获取 LuceneMessageDaoInterface
+     * @param dataSourceQualifier 数据源标识
+     * @return LuceneMessageDaoInterface
+     */
+    LuceneMessageDaoInterface getLuceneMessageDao(SearchConstants.DataSourceQualifier dataSourceQualifier);
+}

+ 91 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneMessageServiceImpl.java

@@ -0,0 +1,91 @@
+package com.uas.search.console.b2b.jms;
+
+import com.uas.search.b2b.model.SPage;
+import com.uas.search.console.b2b.util.ContextUtils;
+import com.uas.search.console.b2b.util.SearchConstants;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 消息
+ *
+ * @author sunyj
+ * @since 2017/10/11 17:33
+ */
+@Service
+public class LuceneMessageServiceImpl implements LuceneMessageService {
+
+    /**
+     * 默认的页码
+     */
+    private static final int PAGE_INDEX = 1;
+
+    /**
+     * 默认每页的大小
+     */
+    private static final int PAGE_SIZE = 20;
+
+    @Override
+    public SPage<LuceneMessageInterface> findAll(SearchConstants.DataSourceQualifier dataSourceQualifier, Integer page, Integer size) {
+        LuceneMessageDaoInterface luceneMessageDao = getLuceneMessageDao(dataSourceQualifier);
+        // 处理分页信息
+        if (page == null || page <= 0) {
+            page = PAGE_INDEX;
+        }
+        if (size == null || size <= 0) {
+            size = PAGE_SIZE;
+        }
+
+        SPage<LuceneMessageInterface> sPage = new SPage<>();
+        long totalElement = luceneMessageDao.count();
+        sPage.setTotalElement(totalElement);
+        // 总数目为0,返回
+        if (totalElement == 0) {
+            return sPage;
+        }
+
+        int totalPage = (int) Math.ceil(totalElement / (1.0 * size));
+        sPage.setTotalPage(totalPage);
+        // 如果页码过大
+        if (page > totalPage) {
+            page = totalPage;
+        }
+        int start = (page - 1) * size;
+        sPage.setPage(page);
+        sPage.setSize(size);
+        if (page == 1) {
+            sPage.setFirst(true);
+        }
+        if (page == totalPage) {
+            sPage.setLast(true);
+        }
+
+        List<LuceneMessageInterface> messages = new ArrayList<>();
+        if(luceneMessageDao instanceof com.uas.search.console.b2b.jms.platformb2b.LuceneMessageDao){
+            com.uas.search.console.b2b.jms.platformb2b.LuceneMessageDao dao = (com.uas.search.console.b2b.jms.platformb2b.LuceneMessageDao)luceneMessageDao;
+            List<com.uas.search.console.b2b.jms.platformb2b.LuceneMessage> list = dao.findList(start, size);
+            messages.addAll(list);
+        }else{
+            com.uas.search.console.b2b.jms.platformmanager.LuceneMessageDao dao = (com.uas.search.console.b2b.jms.platformmanager.LuceneMessageDao)luceneMessageDao;
+            List<com.uas.search.console.b2b.jms.platformmanager.LuceneMessage> list = dao.findList(start, size);
+            messages.addAll(list);
+        }
+        sPage.setContent(messages);
+        return sPage;
+    }
+
+    @Override
+    public LuceneMessageDaoInterface getLuceneMessageDao(SearchConstants.DataSourceQualifier dataSourceQualifier) {
+        switch (dataSourceQualifier) {
+            case PLATFORMB2B_DATASOURCE:
+                return ContextUtils.getBean(com.uas.search.console.b2b.jms.platformb2b.LuceneMessageDao.class);
+            case PLATFORMMANAGER_DATASOURCE:
+                return ContextUtils.getBean(com.uas.search.console.b2b.jms.platformmanager.LuceneMessageDao.class);
+            default:
+                throw new IllegalArgumentException("Unsupported datasource qualifier: " + dataSourceQualifier);
+        }
+    }
+
+}

+ 0 - 111
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneQueueMessage.java

@@ -1,111 +0,0 @@
-package com.uas.search.console.b2b.jms;
-
-import java.util.Objects;
-
-/**
- * 各个表的数据改动信息(为了实时更新索引,关于各个表的数据更改记录存储在AQ消息队列中)
- * 
- * @author sunyj
- * @since 2016年12月1日 下午3:05:22
- */
-public class LuceneQueueMessage {
-
-	/**
-	 * 在表中的id
-	 */
-	private String messageId;
-
-	/**
-	 * 更改发生的表
-	 */
-	private String tableName;
-
-	/**
-	 * 更改发生的数据的id
-	 */
-	private String ids;
-
-	/**
-	 * 更改发生的数据
-	 */
-	private String data;
-
-	/**
-	 * 更改的类型,INSERT、UPDATE、DELETE
-	 */
-	private String method;
-
-	/**
-	 * 更改发生的时间
-	 */
-	private String modifyTime;
-
-	public String getMessageId() {
-		return messageId;
-	}
-
-	public void setMessageId(String messageId) {
-		this.messageId = messageId;
-	}
-
-	public String getTableName() {
-		return tableName;
-	}
-
-	public void setTableName(String tableName) {
-		this.tableName = tableName;
-	}
-
-	public String getIds() {
-		return ids;
-	}
-
-	public void setIds(String ids) {
-		this.ids = ids;
-	}
-
-	public String getData() {
-		return data;
-	}
-
-	public void setData(String data) {
-		this.data = data;
-	}
-
-	public String getMethod() {
-		return method;
-	}
-
-	public void setMethod(String method) {
-		this.method = method;
-	}
-
-	public String getModifyTime() {
-		return modifyTime;
-	}
-
-	public void setModifyTime(String modifyTime) {
-		this.modifyTime = modifyTime;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-		if (obj == null || getClass() != obj.getClass() || !(obj instanceof LuceneQueueMessage)) {
-			return false;
-		}
-		LuceneQueueMessage other = (LuceneQueueMessage) obj;
-		return Objects.equals(messageId, other.getMessageId()) && Objects.equals(tableName, other.getTableName())
-				&& Objects.equals(ids, other.getIds()) && Objects.equals(data, other.getData())
-				&& Objects.equals(method, other.getMethod()) && Objects.equals(modifyTime, other.getModifyTime());
-	}
-
-	@Override
-	public String toString() {
-		return "LuceneQueueMessage [messageId=" + messageId + ", tableName=" + tableName + ", ids=" + ids + ", data="
-				+ data + ", method=" + method + ", modifyTime=" + modifyTime + "]";
-	}
-
-}

+ 0 - 202
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/LuceneQueueMessageDao.java

@@ -1,202 +0,0 @@
-package com.uas.search.console.b2b.jms;
-
-import com.alibaba.fastjson.JSONObject;
-import com.uas.search.b2b.exception.SearchException;
-import com.uas.search.b2b.model.SPage;
-import com.uas.search.console.b2b.util.JSONUtils;
-import com.uas.search.console.b2b.util.SearchConstants;
-import com.uas.search.util.StringUtils;
-import oracle.sql.STRUCT;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.sql.DataSource;
-import java.sql.*;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author sunyj
- * @since 2016年12月1日 下午5:35:24
- */
-public class LuceneQueueMessageDao {
-
-	/**
-	 * 默认的页码
-	 */
-	private static final int PAGE_INDEX = 1;
-
-	/**
-	 * 默认每页的大小
-	 */
-	private static final int PAGE_SIZE = 20;
-
-	private DataSource dataSource;
-
-	private Logger logger = LoggerFactory.getLogger(getClass());
-
-	public LuceneQueueMessageDao(DataSource dataSource) {
-		this.dataSource = dataSource;
-	}
-
-	/**
-	 * 获取关于实时更新情况的详细信息
-	 * 
-	 * @param page
-	 *            页码
-	 * @param size
-	 *            页大小
-	 * @param searchContent
-	 *            对消息内容进行搜索
-	 * @return 消息(实时更新情况的详细信息)
-	 */
-	public SPage<LuceneQueueMessage> findAll(Integer page, Integer size, String searchContent)
-			throws SQLRecoverableException {
-		if (StringUtils.isEmpty(searchContent)) {
-			searchContent = "";
-		}
-		SPage<LuceneQueueMessage> sPage = new SPage<>();
-
-		// 先获取总数目
-		String sql = "select count(*) from " + SearchConstants.LUCENE_QUEUE_TABLE_NAME
-				+ " t where upper(t.user_data.message) like upper('%" + searchContent + "%')";
-		Connection connection = null;
-		PreparedStatement preparedStatement = null;
-		ResultSet resultSet = null;
-
-		try {
-			connection = dataSource.getConnection();
-			preparedStatement = connection.prepareStatement(sql);
-			resultSet = preparedStatement.executeQuery();
-			resultSet.next();
-			int totalElement = resultSet.getInt(1);
-			sPage.setTotalElement(totalElement);
-			// 总数目为0,返回
-			if (totalElement == 0) {
-				return sPage;
-			}
-			preparedStatement.close();
-			resultSet.close();
-
-			// 处理分页信息
-			if (page == null || page <= 0) {
-				page = PAGE_INDEX;
-			}
-			if (size == null || size <= 0) {
-				size = PAGE_SIZE;
-			}
-
-			int totalPage = (int) Math.ceil(totalElement / (1.0 * size));
-			sPage.setTotalPage(totalPage);
-			// 如果页码过大
-			if (page > totalPage) {
-				page = totalPage;
-			}
-			int minRownum = 1 + (page - 1) * size;
-			int maxRownum = page * size;
-			sPage.setPage(page);
-			sPage.setSize(size);
-			if (page == 1) {
-				sPage.setFirst(true);
-			}
-			if (page == totalPage) {
-				sPage.setLast(true);
-			}
-
-			// 分页获取数据
-			// enq_time为GMT时间,转为本地时间,需加上8小时
-			sql = "select msgid, to_char(enq_time+8/24,'yyyy-mm-dd hh24:mi:ss'),user_data from (select tt.*,rownum r from (select * from "
-					+ SearchConstants.LUCENE_QUEUE_TABLE_NAME + " t where upper(t.user_data.message) like upper('%"
-					+ searchContent + "%') order by enq_time) tt where rownum<=?) ttt where ttt.r >=?";
-			List<LuceneQueueMessage> luceneQueueMessages = new ArrayList<>();
-			preparedStatement = connection.prepareStatement(sql);
-			preparedStatement.setInt(1, maxRownum);
-			preparedStatement.setInt(2, minRownum);
-			resultSet = preparedStatement.executeQuery();
-			while (resultSet.next()) {
-				LuceneQueueMessage luceneQueueMessage = new LuceneQueueMessage();
-				luceneQueueMessage.setMessageId(resultSet.getString(1));
-				luceneQueueMessage.setModifyTime(resultSet.getString(2));
-				STRUCT userData = (STRUCT) resultSet.getObject(3);
-				Object[] attributes = userData.getAttributes();
-				// 自定义消息格式 {"method":"value1","table":"value2","ids":"[1,2,3]"}
-				// 从队列消息中获取表的改动信息
-				JSONObject jsonObject = JSONUtils.parseObject(attributes[0].toString());
-				luceneQueueMessage.setTableName(jsonObject.getString("table"));
-				luceneQueueMessage.setIds(jsonObject.getString("ids"));
-				luceneQueueMessage.setData(JSONUtils.reverseFormat(jsonObject.getString("data")));
-				luceneQueueMessage.setMethod(jsonObject.getString("method"));
-				luceneQueueMessages.add(luceneQueueMessage);
-			}
-			sPage.setContent(luceneQueueMessages);
-		} catch (Throwable e) {
-			throw new SearchException(e).setDetailedMessage(e);
-		} finally {
-			if (resultSet != null) {
-				try {
-					resultSet.close();
-				} catch (SQLException e) {
-					logger.error("", e);
-				}
-			}
-			if (preparedStatement != null) {
-				try {
-					preparedStatement.close();
-				} catch (SQLException e) {
-					logger.error("", e);
-				}
-			}
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException e) {
-					logger.error("", e);
-				}
-			}
-		}
-		return sPage;
-	}
-
-	/**
-	 * 消息队列出队消息
-	 * 
-	 * @param messageId
-	 *            所要出队的消息的id
-	 * @return 是否出队成功
-	 */
-	public boolean dequeueLuceneQueueMessage(String messageId) throws SQLRecoverableException {
-		if (StringUtils.isEmpty(messageId)) {
-			return false;
-		} // 通过dbms_aq.dequeue出队,无法指定所出队的消息,所以直接通过删除表的数据间接达到出队的效果
-		String sql = "delete from " + SearchConstants.LUCENE_QUEUE_TABLE_NAME + " where msgid=?";
-		Connection connection = null;
-		PreparedStatement preparedStatement = null;
-
-		try {
-			connection = dataSource.getConnection();
-			preparedStatement = connection.prepareStatement(sql);
-			preparedStatement.setString(1, messageId);
-			int result = preparedStatement.executeUpdate();
-			connection.commit();
-			return result > 0;
-		} catch (SQLException e) {
-			throw new SearchException("出队消息失败:msgid=" + messageId).setDetailedMessage(e);
-		} finally {
-			if (preparedStatement != null) {
-				try {
-					preparedStatement.close();
-				} catch (SQLException e) {
-					logger.error("", e);
-				}
-			}
-			if (connection != null) {
-				try {
-					connection.close();
-				} catch (SQLException e) {
-					logger.error("", e);
-				}
-			}
-		}
-	}
-
-}

+ 92 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/ParsedQueueMessage.java

@@ -0,0 +1,92 @@
+package com.uas.search.console.b2b.jms;
+
+/**
+ * 对数据库队列里的消息进行解析后所得到的数据
+ * 
+ * @author sunyj
+ * @since 2016年7月7日 下午8:50:13
+ */
+public class ParsedQueueMessage {
+
+    /**
+     * 数据库中表的改动为insert类型
+     */
+    public static final int INSERT = 1;
+
+    /**
+     * 改动为update类型
+     */
+    public static final int UPDATE = 2;
+
+    /**
+     * 改动为delete类型
+     */
+    public static final int DELETE = 3;
+
+    /**
+     * 表改动后,解析消息时,更改的类型
+     */
+    private int methodType;
+
+    /**
+     * 存放解析出来的对象:kind、brand或component、order、purchase等对象
+     */
+    private Object object;
+
+    public ParsedQueueMessage() {
+    }
+
+    public ParsedQueueMessage(int methodType, Object object) {
+        this.methodType = methodType;
+        this.object = object;
+    }
+
+    /**
+     * 是否为insert类型
+     *
+     * @return
+     */
+    public boolean isInsert() {
+        return methodType == INSERT;
+    }
+
+    /**
+     * 是否为update类型
+     *
+     * @return
+     */
+    public boolean isUpdate() {
+        return methodType == UPDATE;
+    }
+
+    /**
+     * 是否为delete类型
+     *
+     * @return
+     */
+    public boolean isDelete() {
+        return methodType == DELETE;
+    }
+
+    public int getMethodType() {
+        return methodType;
+    }
+
+    public void setMethodType(int methodType) {
+        this.methodType = methodType;
+    }
+
+    public Object getObject() {
+        return object;
+    }
+
+    public void setObject(Object object) {
+        this.object = object;
+    }
+
+    @Override
+    public String toString() {
+        return "ParsedQueueMessage [methodType=" + methodType + ", object=" + object + "]";
+    }
+
+}

+ 51 - 107
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/QueueMessageParser.java

@@ -1,163 +1,107 @@
 package com.uas.search.console.b2b.jms;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.stereotype.Service;
-import com.uas.search.util.StringUtils;
-
-import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONException;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.search.b2b.exception.SearchException;
 import com.uas.search.b2b.service.SearchService.Table_name;
-import com.uas.search.console.b2b.model.ParsedQueueMessage;
 import com.uas.search.console.b2b.util.ClassAndTableNameUtils;
-import com.uas.search.console.b2b.util.JSONUtils;
+import com.uas.search.util.StringUtils;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Service;
 
 /**
  * 对得到的队列消息进行解析的工具
- * 
+ *
  * @author sunyj
- * @param <T>
  * @since 2016年11月9日 上午11:30:02
  */
 @Service
 public class QueueMessageParser {
 
-	/**
-	 * 对得到的json消息进行解析
-	 * 
-	 * @param message
-	 *            消息队列里的消息
-	 * @return ParsedQueueMessage对象
-	 * @throws JSONException
-	 */
-	// {"method":"value1","table":"value2","ids":"[1,2,3]"}
-	// {"method":"value1","table":"value2","data":[{"pr_id":1,"pr_code":"ff"},{...}]}
-	public ParsedQueueMessage parse(String message) throws JSONException {
-		if (StringUtils.isEmpty(message) || message.equals("{}")) {
-			return null;
+    /**
+     * 对得到的json消息进行解析
+     *
+     * @param tableName  表名
+     * @param dataId     数据 id
+     * @param methodType 更改类型
+     * @param data       数据
+     * @return ParsedQueueMessage对象
+     * @throws JSONException
+     */
+    public ParsedQueueMessage parse(String tableName, Long dataId, String methodType, String data) throws JSONException {
+		if (StringUtils.isEmpty(tableName) || StringUtils.isEmpty(methodType)) {
+            throw new IllegalArgumentException("tableName 或 methodType 不合法");
 		}
-		JSONObject jsonObject = JSONUtils.parseObject(message);
-		if (!jsonObject.containsKey("method") || !jsonObject.containsKey("table")) {
-			return null;
-		}
-
-		// ids或data必须有一个存在
-		if (!jsonObject.containsKey("ids") && !jsonObject.containsKey("data")) {
-			return null;
+		// id 或 data 必须有一个存在
+		if (dataId == null && StringUtils.isEmpty(data)) {
+            throw new IllegalArgumentException("dataId 和 data 不合法");
 		}
 
 		ParsedQueueMessage parsedQueueMessage = new ParsedQueueMessage();
 		// 解析数据库表的更改类型
-		String method = jsonObject.getString("method");
-		if (method.equalsIgnoreCase("insert")) {
+		if (methodType.equalsIgnoreCase("insert")) {
 			parsedQueueMessage.setMethodType(ParsedQueueMessage.INSERT);
 		}
 
-		else if (method.equalsIgnoreCase("update")) {
+		else if (methodType.equalsIgnoreCase("update")) {
 			parsedQueueMessage.setMethodType(ParsedQueueMessage.UPDATE);
 		}
 
-		else if (method.equalsIgnoreCase("delete")) {
+		else if (methodType.equalsIgnoreCase("delete")) {
 			parsedQueueMessage.setMethodType(ParsedQueueMessage.DELETE);
 		} else {
-			return null;
+            throw new IllegalStateException("unsupported method type: " + methodType);
 		}
 
 		// 解析哪个表有更改
-		String table = jsonObject.getString("table");
-		Class<?> clazz = ClassAndTableNameUtils.toClass(Table_name.valueOf(table.toUpperCase()));
-		Object[] objects = null;
-		if (jsonObject.containsKey("ids")) {
-			objects = parseToListByIds(jsonObject, clazz).toArray();
+		Class<?> clazz = ClassAndTableNameUtils.toClass(Table_name.valueOf(tableName.toUpperCase()));
+        Object object;
+		if (dataId != null) {
+            object = parseById(dataId, clazz, methodType);
 		} else {
-			objects = parseToListByData(jsonObject, clazz).toArray();
+            object = parseByData(data, clazz);
 		}
 
-		parsedQueueMessage.setObjects(objects);
+		parsedQueueMessage.setObject(object);
 		return parsedQueueMessage;
 	}
 
-	/**
-	 * 根据消息队列的消息解析对象
-	 * 
-	 * @param <T>
-	 * 
-	 * @param jsonObject
-	 *            消息转为的json对象
-	 * @param clazz
-	 *            实体类型
-	 * @return 实体对象列表
-	 */
-	private <T> List<T> parseToListByData(JSONObject jsonObject, Class<T> clazz) {
-		List<T> list = new ArrayList<>();
-		JSONArray jsonArray = JSONObject.parseArray(jsonObject.getString("data"));
-		if (jsonArray == null || jsonArray.isEmpty()) {
-			return list;
-		}
-		for (Object obj : jsonArray) {
-			T object = JSONObject.parseObject(obj.toString(), clazz);
-			list.add(object);
-		}
-		return list;
+    /**
+     * 根据消息队列的消息解析对象
+     *
+     * @param <T>
+     * @param data       数据
+     * @param clazz      实体类型
+     * @return 实体对象
+     */
+    private <T> T parseByData(String data, Class<T> clazz) {
+        return JSONObject.parseObject(data, clazz);
 	}
 
 	/**
 	 * 根据消息队列的消息解析对象
-	 * 
+	 *
 	 * @param <T>
-	 * 
-	 * @param jsonObject
-	 *            消息转为的json对象
-	 * @param clazz
-	 *            实体类型
-	 * @return 实体对象列表
+	 *
+     * @param dataId     数据 id
+     * @param clazz      实体类型
+     * @param methodType 更改类型
+     * @return 实体对象
 	 */
-	private <T> List<T> parseToListByIds(JSONObject jsonObject, Class<T> clazz) {
+	private <T> T parseById(Long dataId, Class<T> clazz, String methodType) {
 		// 获取实体的dao
 		JpaRepository<T, Long> dao = ClassAndTableNameUtils.getDao(clazz);
-		Set<Long> ids = getIds(jsonObject.getJSONArray("ids"));
-		List<T> list = new ArrayList<>();
 		// delete操作
 		// 删除后数据库中可能已经没有相应数据了,无法通过dao获取,需要手动创建对象
-		if (jsonObject.getString("method").equalsIgnoreCase("delete")) {
-			for (Long id : ids) {
-				list.add(ClassAndTableNameUtils.createObject(clazz, id));
-			}
+		if (methodType.equalsIgnoreCase("delete")) {
+			return ClassAndTableNameUtils.createObject(clazz, dataId);
 		} else {
 			try {
-				list = dao.findAll(ids);
-			} catch (Throwable e) {
+				return dao.findOne(dataId);
+			} catch (Exception e) {
 				// 防止SQLRecoverableException导致应用终止
 				throw new SearchException(e).setDetailedMessage(e);
 			}
 		}
-
-		return list;
 	}
-
-	/**
-	 * 从队列消息中获取id(同时消除重复id)
-	 * 
-	 * @param jsonArray
-	 *            队列消息中json格式的id
-	 * @return
-	 */
-	private Set<Long> getIds(JSONArray jsonArray) {
-		if (jsonArray == null || jsonArray.isEmpty()) {
-			return null;
-		}
-		Object[] ids = jsonArray.toArray();
-		Set<Long> idsSet = new HashSet<>();
-		for (int i = 0; i < ids.length; i++) {
-			idsSet.add(Long.parseLong(ids[i].toString()));
-		}
-		return idsSet;
-	}
-
 }

+ 0 - 58
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/QueueMessageTypeFactory.java

@@ -1,58 +0,0 @@
-package com.uas.search.console.b2b.jms;
-
-import java.sql.SQLException;
-
-import oracle.jdbc.OracleTypes;
-import oracle.jdbc.driver.OracleConnection;
-import oracle.jpub.runtime.MutableStruct;
-import oracle.sql.CustomDatum;
-import oracle.sql.CustomDatumFactory;
-import oracle.sql.Datum;
-import oracle.sql.STRUCT;
-
-/**
- * 对数据库的数据格式进行转换
- * 
- * @author sunyj
- * @since 2016年7月7日 下午8:49:44
- */
-@SuppressWarnings("deprecation")
-public class QueueMessageTypeFactory implements CustomDatum, CustomDatumFactory {
-
-	public static final int SQL_TYPECODE = OracleTypes.STRUCT;
-
-	MutableStruct struct;
-
-	// 12表示字符串
-	static int[] sqlType = { 12 };
-	static CustomDatumFactory[] factory = new CustomDatumFactory[1];
-	static final QueueMessageTypeFactory messageFactory = new QueueMessageTypeFactory();
-
-	public QueueMessageTypeFactory() {
-		struct = new MutableStruct(new Object[1], sqlType, factory);
-	}
-
-	public static CustomDatumFactory getFactory() {
-		return messageFactory;
-	}
-
-	@Override
-	public CustomDatum create(Datum datum, int sqlType) throws SQLException {
-		if (datum == null) {
-			return null;
-		}
-		QueueMessageTypeFactory queueMessageType = new QueueMessageTypeFactory();
-		queueMessageType.struct = new MutableStruct((STRUCT) datum, QueueMessageTypeFactory.sqlType, factory);
-		return queueMessageType;
-	}
-
-	@Override
-	public Datum toDatum(OracleConnection connection) throws SQLException {
-		return struct.toDatum(connection, "QueueMessageTypeFactory");
-	}
-
-	public String getMessage() throws SQLException {
-		return (String) struct.getAttribute(0);
-	}
-
-}

+ 155 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/platformb2b/LuceneMessage.java

@@ -0,0 +1,155 @@
+package com.uas.search.console.b2b.jms.platformb2b;
+
+import com.uas.search.console.b2b.jms.LuceneMessageInterface;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 用于实时更新的消息
+ *
+ * @author sunyj
+ * @since 2016年12月1日 下午3:05:22
+ */
+@Entity
+@Table(name = "lucene$message")
+public class LuceneMessage implements Serializable, LuceneMessageInterface {
+
+    /**
+     * 序列号
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @Id
+    @Column(name = "me_id")
+    private Long id;
+
+    /**
+     * 表名
+     */
+    @Column(name = "me_table_name")
+    private String tableName;
+
+    /**
+     * 更改类型
+     */
+    @Column(name = "me_method_type")
+    private String methodType;
+
+    /**
+     * 数据 id
+     */
+    @Column(name = "me_data_id")
+    private Long dataId;
+
+    /**
+     * 数据,可为空
+     */
+    @Column(name = "me_data")
+    private String data;
+
+    /**
+     * 优先级
+     */
+    @Column(name = "me_priority")
+    private Long priority;
+
+    /**
+     * 尝试次数
+     */
+    @Column(name = "me_retry_count")
+    private Long retryCount;
+
+    /**
+     * 时间
+     */
+    @Column(name = "me_create_time")
+    private Date createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public String getMethodType() {
+        return methodType;
+    }
+
+    public void setMethodType(String methodType) {
+        this.methodType = methodType;
+    }
+
+    public Long getDataId() {
+        return dataId;
+    }
+
+    public void setDataId(Long dataId) {
+        this.dataId = dataId;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public Long getPriority() {
+        return priority;
+    }
+
+    public void setPriority(Long priority) {
+        this.priority = priority;
+    }
+
+    public Long getRetryCount() {
+        return retryCount;
+    }
+
+    public void setRetryCount(Long retryCount) {
+        this.retryCount = retryCount;
+    }
+
+    public String getCreateTime() {
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime);
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public String toString() {
+        return "LuceneMessage{" +
+                "id=" + id +
+                ", tableName='" + tableName + '\'' +
+                ", methodType='" + methodType + '\'' +
+                ", dataId=" + dataId +
+                ", data='" + data + '\'' +
+                ", priority=" + priority +
+                ", retryCount=" + retryCount +
+                ", createTime=" + createTime +
+                '}';
+    }
+}
+

+ 47 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/platformb2b/LuceneMessageDao.java

@@ -0,0 +1,47 @@
+package com.uas.search.console.b2b.jms.platformb2b;
+
+import com.uas.search.console.b2b.jms.LuceneMessageDaoInterface;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.query.Procedure;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author sunyj
+ * @since 2016年12月1日 下午5:35:24
+ */
+@Repository("platformb2bLuceneMessageDao")
+public interface LuceneMessageDao
+        extends JpaSpecificationExecutor<LuceneMessage>, JpaRepository<LuceneMessage, Long>, LuceneMessageDaoInterface {
+
+    /**
+     * 获取指定数目的数据
+     *
+     * @param start 开始的记录
+     * @param size  指定数目
+     * @return 数据
+     */
+    @Query(value = "select * from lucene$message where me_retry_count < 5 order by me_priority desc, me_id limit ?1, ?2", nativeQuery = true)
+    List<LuceneMessage> findList(Integer start, Integer size);
+
+    /**
+     * 统计行数
+     *
+     * @return 行数
+     */
+    @Query(value = "select count(1) from lucene$message where me_retry_count < 5", nativeQuery = true)
+    long count();
+
+    /**
+     * 出队消息
+     *
+     * @param id 消息 id
+     */
+    @Transactional
+    @Procedure(procedureName = "dequeue_lucene_message")
+    void dequeueLuceneMessage(Long id);
+}

+ 155 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/platformmanager/LuceneMessage.java

@@ -0,0 +1,155 @@
+package com.uas.search.console.b2b.jms.platformmanager;
+
+import com.uas.search.console.b2b.jms.LuceneMessageInterface;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 用于实时更新的消息
+ *
+ * @author sunyj
+ * @since 2016年12月1日 下午3:05:22
+ */
+@Entity
+@Table(name = "lucene$message")
+public class LuceneMessage implements Serializable, LuceneMessageInterface {
+
+    /**
+     * 序列号
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @Id
+    @Column(name = "me_id")
+    private Long id;
+
+    /**
+     * 表名
+     */
+    @Column(name = "me_table_name")
+    private String tableName;
+
+    /**
+     * 更改类型
+     */
+    @Column(name = "me_method_type")
+    private String methodType;
+
+    /**
+     * 数据 id
+     */
+    @Column(name = "me_data_id")
+    private Long dataId;
+
+    /**
+     * 数据,可为空
+     */
+    @Column(name = "me_data")
+    private String data;
+
+    /**
+     * 优先级
+     */
+    @Column(name = "me_priority")
+    private Long priority;
+
+    /**
+     * 尝试次数
+     */
+    @Column(name = "me_retry_count")
+    private Long retryCount;
+
+    /**
+     * 时间
+     */
+    @Column(name = "me_create_time")
+    private Date createTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public String getMethodType() {
+        return methodType;
+    }
+
+    public void setMethodType(String methodType) {
+        this.methodType = methodType;
+    }
+
+    public Long getDataId() {
+        return dataId;
+    }
+
+    public void setDataId(Long dataId) {
+        this.dataId = dataId;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public Long getPriority() {
+        return priority;
+    }
+
+    public void setPriority(Long priority) {
+        this.priority = priority;
+    }
+
+    public Long getRetryCount() {
+        return retryCount;
+    }
+
+    public void setRetryCount(Long retryCount) {
+        this.retryCount = retryCount;
+    }
+
+    public String getCreateTime() {
+        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime);
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    @Override
+    public String toString() {
+        return "LuceneMessage{" +
+                "id=" + id +
+                ", tableName='" + tableName + '\'' +
+                ", methodType='" + methodType + '\'' +
+                ", dataId=" + dataId +
+                ", data='" + data + '\'' +
+                ", priority=" + priority +
+                ", retryCount=" + retryCount +
+                ", createTime=" + createTime +
+                '}';
+    }
+}
+

+ 47 - 0
search-console-b2b/src/main/java/com/uas/search/console/b2b/jms/platformmanager/LuceneMessageDao.java

@@ -0,0 +1,47 @@
+package com.uas.search.console.b2b.jms.platformmanager;
+
+import com.uas.search.console.b2b.jms.LuceneMessageDaoInterface;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.query.Procedure;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author sunyj
+ * @since 2016年12月1日 下午5:35:24
+ */
+@Repository("platformmanagerLuceneMessageDao")
+public interface LuceneMessageDao
+        extends JpaSpecificationExecutor<LuceneMessage>, JpaRepository<LuceneMessage, Long>, LuceneMessageDaoInterface {
+
+    /**
+     * 获取指定数目的数据
+     *
+     * @param start 开始的记录
+     * @param size  指定数目
+     * @return 数据
+     */
+    @Query(value = "select * from lucene$message where me_retry_count < 5 order by me_priority desc, me_id limit ?1, ?2", nativeQuery = true)
+    List<LuceneMessage> findList(Integer start, Integer size);
+
+    /**
+     * 统计行数
+     *
+     * @return 行数
+     */
+    @Query(value = "select count(1) from lucene$message where me_retry_count < 5", nativeQuery = true)
+    long count();
+
+    /**
+     * 出队消息
+     *
+     * @param id 消息 id
+     */
+    @Transactional
+    @Procedure(procedureName = "dequeue_lucene_message")
+    void dequeueLuceneMessage(Long id);
+}

+ 0 - 86
search-console-b2b/src/main/java/com/uas/search/console/b2b/model/ParsedQueueMessage.java

@@ -1,86 +0,0 @@
-package com.uas.search.console.b2b.model;
-
-import java.util.Arrays;
-
-/**
- * 对数据库队列里的消息进行解析后所得到的数据
- * 
- * @author sunyj
- * @since 2016年7月7日 下午8:50:13
- */
-public class ParsedQueueMessage {
-
-	/**
-	 * 数据库中表的改动为insert类型
-	 */
-	public static final int INSERT = 1;
-
-	/**
-	 * 改动为update类型
-	 */
-	public static final int UPDATE = 2;
-
-	/**
-	 * 改动为delete类型
-	 */
-	public static final int DELETE = 3;
-
-	/**
-	 * 表改动后,解析消息时,更改的类型
-	 */
-	private int methodType;
-
-	/**
-	 * 存放解析出来的对象
-	 */
-	private Object[] objects;
-
-	/**
-	 * 是否为insert类型
-	 * 
-	 * @return
-	 */
-	public boolean isInsert() {
-		return methodType == INSERT;
-	}
-
-	/**
-	 * 是否为update类型
-	 * 
-	 * @return
-	 */
-	public boolean isUpdate() {
-		return methodType == UPDATE;
-	}
-
-	/**
-	 * 是否为delete类型
-	 * 
-	 * @return
-	 */
-	public boolean isDelete() {
-		return methodType == DELETE;
-	}
-
-	public int getMethodType() {
-		return methodType;
-	}
-
-	public void setMethodType(int methodType) {
-		this.methodType = methodType;
-	}
-
-	public Object[] getObjects() {
-		return objects;
-	}
-
-	public void setObjects(Object[] objects) {
-		this.objects = objects;
-	}
-
-	@Override
-	public String toString() {
-		return "ParsedQueueMessage [methodType=" + methodType + ", object=" + Arrays.toString(objects) + "]";
-	}
-
-}

+ 2 - 8
search-console-b2b/src/main/java/com/uas/search/console/b2b/model/PurcProofingapprovalSimpleInfo.java

@@ -1,16 +1,10 @@
 package com.uas.search.console.b2b.model;
 
+import javax.persistence.*;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
 /**
  * 平台里面,客户收到供应商的送样后的认定单
  * 
@@ -45,7 +39,7 @@ public class PurcProofingapprovalSimpleInfo {
 
 	public static final String PRODDETAIL_FIELD = "psa_proddetail";
 
-	public static final String PRODSPEC_FIELD = "psa_prodSpec";
+	public static final String PRODSPEC_FIELD = "psa_prodspec";
 
 	public static final String VEND_FIELD = "psa_venduu";
 

+ 4 - 4
search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/model/DailyTaskInformation.java

@@ -1,12 +1,12 @@
 package com.uas.search.console.b2b.schedule.model;
 
+import com.uas.search.b2b.exception.SearchException;
+import com.uas.search.console.b2b.schedule.service.Executable;
+
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Objects;
 
-import com.uas.search.b2b.exception.SearchException;
-import com.uas.search.console.b2b.schedule.service.Executable;
-
 /**
  * 每天定时任务
  * 
@@ -52,7 +52,7 @@ public class DailyTaskInformation extends TaskInformation {
 		setTitle(title);
 		setCommand(command);
 		setInitialDelay(getInitialDelay());
-		setPeriod(MILLISECONDS_OF_ONE_DAY);
+		setInterval(MILLISECONDS_OF_ONE_DAY);
 	}
 
 	public int getHour() {

+ 100 - 39
search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/model/TaskInformation.java

@@ -1,8 +1,9 @@
 package com.uas.search.console.b2b.schedule.model;
 
-import java.util.Objects;
-
 import com.uas.search.console.b2b.schedule.service.Executable;
+import com.uas.search.util.CodeGenerator;
+
+import java.util.Objects;
 
 /**
  * 定时任务信息
@@ -11,6 +12,12 @@ import com.uas.search.console.b2b.schedule.service.Executable;
  * @since 2016年12月19日 上午10:21:28
  */
 public class TaskInformation {
+
+    /**
+     * 任务 code
+     */
+    private String code;
+
 	/**
 	 * 任务标题
 	 */
@@ -26,22 +33,37 @@ public class TaskInformation {
 	 */
 	private long initialDelay;
 
-	/**
-	 * 两次任务之间的等待时间间隔(毫秒)
-	 */
-	private long period;
+    /**
+     * 两次任务之间的等待时间间隔(毫秒)
+     */
+    private long interval;
+
+    private ScheduleType scheduleType;
 
 	public TaskInformation() {
 		super();
 	}
 
-	public TaskInformation(String title, Executable command, long initialDelay, long period) {
-		super();
-		this.title = title;
-		this.command = command;
-		this.initialDelay = initialDelay;
-		this.period = period;
-	}
+    public TaskInformation(String title, Executable command, long initialDelay, long interval, ScheduleType scheduleType) {
+        init();
+        this.title = title;
+        this.command = command;
+        this.initialDelay = initialDelay;
+        this.interval = interval;
+        this.scheduleType = scheduleType;
+    }
+
+    public void init(){
+        code = CodeGenerator.getGenerator().generate();
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
 
 	public String getTitle() {
 		return title;
@@ -67,31 +89,70 @@ public class TaskInformation {
 		this.initialDelay = initialDelay;
 	}
 
-	public long getPeriod() {
-		return period;
-	}
-
-	public void setPeriod(long period) {
-		this.period = period;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-		if (obj == null || getClass() != obj.getClass() || !(obj instanceof TaskInformation)) {
-			return false;
-		}
-		TaskInformation other = (TaskInformation) obj;
-		// command不好比较,不进行比较
-		return Objects.equals(title, other.getTitle()) && initialDelay == other.getInitialDelay()
-				&& period == other.getPeriod();
-	}
-
-	@Override
-	public String toString() {
-		return "TaskInformation [title=" + title + ", initialDelay=" + initialDelay + ", period=" + period + "]";
-	}
+    public long getInterval() {
+        return interval;
+    }
+
+    public void setInterval(long interval) {
+        this.interval = interval;
+    }
+
+    public ScheduleType getScheduleType() {
+        return scheduleType;
+    }
+
+    public void setScheduleType(ScheduleType scheduleType) {
+        this.scheduleType = scheduleType;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null || getClass() != obj.getClass() || !(obj instanceof TaskInformation)) {
+            return false;
+        }
+        TaskInformation other = (TaskInformation) obj;
+        // command不好比较,不进行比较,也不比较 code
+        return Objects.equals(title, other.getTitle()) && initialDelay == other.getInitialDelay()
+                && interval == other.getInterval() && scheduleType == other.getScheduleType();
+    }
+
+    @Override
+    public String toString() {
+        return "TaskInformation [code=" + code + ", title=" + title + ", initialDelay=" + initialDelay + ", interval=" + interval + ", scheduleType=" + scheduleType + "]";
+    }
+
+    /**
+     * 定时的间隔类型
+     */
+    public enum ScheduleType {
+        /**
+         * Creates and executes a periodic action that becomes enabled first
+         * after the given initial delay, and subsequently with the given
+         * period; that is executions will commence after
+         * <tt>initialDelay</tt> then <tt>initialDelay+period</tt>, then
+         * <tt>initialDelay + 2 * period</tt>, and so on.
+         * If any execution of the task
+         * encounters an exception, subsequent executions are suppressed.
+         * Otherwise, the task will only terminate via cancellation or
+         * termination of the executor.  If any execution of this task
+         * takes longer than its period, then subsequent executions
+         * may start late, but will not concurrently execute.
+         */
+        FixedRate,
+
+        /**
+         * Creates and executes a periodic action that becomes enabled first
+         * after the given initial delay, and subsequently with the
+         * given delay between the termination of one execution and the
+         * commencement of the next.  If any execution of the task
+         * encounters an exception, subsequent executions are suppressed.
+         * Otherwise, the task will only terminate via cancellation or
+         * termination of the executor.
+         */
+        FixedDelay
+    }
 
 }

+ 17 - 2
search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/service/TaskService.java

@@ -1,9 +1,9 @@
 package com.uas.search.console.b2b.schedule.service;
 
-import java.util.List;
-
 import com.uas.search.console.b2b.schedule.model.TaskInformation;
 
+import java.util.List;
+
 /**
  * 管理定时任务
  * 
@@ -19,6 +19,21 @@ public interface TaskService {
 	 */
 	public void newTask(TaskInformation taskInformation);
 
+    /**
+     * 根据指定的 code,移除定时任务
+     *
+     * @param code 任务的 code
+     */
+    void remove(String code);
+
+    /**
+     * 是否存在定时任务
+     *
+     * @param code 任务的 code
+     * @return true 则存在
+     */
+    boolean exist(String code);
+
 	/**
 	 * 根据任务标题删除定时任务
 	 * 

+ 57 - 24
search-console-b2b/src/main/java/com/uas/search/console/b2b/schedule/service/impl/TaskServiceImpl.java

@@ -1,27 +1,27 @@
 package com.uas.search.console.b2b.schedule.service.impl;
 
+import com.uas.search.console.b2b.schedule.model.TaskInformation;
+import com.uas.search.console.b2b.schedule.model.TaskLog;
+import com.uas.search.console.b2b.schedule.service.Executable;
+import com.uas.search.console.b2b.schedule.service.TaskService;
+import com.uas.search.util.CollectionUtils;
+import com.uas.search.util.ExceptionUtils;
+import com.uas.search.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-import com.uas.search.util.CollectionUtils;
-import com.uas.search.util.StringUtils;
-
-import com.uas.search.b2b.exception.SearchException;
-import com.uas.search.console.b2b.schedule.model.TaskInformation;
-import com.uas.search.console.b2b.schedule.model.TaskLog;
-import com.uas.search.console.b2b.schedule.service.Executable;
-import com.uas.search.console.b2b.schedule.service.TaskService;
-
 /**
  * 管理定时任务
  * 
@@ -52,14 +52,41 @@ public class TaskServiceImpl implements TaskService {
 	public void newTask(TaskInformation taskInformation) {
 		if (taskInformation == null || StringUtils.isEmpty(taskInformation.getTitle())
 				|| taskInformation.getCommand() == null) {
-			throw new NullPointerException();
+            throw new IllegalArgumentException("定时任务的 title 和 command 不可为空");
 		}
-		if (containsTask(taskInformation)) {
-			throw new SearchException("任务已存在:" + taskInformation);
+		if (contain(taskInformation)) {
+            throw new IllegalStateException("任务已存在:" + taskInformation);
 		}
 		taskInformations.add(taskInformation);
 	}
 
+    @Override
+    public void remove(String code) {
+        if (StringUtils.isEmpty(code)) {
+            throw new IllegalArgumentException("code 不可为空");
+        }
+        for (TaskInformation d : taskInformations) {
+            if (Objects.equals(code, d.getCode())) {
+                taskInformations.remove(d);
+                return;
+            }
+        }
+        throw new IllegalArgumentException("定时任务不存在:" + code);
+    }
+
+    @Override
+    public boolean exist(String code) {
+        if (StringUtils.isEmpty(code)) {
+            throw new IllegalArgumentException("code 不可为空");
+        }
+        for (TaskInformation d : taskInformations) {
+            if (Objects.equals(code, d.getCode())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 	@Override
 	public List<TaskInformation> delete(List<String> titles) {
 		List<TaskInformation> result = new ArrayList<>();
@@ -100,7 +127,7 @@ public class TaskServiceImpl implements TaskService {
 	 * @param taskInformation
 	 * @return
 	 */
-	private boolean containsTask(TaskInformation taskInformation) {
+	private boolean contain(TaskInformation taskInformation) {
 		if (CollectionUtils.isEmpty(taskInformations)) {
 			return false;
 		}
@@ -128,7 +155,6 @@ public class TaskServiceImpl implements TaskService {
 			fileWriter = new FileWriter(logFilePath, true);
 			fileWriter.write(log.toJSONString() + "\n");
 			fileWriter.flush();
-			logger.info("Saved task log:" + log.toJSONString() + " to " + logFilePath + "\n");
 		} catch (IOException e) {
 			logger.error("", e);
 		} finally {
@@ -160,9 +186,17 @@ public class TaskServiceImpl implements TaskService {
 			scheduledExecutorService = Executors.newScheduledThreadPool(1);
 			for (TaskInformation taskInformation : taskInformations) {
 				logger.info("New task: " + taskInformation);
-				scheduledExecutorService.scheduleAtFixedRate(getCommand(taskInformation),
-						taskInformation.getInitialDelay(), taskInformation.getPeriod(), TimeUnit.MILLISECONDS);
-			}
+                switch (taskInformation.getScheduleType()){
+                    case FixedRate:
+                        scheduledExecutorService.scheduleAtFixedRate(getCommand(taskInformation),
+                                taskInformation.getInitialDelay(), taskInformation.getInterval(), TimeUnit.MILLISECONDS);
+                        break;
+                    case FixedDelay:
+                        scheduledExecutorService.scheduleWithFixedDelay(getCommand(taskInformation),
+                                taskInformation.getInitialDelay(), taskInformation.getInterval(), TimeUnit.MILLISECONDS);
+                        break;
+                }
+            }
 			message = "已开启定时任务:" + taskInformations;
 			logger.info(message + "\n");
 			return message;
@@ -184,14 +218,13 @@ public class TaskServiceImpl implements TaskService {
 			@Override
 			public void run() {
 				try {
-					logger.info("Task run...");
 					Executable command = taskInformation.getCommand();
 					String result = command.execute();
 					saveLog(new TaskLog(taskInformation, new Date(), result));
 				} catch (Exception e) {
-					saveLog(new TaskLog(taskInformation, new Date(),
-							"定时任务出错" + new SearchException(e).getDetailedMessage(e)));
-				}
+                    saveLog(new TaskLog(taskInformation, new Date(),
+                            "定时任务出错" + ExceptionUtils.getDetailedMessage(e)));
+                }
 			}
 		};
 	}

+ 26 - 57
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/IndexService.java

@@ -1,17 +1,15 @@
 package com.uas.search.console.b2b.service;
 
-import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.service.SearchService.Table_name;
-import com.uas.search.console.b2b.jms.LuceneQueueMessage;
-import com.uas.search.console.b2b.model.ParsedQueueMessage;
+import com.uas.search.console.b2b.jms.ParsedQueueMessage;
 import com.uas.search.console.b2b.support.DownloadHelper;
-import com.uas.search.console.b2b.util.SearchConstants.DataSourceQualifier;
 
+import java.io.IOException;
 import java.util.List;
 
 /**
  * 索引处理
- * 
+ *
  * @author sunyj
  * @since 2016年11月10日 上午9:55:00
  */
@@ -19,7 +17,7 @@ public interface IndexService {
 
 	/**
 	 * 创建指定表的索引
-	 * 
+	 *
 	 * @param tableNames
 	 *            可为空,指定的表,默认创建所有表的索引
 	 * @param fromFiles
@@ -28,11 +26,11 @@ public interface IndexService {
 	 *            可为空,是否开启实时更新,默认开启
 	 * @return 创建的索引花费总时间 ms
 	 */
-	public Long createIndexes(List<Table_name> tableNames, Boolean fromFiles, Boolean ifStartListener);
+	public Long createIndexes(List<Table_name> tableNames, Boolean fromFiles, Boolean ifStartListener) throws IOException, InterruptedException;
 
 	/**
 	 * 下载指定表的数据至本地文件中,以供建索引用
-	 * 
+	 *
 	 * @param tableNames
 	 *            可为空,指定的表,默认下载所有表的数据
 	 * @return 花费总时间 ms
@@ -72,90 +70,61 @@ public interface IndexService {
 
 	/**
 	 * 将新对象添加在lucene索引中
-	 * 
+	 *
 	 * @param <T>
-	 * 
+	 *
 	 * @param obj
 	 */
 	public <T> T save(T obj);
 
 	/**
 	 * 根据新对象对lucene索引进行更新
-	 * 
+	 *
 	 * @param <T>
-	 * 
+	 *
 	 * @param obj
 	 */
 	public <T> T update(T obj);
 
 	/**
 	 * 将对象从lucene索引中删除
-	 * 
+	 *
 	 * @param <T>
-	 * 
+	 *
 	 * @param obj
 	 */
 	public <T> T delete(T obj);
 
 	/**
 	 * 根据自队列消息解析出来的对象,对lucene索引进行添加、更新或删除操作
-	 * 
+	 *
 	 * @param parsedQueueMessage
 	 *            自队列消息解析出来的对象
 	 * @return 维护的对象
 	 */
 	public List<Object> maintainIndexes(ParsedQueueMessage parsedQueueMessage);
 
-	/**
-	 * 根据实体类型名维护出问题的表的索引
-	 * 
-	 * @param tableName
-	 *            需维护的实体类型名
-	 * @param ids
-	 *            需维护的id列表,多个id以英文逗号隔开
-	 * @param method
-	 *            需对索引做何种更改
-	 * @return 维护的对象
-	 */
-	public List<Object> maintainIndexesByIds(String tableName, String ids, String method);
+    /**
+     * 根据实体类型名维护出问题的表的索引
+     *
+     * @param tableName  需维护的实体类型名
+     * @param dataId     需维护的id
+     * @param methodType 需对索引做何种更改
+     * @param data       数据
+     * @return 维护的对象
+     */
+    List<Object> maintainIndexesById(String tableName, Long dataId, String methodType, String data);
 
 	/**
 	 * 根据实体类型名维护出问题的表的索引
-	 * 
+	 *
 	 * @param tableName
 	 *            需维护的实体类型名
 	 * @param data
 	 *            需维护的数据,JSONArray格式
-	 * @param method
+	 * @param methodType
 	 *            需对索引做何种更改
 	 * @return 维护的对象
 	 */
-	public List<Object> maintainIndexesByData(String tableName, String data, String method);
-
-	/**
-	 * 获取指定数据源实时更新情况的详细信息
-	 * 
-	 * @param dataSourceQualifier
-	 *            数据源标识
-	 * @param page
-	 *            可为空,页码
-	 * @param size
-	 *            可为空,页大小
-	 * @param searchContent
-	 *            可为空,对消息内容进行搜索
-	 * @return 等待更新的数据的信息
-	 */
-	public SPage<LuceneQueueMessage> getListenDetails(DataSourceQualifier dataSourceQualifier, Integer page,
-			Integer size, String searchContent);
-
-	/**
-	 * 指定数据源消息队列出队消息
-	 * 
-	 * @param dataSourceQualifier
-	 *            数据源标识
-	 * @param messageId
-	 *            所要出队的消息的id
-	 * @return 是否出队成功
-	 */
-	public boolean dequeueLuceneQueueMessage(DataSourceQualifier dataSourceQualifier, String messageId);
+    List<Object> maintainIndexesByData(String tableName, String data, String methodType);
 }

+ 38 - 89
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/IndexServiceImpl.java

@@ -1,19 +1,15 @@
 package com.uas.search.console.b2b.service.impl;
 
-import com.alibaba.druid.pool.DruidDataSource;
 import com.alibaba.fastjson.JSONObject;
 import com.uas.search.b2b.exception.SearchException;
 import com.uas.search.b2b.model.PageParams;
-import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.service.SearchService.Table_name;
 import com.uas.search.console.b2b.DruidDBConfiguration;
 import com.uas.search.console.b2b.LuceneProperties;
-import com.uas.search.console.b2b.jms.AQListener;
-import com.uas.search.console.b2b.jms.LuceneQueueMessage;
-import com.uas.search.console.b2b.jms.LuceneQueueMessageDao;
+import com.uas.search.console.b2b.jms.JmsListener;
+import com.uas.search.console.b2b.jms.ParsedQueueMessage;
 import com.uas.search.console.b2b.jms.QueueMessageParser;
 import com.uas.search.console.b2b.model.PageInfo;
-import com.uas.search.console.b2b.model.ParsedQueueMessage;
 import com.uas.search.console.b2b.service.IndexService;
 import com.uas.search.console.b2b.support.DownloadHelper;
 import com.uas.search.console.b2b.support.DownloadService;
@@ -22,7 +18,6 @@ import com.uas.search.console.b2b.support.IndexWriterManager;
 import com.uas.search.console.b2b.util.ClassAndTableNameUtils;
 import com.uas.search.console.b2b.util.FileUtils;
 import com.uas.search.console.b2b.util.ObjectToDocumentUtils;
-import com.uas.search.console.b2b.util.SearchConstants.DataSourceQualifier;
 import com.uas.search.console.b2b.util.SearchUtils;
 import com.uas.search.util.ArrayUtils;
 import com.uas.search.util.CollectionUtils;
@@ -38,8 +33,9 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Service;
 
 import java.io.*;
-import java.sql.SQLRecoverableException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 创建索引等
@@ -51,7 +47,7 @@ import java.util.*;
 public class IndexServiceImpl implements IndexService {
 
 	@Autowired
-	private AQListener aqListener;
+	private JmsListener jmsListener;
 
 	@Autowired
 	private QueueMessageParser queueMessageParser;
@@ -86,13 +82,13 @@ public class IndexServiceImpl implements IndexService {
 	private static IndexWriterManager indexWriterManager = new IndexWriterManager();
 
 	@Override
-	public Long createIndexes(List<Table_name> tableNames, Boolean fromFiles, Boolean ifStartListener) {
+	public Long createIndexes(List<Table_name> tableNames, Boolean fromFiles, Boolean ifStartListener) throws IOException, InterruptedException {
 		if (creatingIndex) {
 			throw new SearchException("已存在线程在创建索引,不可重复请求");
 		}
 		creatingIndex = true;
 		// 如果索引实时更新处于开启状态,需要关闭(以免两者同时操作索引出现问题)
-		aqListener.stop(null);
+		jmsListener.stop(null);
 
 		if (CollectionUtils.isEmpty(tableNames)) {
 			tableNames = ClassAndTableNameUtils.getTableNames();
@@ -109,13 +105,10 @@ public class IndexServiceImpl implements IndexService {
 				}
 				indexSearcherManager.flushCache(tableName, indexWriter, null);
 			}
-		} catch (Throwable e) {
-			// 防止SQLRecoverableException导致应用终止
-			throw new SearchException(e).setDetailedMessage(e);
 		} finally {
 			creatingIndex = false;
 			if (ifStartListener == null || ifStartListener.booleanValue()) {
-				aqListener.start(null, null);
+				jmsListener.start(null, null);
 			}
 		}
 		Long endTime = new Date().getTime();
@@ -462,69 +455,46 @@ public class IndexServiceImpl implements IndexService {
 			throw new SearchException("参数不能为空:parsedQueueMessage");
 		}
 
-		Object[] objects = parsedQueueMessage.getObjects();
-		if (objects == null) {
-			return null;
-		}
+        Object object = parsedQueueMessage.getObject();
+        if (object == null) {
+            return null;
+        }
 		List<Object> maintainedObjects = new ArrayList<>();
-		try {
-			// 新增、更新索引
-			if (parsedQueueMessage.isInsert() || parsedQueueMessage.isUpdate()) {
-				for (Object object : objects) {
-					Object maintainedObject = update(object);
-					if (maintainedObject != null) {
-						maintainedObjects.add(maintainedObject);
-					}
-				}
-			}
-			// 删除索引
-			else if (parsedQueueMessage.isDelete()) {
-				for (Object object : objects) {
-					Object maintainedObject = delete(object);
-					if (maintainedObject != null) {
-						maintainedObjects.add(maintainedObject);
-					}
-				}
-			} else {
-				throw new SearchException("message parsing failed!");
-			}
-		} catch (Throwable e) {
-			throw new SearchException(e).setDetailedMessage(e);
-		}
+        // 新增、更新索引
+        if (parsedQueueMessage.isInsert() || parsedQueueMessage.isUpdate()) {
+            Object maintainedObject = update(object);
+            if (maintainedObject != null) {
+                maintainedObjects.add(maintainedObject);
+            }
+        }
+        // 删除索引
+        else if (parsedQueueMessage.isDelete()) {
+            Object maintainedObject = delete(object);
+            if (maintainedObject != null) {
+                maintainedObjects.add(maintainedObject);
+            }
+        } else {
+            throw new IllegalStateException("message parsing failed!");
+        }
 		return maintainedObjects;
 	}
 
 	@Override
-	public List<Object> maintainIndexesByIds(String tableName, String ids, String method) {
-		if (StringUtils.isEmpty(tableName) || StringUtils.isEmpty(ids) || StringUtils.isEmpty(method)) {
-			throw new SearchException("参数不能为空:tableName,ids,method");
+	public List<Object> maintainIndexesById(String tableName, Long dataId, String methodType, String data) {
+		if (StringUtils.isEmpty(tableName) || dataId ==null || StringUtils.isEmpty(methodType)) {
+			throw new SearchException("参数不能为空:tableName,dataId,methodType");
 		}
-		Map<String, Object> map = new HashMap<>();
-		map.put("table", tableName);
-		String[] strs = ids.split(",");
-		List<Long> idList = new ArrayList<>();
-		for (String str : strs) {
-			idList.add(Long.parseLong(str));
-		}
-		map.put("ids", idList);
-		map.put("method", method);
-		ParsedQueueMessage parsedQueueMessage = queueMessageParser.parse(JSONObject.toJSONString(map));
-
-		if (parsedQueueMessage == null) {
-			logger.error("message parsing failed!");
-			return null;
-		}
-		return maintainIndexes(parsedQueueMessage);
+        ParsedQueueMessage parsedQueueMessage = queueMessageParser.parse(tableName, dataId, methodType, data);
+        return maintainIndexes(parsedQueueMessage);
 	}
 
 	@Override
-	public List<Object> maintainIndexesByData(String tableName, String data, String method) {
-		if (StringUtils.isEmpty(tableName) || StringUtils.isEmpty(data) || StringUtils.isEmpty(method)) {
-			throw new SearchException("参数不能为空:tableName,data,method");
+	public List<Object> maintainIndexesByData(String tableName, String data, String methodType) {
+		if (StringUtils.isEmpty(tableName) || StringUtils.isEmpty(data) || StringUtils.isEmpty(methodType)) {
+			throw new SearchException("参数不能为空:tableName,data,methodType");
 		}
 		// data为json格式数据,并非简单的一个字符串,通过JSONObject构造,双引号、左括号等会被特殊处理
-		String message = "{\"table\":\"" + tableName + "\", \"data\":" + data + ", \"method\":\"" + method + "\"}";
-		ParsedQueueMessage parsedQueueMessage = queueMessageParser.parse(message);
+		ParsedQueueMessage parsedQueueMessage = queueMessageParser.parse(tableName, null, methodType, data);
 
 		if (parsedQueueMessage == null) {
 			logger.error("message parsing failed!");
@@ -533,25 +503,4 @@ public class IndexServiceImpl implements IndexService {
 		return maintainIndexes(parsedQueueMessage);
 	}
 
-	@Override
-	public SPage<LuceneQueueMessage> getListenDetails(DataSourceQualifier dataSourceQualifier, Integer page,
-			Integer size, String searchContent) {
-		try {
-			DruidDataSource dataSource = DruidDBConfiguration.getDataSource(dataSourceQualifier);
-			return new LuceneQueueMessageDao(dataSource).findAll(page, size, searchContent);
-		} catch (SQLRecoverableException e) {
-			throw new SearchException(e).setDetailedMessage(e);
-		}
-	}
-
-	@Override
-	public boolean dequeueLuceneQueueMessage(DataSourceQualifier dataSourceQualifier, String messageId) {
-		try {
-			DruidDataSource dataSource = DruidDBConfiguration.getDataSource(dataSourceQualifier);
-			return new LuceneQueueMessageDao(dataSource).dequeueLuceneQueueMessage(messageId);
-		} catch (SQLRecoverableException e) {
-			throw new SearchException(e).setDetailedMessage(e);
-		}
-	}
-
 }

+ 18 - 30
search-console-b2b/src/main/java/com/uas/search/console/b2b/service/impl/UpdateVirtualColumnServiceImpl.java

@@ -1,40 +1,29 @@
 package com.uas.search.console.b2b.service.impl;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.NotSerializableException;
-import java.io.PrintWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import com.uas.search.util.CollectionUtils;
-
 import com.alibaba.fastjson.JSONObject;
 import com.uas.search.b2b.exception.SearchException;
 import com.uas.search.b2b.model.SPage;
 import com.uas.search.b2b.service.SearchService.Table_name;
-import com.uas.search.console.b2b.util.ContextUtils;
 import com.uas.search.console.b2b.schedule.model.DailyTaskInformation;
 import com.uas.search.console.b2b.schedule.service.Executable;
 import com.uas.search.console.b2b.schedule.service.TaskService;
 import com.uas.search.console.b2b.service.IndexService;
 import com.uas.search.console.b2b.service.InnerSearchService;
 import com.uas.search.console.b2b.service.UpdateVirtualColumnService;
-import com.uas.search.console.b2b.util.ClassAndTableNameUtils;
-import com.uas.search.console.b2b.util.FileUtils;
-import com.uas.search.console.b2b.util.ObjectUtil;
-import com.uas.search.console.b2b.util.SearchUtils;
+import com.uas.search.console.b2b.util.*;
+import com.uas.search.util.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.NotSerializableException;
+import java.io.PrintWriter;
+import java.lang.reflect.Method;
+import java.util.*;
+import java.util.Map.Entry;
 
 /**
  * 每天定时更新虚拟列索引
@@ -124,13 +113,12 @@ public class UpdateVirtualColumnServiceImpl implements UpdateVirtualColumnServic
 			}
 			printWriter.flush();
 			printWriter.close();
-		} catch (FileNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException
-				| IllegalArgumentException | InvocationTargetException e) {
+            Long endTime = new Date().getTime();
+            logger.info(String.format("修改数据%s条,耗时%.2fs\n ", totalElements, (endTime - startTime) / 1000.0));
+            indexService.createIndexes(Arrays.asList(tableName), true, true);
+		} catch (Exception e) {
 			throw new SearchException(e).setDetailedMessage(e);
 		}
-		Long endTime = new Date().getTime();
-		logger.info(String.format("修改数据%s条,耗时%.2fs\n ", totalElements, (endTime - startTime) / 1000.0));
-		indexService.createIndexes(Arrays.asList(tableName), true, true);
 	}
 
 	@Override

+ 0 - 112
search-console-b2b/src/main/java/com/uas/search/console/b2b/support/RealTimeUpdateMonitor.java

@@ -1,112 +0,0 @@
-package com.uas.search.console.b2b.support;
-
-import java.sql.SQLRecoverableException;
-import java.util.HashSet;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import com.uas.search.util.CollectionUtils;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import com.uas.search.b2b.model.SPage;
-import com.uas.search.console.b2b.DruidDBConfiguration;
-import com.uas.search.console.b2b.util.ContextUtils;
-import com.uas.search.console.b2b.jms.AQListener;
-import com.uas.search.console.b2b.jms.LuceneQueueMessage;
-import com.uas.search.console.b2b.jms.LuceneQueueMessageDao;
-import com.uas.search.console.b2b.schedule.model.TaskInformation;
-import com.uas.search.console.b2b.schedule.service.Executable;
-import com.uas.search.console.b2b.schedule.service.TaskService;
-import com.uas.search.console.b2b.util.SearchConstants.DataSourceQualifier;
-
-/**
- * 创建定时任务,监控实时更新异常情况
- * 
- * @author sunyj
- * @since 2016年12月19日 下午3:40:03
- */
-public class RealTimeUpdateMonitor {
-
-	private TaskService taskService = ContextUtils.getBean(TaskService.class);
-
-	private AQListener aqListener = ContextUtils.getBean(AQListener.class);
-
-	private DataSourceQualifier dataSourceQualifier;
-
-	/**
-	 * 上次查询时最旧的消息
-	 */
-	private LuceneQueueMessage oldestMessage;
-
-	/**
-	 * 第一次执行的延迟时间间隔为1秒
-	 */
-	private static final long INITIAL_DELAY = 1000;
-
-	/**
-	 * 两次任务之间的等待时间间隔为5分钟
-	 */
-	private static final long PERIOD = 5 * 60 * 1000;
-
-	private Logger logger = LoggerFactory.getLogger(getClass());
-
-	public RealTimeUpdateMonitor(DataSourceQualifier dataSourceQualifier) {
-		this.dataSourceQualifier = dataSourceQualifier;
-	}
-
-	public TaskInformation newTask() {
-		String title = "监控实时更新异常情况:" + dataSourceQualifier.getQualifier();
-		Executable command = new Executable() {
-			@Override
-			public String execute() {
-				// 如果实时更新未正常运行,发送警告短信并自动重启实时更新服务
-				try {
-					if (!workWell()) {
-						HashSet<DataSourceQualifier> dataSourceQualifiers = new HashSet<>();
-						dataSourceQualifiers.add(dataSourceQualifier);
-						logger.error("实时更新未正常运行:" + dataSourceQualifier.getQualifier());
-						logger.info("发送警告短信...");
-						logger.info("重启实时更新服务:" + dataSourceQualifier.getQualifier());
-						if (aqListener.isRunning(dataSourceQualifier)) {
-							aqListener.stop(dataSourceQualifiers);
-						}
-						aqListener.start(dataSourceQualifiers, null);
-						return "异常";
-					}
-				} catch (SQLRecoverableException e) {
-					logger.error("", e);
-					return "数据库连接错误";
-				}
-				return "正常";
-			}
-		};
-		TaskInformation taskInformation = new TaskInformation(title, command, INITIAL_DELAY, PERIOD);
-		taskService.newTask(taskInformation);
-		return taskInformation;
-	}
-
-	/**
-	 * 实时更新服务是否运行良好
-	 * 
-	 * @return true 如果运行良好
-	 * @throws SQLRecoverableException
-	 */
-	private boolean workWell() throws SQLRecoverableException {
-		DruidDataSource dataSource = DruidDBConfiguration.getDataSource(dataSourceQualifier);
-		SPage<LuceneQueueMessage> sPage = new LuceneQueueMessageDao(dataSource).findAll(1, 1, null);
-		// 如果消息队列中没有消息,说明没有等待更新的消息
-		if (CollectionUtils.isEmpty(sPage.getContent())) {
-			return true;
-		}
-		LuceneQueueMessage luceneQueueMessage = CollectionUtils.isEmpty(sPage.getContent()) ? null
-				: sPage.getContent().get(0);
-		// 比较上次与本次查询的最旧的消息,如果两者相同,说明实时更新服务出现了问题
-		if (oldestMessage != null && oldestMessage.equals(luceneQueueMessage)) {
-			return false;
-		} else {
-			oldestMessage = luceneQueueMessage;
-			return true;
-		}
-	}
-
-}

+ 6 - 6
search-console-b2b/src/main/java/com/uas/search/console/b2b/util/ObjectToDocumentUtils.java

@@ -17,8 +17,6 @@ import com.uas.platform.core.model.Constant;
 import com.uas.search.b2b.service.SearchService.Table_name;
 import com.uas.search.console.b2b.platformmanager.model.UserSpaceDetailSimpleInfo;
 
-import net.sf.ehcache.search.SearchException;
-
 /**
  * 将对象转换为Document的工具类
  * 
@@ -135,7 +133,7 @@ public class ObjectToDocumentUtils {
 		}
 		// TODO 其他表
 		else {
-			throw new SearchException("不支持将以下类型转换为Document:" + object.getClass().getName());
+			throw new IllegalArgumentException("不支持将以下类型转换为Document:" + object.getClass().getName());
 		}
 	}
 
@@ -3283,9 +3281,11 @@ public class ObjectToDocumentUtils {
         // 排序字段
         document.add(new NumericDocValuesField(ClassAndTableNameUtils.combineField(tableName, ProductUsersSimpleInfo.ID_FIELD),
                 productUsersSimpleInfo.getId()));
-        document.add(new NumericDocValuesField(
-                ClassAndTableNameUtils.combineField(tableName, ProductUsersSimpleInfo.DATE_FIELD),
-                productUsersSimpleInfo.getDate().getTime()));
+        if(productUsersSimpleInfo.getDate() != null){
+            document.add(new NumericDocValuesField(
+                    ClassAndTableNameUtils.combineField(tableName, ProductUsersSimpleInfo.DATE_FIELD),
+                    productUsersSimpleInfo.getDate().getTime()));
+        }
         return document;
     }
 

+ 0 - 6
search-console-b2b/src/main/resources/application.yml

@@ -1,10 +1,4 @@
 spring:
- jpa:
-  database: ORACLE
-  show-sql: false
-  properties:
-   hibernate:
-    dialect: org.hibernate.dialect.Oracle10gDialect
  http:
   multipart:
    enabled: true

+ 6 - 5
search-console-b2b/src/main/resources/config/application-dev.properties

@@ -1,7 +1,7 @@
-datasource.url=jdbc:oracle:thin:@192.168.253.6:1521:orcl
-datasource.username=uuplatformdemo
-datasource.password=selectuuplatform
-datasource.driverClassName=oracle.jdbc.driver.OracleDriver
+datasource.driverClassName=com.mysql.jdbc.Driver
+datasource.url=jdbc:mysql://192.168.253.12:3306/b2b_mysql_test?characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true
+datasource.username=root
+datasource.password=select111***
 datasource.initialSize=3
 datasource.minIdle=1
 datasource.maxActive=20
@@ -16,9 +16,10 @@ datasource.poolPreparedStatements=true
 datasource.timeBetweenLogStatsMillis=60000
 datasource.maxPoolPreparedStatementPerConnectionSize=20
 datasource.filters=stat,slf4j
-datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+datasource.connectionProperties=druid.stat.mergeSql=false;druid.stat.slowSqlMillis=5000
 
 #platformmanager
+platformmanager.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
 platformmanager.datasource.url=jdbc:oracle:thin:@192.168.253.6:1521:orcl
 platformmanager.datasource.username=platformmanager$test
 platformmanager.datasource.password=select!#%*(

+ 6 - 5
search-console-b2b/src/main/resources/config/application-prod.properties

@@ -1,7 +1,7 @@
-datasource.url=jdbc:oracle:thin:@10.10.100.200:1521:orcl
-datasource.username=platform$b2b
-datasource.password=select*fromuu
-datasource.driverClassName=oracle.jdbc.driver.OracleDriver
+datasource.driverClassName=com.mysql.jdbc.Driver
+datasource.url=jdbc:mysql://192.168.253.12:3306/b2b_mysql_test?characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true
+datasource.username=root
+datasource.password=select111***
 datasource.initialSize=3
 datasource.minIdle=1
 datasource.maxActive=20
@@ -16,9 +16,10 @@ datasource.poolPreparedStatements=true
 datasource.timeBetweenLogStatsMillis=60000
 datasource.maxPoolPreparedStatementPerConnectionSize=20
 datasource.filters=stat,slf4j
-datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+datasource.connectionProperties=druid.stat.mergeSql=false;druid.stat.slowSqlMillis=5000
 
 #platformmanager
+platformmanager.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
 platformmanager.datasource.url=jdbc:oracle:thin:@//10.10.100.215:1521/orcl
 platformmanager.datasource.username=platformmanager
 platformmanager.datasource.password=select!#%*(

+ 6 - 5
search-console-b2b/src/main/resources/config/application-test.properties

@@ -1,7 +1,7 @@
-datasource.url=jdbc:oracle:thin:@192.168.253.6:1521:orcl
-datasource.username=uuplatformdemo
-datasource.password=selectuuplatform
-datasource.driverClassName=oracle.jdbc.driver.OracleDriver
+datasource.driverClassName=com.mysql.jdbc.Driver
+datasource.url=jdbc:mysql://192.168.253.12:3306/b2b_mysql_test?characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true
+datasource.username=root
+datasource.password=select111***
 datasource.initialSize=3
 datasource.minIdle=1
 datasource.maxActive=20
@@ -16,9 +16,10 @@ datasource.poolPreparedStatements=true
 datasource.timeBetweenLogStatsMillis=60000
 datasource.maxPoolPreparedStatementPerConnectionSize=20
 datasource.filters=stat,slf4j
-datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
+datasource.connectionProperties=druid.stat.mergeSql=false;druid.stat.slowSqlMillis=5000
 
 #platformmanager
+platformmanager.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
 platformmanager.datasource.url=jdbc:oracle:thin:@192.168.253.6:1521:orcl
 platformmanager.datasource.username=platformmanager$test
 platformmanager.datasource.password=select!#%*(

+ 0 - 8
search-console-b2b/src/main/resources/spring/ehcache.xml

@@ -1,8 +0,0 @@
-<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:noNamespaceSchemaLocation="classpath:ehcache.xsd">
-	<diskStore path="java.io.tmpdir" />
-	<defaultCache maxElementsInMemory="10000" eternal="false"
-		timeToIdleSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000"
-		diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
-		timeToLiveSeconds="8" memoryStoreEvictionPolicy="LRU" />
-</ehcache>

+ 0 - 270
search-console-b2b/src/main/resources/spring/ehcache.xsd

@@ -1,270 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.7">
-
-    <xs:element name="ehcache">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element maxOccurs="1" minOccurs="0" ref="diskStore"/>
-                <xs:element maxOccurs="1" minOccurs="0" ref="transactionManagerLookup"/>
-                <xs:element maxOccurs="1" minOccurs="0" ref="cacheManagerEventListenerFactory"/>
-                <xs:element maxOccurs="unbounded" minOccurs="0" ref="cacheManagerPeerProviderFactory"/>
-                <xs:element maxOccurs="unbounded" minOccurs="0" ref="cacheManagerPeerListenerFactory"/>
-                <xs:element maxOccurs="1" minOccurs="0" ref="terracottaConfig"/>
-                <xs:element ref="defaultCache"/>
-                <xs:element maxOccurs="unbounded" minOccurs="0" ref="cache"/>
-            </xs:sequence>
-            <xs:attribute name="name" use="optional"/>
-            <xs:attribute default="true" name="updateCheck" type="xs:boolean" use="optional"/>
-            <xs:attribute default="autodetect" name="monitoring" type="monitoringType" use="optional"/>
-            <xs:attribute default="true" name="dynamicConfig" type="xs:boolean" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="diskStore">
-        <xs:complexType>
-            <xs:attribute name="path" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-     <xs:element name="transactionManagerLookup">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="cacheManagerEventListenerFactory">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="cacheManagerPeerProviderFactory">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="cacheManagerPeerListenerFactory">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="terracottaConfig">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element maxOccurs="1" minOccurs="0" name="tc-config">
-                    <xs:complexType>
-                        <xs:sequence>
-                            <xs:any maxOccurs="unbounded" minOccurs="0" processContents="skip"/>
-                        </xs:sequence>
-                    </xs:complexType>
-                </xs:element>
-            </xs:sequence>
-            <xs:attribute default="localhost:9510" name="url" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <!-- add clone support for addition of cacheExceptionHandler. Important! -->
-    <xs:element name="defaultCache">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheEventListenerFactory"/>
-                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheExtensionFactory"/>
-                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheLoaderFactory"/>
-                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheDecoratorFactory"/>
-                <xs:element minOccurs="0" maxOccurs="1" ref="bootstrapCacheLoaderFactory"/>
-                <xs:element minOccurs="0" maxOccurs="1" ref="cacheExceptionHandlerFactory"/>
-                <xs:element minOccurs="0" maxOccurs="1" ref="terracotta"/>
-                <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriter"/>
-                <xs:element minOccurs="0" maxOccurs="1" ref="copyStrategy"/>
-            </xs:sequence>
-            <xs:attribute name="diskExpiryThreadIntervalSeconds" type="xs:integer" use="optional"/>
-            <xs:attribute name="diskSpoolBufferSizeMB" type="xs:integer" use="optional"/>
-            <xs:attribute name="diskPersistent" type="xs:boolean" use="optional"/>
-            <xs:attribute name="diskAccessStripes" type="xs:integer" use="optional" default="1"/>
-            <xs:attribute name="eternal" type="xs:boolean" use="required"/>
-            <xs:attribute name="maxElementsInMemory" type="xs:integer" use="required"/>
-            <xs:attribute name="clearOnFlush" type="xs:boolean" use="optional"/>
-            <xs:attribute name="memoryStoreEvictionPolicy" type="xs:string" use="optional"/>
-            <xs:attribute name="overflowToDisk" type="xs:boolean" use="required"/>
-            <xs:attribute name="timeToIdleSeconds" type="xs:integer" use="optional"/>
-            <xs:attribute name="timeToLiveSeconds" type="xs:integer" use="optional"/>
-            <xs:attribute name="maxElementsOnDisk" type="xs:integer" use="optional"/>
-            <xs:attribute name="transactionalMode" type="transactionalMode" use="optional" default="off"/>
-            <xs:attribute name="statistics" type="xs:boolean" use="optional" default="false"/>
-            <xs:attribute name="copyOnRead" type="xs:boolean" use="optional" default="false"/>
-            <xs:attribute name="copyOnWrite" type="xs:boolean" use="optional" default="false"/>
-            <xs:attribute name="cacheLoaderTimeoutMillis" type="xs:integer" use="optional" default="0"/>
-            <xs:attribute name="overflowToOffHeap" type="xs:boolean" use="optional" default="false"/>
-            <xs:attribute name="maxMemoryOffHeap" type="xs:string" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="cache">
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheEventListenerFactory"/>
-                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheExtensionFactory"/>
-                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheLoaderFactory"/>
-                <xs:element minOccurs="0" maxOccurs="unbounded" ref="cacheDecoratorFactory"/>
-                <xs:element minOccurs="0" maxOccurs="1" ref="bootstrapCacheLoaderFactory"/>
-                <xs:element minOccurs="0" maxOccurs="1" ref="cacheExceptionHandlerFactory"/>
-                <xs:element minOccurs="0" maxOccurs="1" ref="terracotta"/>
-                <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriter"/>
-                <xs:element minOccurs="0" maxOccurs="1" ref="copyStrategy"/>
-            </xs:sequence>
-            <xs:attribute name="diskExpiryThreadIntervalSeconds" type="xs:integer" use="optional"/>
-            <xs:attribute name="diskSpoolBufferSizeMB" type="xs:integer" use="optional"/>
-            <xs:attribute name="diskPersistent" type="xs:boolean" use="optional"/>
-            <xs:attribute name="diskAccessStripes" type="xs:integer" use="optional" default="1"/>
-            <xs:attribute name="eternal" type="xs:boolean" use="required"/>
-            <xs:attribute name="maxElementsInMemory" type="xs:integer" use="required"/>
-            <xs:attribute name="memoryStoreEvictionPolicy" type="xs:string" use="optional"/>
-            <xs:attribute name="clearOnFlush" type="xs:boolean" use="optional"/>
-            <xs:attribute name="name" type="xs:string" use="required"/>
-            <xs:attribute name="overflowToDisk" type="xs:boolean" use="required"/>
-            <xs:attribute name="timeToIdleSeconds" type="xs:integer" use="optional"/>
-            <xs:attribute name="timeToLiveSeconds" type="xs:integer" use="optional"/>
-            <xs:attribute name="maxElementsOnDisk" type="xs:integer" use="optional"/>
-            <xs:attribute name="transactionalMode" type="transactionalMode" use="optional" default="off" />
-            <xs:attribute name="statistics" type="xs:boolean" use="optional" default="false"/>
-            <xs:attribute name="copyOnRead" type="xs:boolean" use="optional" default="false"/>
-            <xs:attribute name="copyOnWrite" type="xs:boolean" use="optional" default="false"/>
-            <xs:attribute name="logging" type="xs:boolean" use="optional" default="false"/>
-            <xs:attribute name="cacheLoaderTimeoutMillis" type="xs:integer" use="optional" default="0"/>
-            <xs:attribute name="overflowToOffHeap" type="xs:boolean" use="optional" default="false"/>
-            <xs:attribute name="maxMemoryOffHeap" type="xs:string" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="cacheEventListenerFactory">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-            <xs:attribute name="listenFor" use="optional" type="notificationScope" default="all"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="bootstrapCacheLoaderFactory">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="cacheExtensionFactory">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="cacheExceptionHandlerFactory">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="cacheLoaderFactory">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="cacheDecoratorFactory">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:element name="terracotta">
-        <xs:complexType>
-            <xs:attribute name="clustered" use="optional" type="xs:boolean" default="true"/>
-            <xs:attribute name="valueMode" use="optional" type="terracottaCacheValueType" default="serialization"/>
-            <xs:attribute name="coherentReads" use="optional" type="xs:boolean" default="true"/>
-            <xs:attribute name="localKeyCache" use="optional" type="xs:boolean" default="false"/>
-            <xs:attribute name="localKeyCacheSize" use="optional" type="xs:positiveInteger" default="300000"/>
-            <xs:attribute name="orphanEviction" use="optional" type="xs:boolean" default="true"/>
-            <xs:attribute name="orphanEvictionPeriod" use="optional" type="xs:positiveInteger" default="4"/>
-            <xs:attribute name="copyOnRead" use="optional" type="xs:boolean" default="false"/>
-            <xs:attribute name="coherent" use="optional" type="xs:boolean" default="true"/>
-            <xs:attribute name="synchronousWrites" use="optional" type="xs:boolean" default="false"/>
-            <xs:attribute name="storageStrategy" use="optional" type="storageStrategyType" default="classic"/>
-            <xs:attribute name="concurrency" use="optional" type="xs:nonNegativeInteger" default="0"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:simpleType name="monitoringType">
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="autodetect"/>
-            <xs:enumeration value="on"/>
-            <xs:enumeration value="off"/>
-        </xs:restriction>
-    </xs:simpleType>
-    <xs:simpleType name="terracottaCacheValueType">
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="serialization" />
-            <xs:enumeration value="identity" />
-        </xs:restriction>
-    </xs:simpleType>
-    <xs:simpleType name="storageStrategyType">
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="classic" />
-            <xs:enumeration value="DCV2" />
-        </xs:restriction>
-    </xs:simpleType>
-
-    <xs:simpleType name="transactionalMode">
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="off"/>
-            <xs:enumeration value="xa"/>
-        </xs:restriction>
-    </xs:simpleType>
-
-    <xs:element name="cacheWriter">
-        <xs:complexType>
-            <xs:sequence >
-                <xs:element minOccurs="0" maxOccurs="1" ref="cacheWriterFactory"/>
-            </xs:sequence>
-            <xs:attribute name="writeMode" use="optional" type="writeModeType" default="write-through"/>
-            <xs:attribute name="notifyListenersOnException" use="optional" type="xs:boolean" default="false"/>
-            <xs:attribute name="minWriteDelay" use="optional" type="xs:nonNegativeInteger" default="1"/>
-            <xs:attribute name="maxWriteDelay" use="optional" type="xs:nonNegativeInteger" default="1"/>
-            <xs:attribute name="rateLimitPerSecond" use="optional" type="xs:nonNegativeInteger" default="0"/>
-            <xs:attribute name="writeCoalescing" use="optional" type="xs:boolean" default="false"/>
-            <xs:attribute name="writeBatching" use="optional" type="xs:boolean" default="false"/>
-            <xs:attribute name="writeBatchSize" use="optional" type="xs:positiveInteger" default="1"/>
-            <xs:attribute name="retryAttempts" use="optional" type="xs:nonNegativeInteger" default="0"/>
-            <xs:attribute name="retryAttemptDelaySeconds" use="optional" type="xs:nonNegativeInteger" default="1"/>
-        </xs:complexType>
-    </xs:element>
-    <xs:simpleType name="writeModeType">
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="write-through" />
-            <xs:enumeration value="write-behind" />
-        </xs:restriction>
-    </xs:simpleType>
-    <xs:element name="cacheWriterFactory">
-        <xs:complexType>
-            <xs:attribute name="class" use="required"/>
-            <xs:attribute name="properties" use="optional"/>
-            <xs:attribute name="propertySeparator" use="optional"/>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:element name="copyStrategy">
-        <xs:complexType>
-            <xs:attribute name="class" use="required" type="xs:string" />
-        </xs:complexType>
-    </xs:element>
-
-    <xs:simpleType name="notificationScope">
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="local"/>
-            <xs:enumeration value="remote"/>
-            <xs:enumeration value="all"/>
-        </xs:restriction>
-    </xs:simpleType>
-</xs:schema>