|
@@ -0,0 +1,130 @@
|
|
|
+package org.dbsyncer.listener.file;
|
|
|
+
|
|
|
+import org.apache.commons.io.IOUtils;
|
|
|
+import org.dbsyncer.common.util.RandomUtil;
|
|
|
+import org.dbsyncer.connector.config.FileConfig;
|
|
|
+import org.dbsyncer.connector.file.FileConnectorMapper;
|
|
|
+import org.dbsyncer.listener.AbstractExtractor;
|
|
|
+import org.dbsyncer.listener.ListenerException;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.RandomAccessFile;
|
|
|
+import java.nio.file.*;
|
|
|
+import java.util.List;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.concurrent.locks.Lock;
|
|
|
+import java.util.concurrent.locks.ReentrantLock;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author AE86
|
|
|
+ * @version 1.0.0
|
|
|
+ * @date 2022/5/6 21:42
|
|
|
+ */
|
|
|
+public class FileExtractor extends AbstractExtractor {
|
|
|
+
|
|
|
+ private final Logger logger = LoggerFactory.getLogger(getClass());
|
|
|
+
|
|
|
+ private final Lock connectLock = new ReentrantLock();
|
|
|
+ private volatile boolean connected;
|
|
|
+ private FileConnectorMapper connectorMapper;
|
|
|
+ private WatchService watchService;
|
|
|
+ private Worker worker;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void start() {
|
|
|
+ try {
|
|
|
+ connectLock.lock();
|
|
|
+ if (connected) {
|
|
|
+ logger.error("FileExtractor is already started");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ connectorMapper = (FileConnectorMapper) connectorFactory.connect(connectorConfig);
|
|
|
+ FileConfig config = connectorMapper.getConfig();
|
|
|
+ final String mapperCacheKey = connectorFactory.getConnector(connectorMapper).getConnectorMapperCacheKey(connectorConfig);
|
|
|
+ connected = true;
|
|
|
+
|
|
|
+ watchService = FileSystems.getDefault().newWatchService();
|
|
|
+ Path p = Paths.get(config.getFileDir());
|
|
|
+ p.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);
|
|
|
+
|
|
|
+ worker = new Worker();
|
|
|
+ worker.setName(new StringBuilder("file-parser-").append(mapperCacheKey).append("_").append(RandomUtil.nextInt(1, 100)).toString());
|
|
|
+ worker.setDaemon(false);
|
|
|
+ worker.start();
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("启动失败:{}", e.getMessage());
|
|
|
+ throw new ListenerException(e);
|
|
|
+ } finally {
|
|
|
+ connectLock.unlock();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void close() {
|
|
|
+ try {
|
|
|
+ connected = false;
|
|
|
+ if (null != worker && !worker.isInterrupted()) {
|
|
|
+ worker.interrupt();
|
|
|
+ worker = null;
|
|
|
+ }
|
|
|
+ if (null != watchService) {
|
|
|
+ watchService.close();
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error("关闭失败:{}", e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void parseEvent(String fileName) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private void read(String file) {
|
|
|
+ RandomAccessFile raf = null;
|
|
|
+ byte[] buffer = new byte[4096];
|
|
|
+ try {
|
|
|
+ raf = new RandomAccessFile(file, "r");
|
|
|
+ raf.seek(raf.length());
|
|
|
+ logger.info("offset:{}", raf.getFilePointer());
|
|
|
+
|
|
|
+ while (true) {
|
|
|
+ int len = raf.read(buffer);
|
|
|
+ if (-1 != len) {
|
|
|
+ logger.info("offset:{}, len:{}", raf.getFilePointer(), len);
|
|
|
+ logger.info(new String(buffer, 1, len, "UTF-8"));
|
|
|
+ }
|
|
|
+ TimeUnit.SECONDS.sleep(1);
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ logger.error(e.getMessage());
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ logger.error(e.getMessage());
|
|
|
+ } finally {
|
|
|
+ IOUtils.closeQuietly(raf);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ final class Worker extends Thread {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ while (!isInterrupted() && connected) {
|
|
|
+ try {
|
|
|
+ WatchKey watchKey = watchService.take();
|
|
|
+ List<WatchEvent<?>> watchEvents = watchKey.pollEvents();
|
|
|
+ for (WatchEvent<?> event : watchEvents) {
|
|
|
+ parseEvent(event.context().toString());
|
|
|
+ }
|
|
|
+ watchKey.reset();
|
|
|
+ } catch (Exception e) {
|
|
|
+ logger.error(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|