Selaa lähdekoodia

基本工程提交

redclan 6 vuotta sitten
commit
f4606a095e
28 muutettua tiedostoa jossa 1367 lisäystä ja 0 poistoa
  1. 32 0
      dicom_monitor/.classpath
  2. 23 0
      dicom_monitor/.project
  3. 11 0
      dicom_monitor/.settings/org.eclipse.core.resources.prefs
  4. 13 0
      dicom_monitor/.settings/org.eclipse.jdt.core.prefs
  5. 4 0
      dicom_monitor/.settings/org.eclipse.m2e.core.prefs
  6. 134 0
      dicom_monitor/pom.xml
  7. 38 0
      dicom_monitor/src/main/java/com/zskk/dicom/WebStarts.java
  8. 106 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/config/Configs.java
  9. 12 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/config/Constants.java
  10. 20 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/monitors/FileAction.java
  11. 21 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/monitors/FileActionCallback.java
  12. 66 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/monitors/FileChangeProc.java
  13. 23 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/monitors/InitMonitor.java
  14. 162 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/monitors/WatchDir.java
  15. 29 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/report/ErrReporter.java
  16. 67 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/report/ErrReporterSender.java
  17. 13 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/schedules/DirMonitor.java
  18. 34 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/schedules/StatRunner.java
  19. 30 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/schedules/StatTimer.java
  20. 135 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/uploader/FileUploader.java
  21. 28 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/uploader/UploadRunner.java
  22. 57 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/uploader/UploadsQueue.java
  23. 25 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/utils/ExceptionUtil.java
  24. 168 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/utils/LogEnginer.java
  25. 48 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/utils/MailerUtil.java
  26. 50 0
      dicom_monitor/src/main/java/com/zskk/dicom/monitor/utils/MonitorFileUtils.java
  27. 6 0
      dicom_monitor/src/main/resources/application.properties
  28. 12 0
      dicom_monitor/src/main/resources/project.properties

+ 32 - 0
dicom_monitor/.classpath

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_161"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>

+ 23 - 0
dicom_monitor/.project

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>dicom_monitor</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>

+ 11 - 0
dicom_monitor/.settings/org.eclipse.core.resources.prefs

@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/java/com/zskk/dicom/monitor/monitors/FileAction.java=UTF-8
+encoding//src/main/java/com/zskk/dicom/monitor/monitors/FileActionCallback.java=UTF-8
+encoding//src/main/java/com/zskk/dicom/monitor/monitors/FileChangeProc.java=UTF-8
+encoding//src/main/java/com/zskk/dicom/monitor/monitors/WatchDir.java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/main/resources/application.properties=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/<project>=UTF-8

+ 13 - 0
dicom_monitor/.settings/org.eclipse.jdt.core.prefs

@@ -0,0 +1,13 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8

+ 4 - 0
dicom_monitor/.settings/org.eclipse.m2e.core.prefs

@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1

+ 134 - 0
dicom_monitor/pom.xml

@@ -0,0 +1,134 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>dicom_monitor</groupId>
+	<artifactId>dicom_monitor</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+
+	<url>http://maven.apache.org</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<java.version>1.8</java.version>
+	</properties>
+
+	<build>
+		<finalName>zskk-dicom-monitor</finalName>
+		<defaultGoal>compile</defaultGoal>
+		<plugins>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<configuration>
+					<fork>true</fork>
+					<mainClass>${start-class}</mainClass>
+				</configuration>
+				<dependencies>
+					<dependency>
+						<groupId>org.springframework</groupId>
+						<artifactId>springloaded</artifactId>
+						<version>1.2.8.RELEASE</version>
+					</dependency>
+				</dependencies>
+				<executions>
+					<execution>
+						<goals>
+							<goal>repackage</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.7.0</version>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.2-beta-5</version>
+				<configuration>
+					<archive>
+						<manifest>
+							<addClasspath>true</addClasspath>
+							<mainClass>com.dandian.platform.web.engines.WebStarts</mainClass>
+						</manifest>
+					</archive>
+					<descriptorRefs>
+						<descriptorRef>jar-with-dependencies</descriptorRef>
+					</descriptorRefs>
+				</configuration>
+				<executions>
+					<execution>
+						<id>assemble-all</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+
+
+	<dependencies>
+
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-email</artifactId>
+			<version>1.4</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>1.3.2</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.6</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-httpclient</groupId>
+			<artifactId>commons-httpclient</artifactId>
+			<version>3.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-beanutils</groupId>
+			<artifactId>commons-beanutils</artifactId>
+			<version>1.9.3</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter</artifactId>
+			<version>2.0.4.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-configuration-processor</artifactId>
+			<version>2.0.4.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-autoconfigure</artifactId>
+			<version>2.0.4.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-autoconfigure-processor</artifactId>
+			<version>2.0.4.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot</artifactId>
+			<version>2.0.4.RELEASE</version>
+		</dependency>
+
+	</dependencies>
+
+</project>

+ 38 - 0
dicom_monitor/src/main/java/com/zskk/dicom/WebStarts.java

@@ -0,0 +1,38 @@
+package com.zskk.dicom;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.monitors.InitMonitor;
+import com.zskk.dicom.monitor.schedules.StatRunner;
+
+@SpringBootApplication(scanBasePackages = "com.zskk.dicom")
+@EnableScheduling
+@Configuration
+@CacheEvict(allEntries = true)
+public class WebStarts {
+
+	public WebStarts() {
+		Configs.sysLog.info("new WebStarts()...");
+	}
+
+	public static void main(String args[]) {
+		SpringApplication springApplication = new SpringApplication(WebStarts.class);
+		// 初始化配置信息
+		Configs.initConfig();
+		StringBuilder sb = new StringBuilder();
+		sb.append("Dicom dir monitor...\n");
+		sb.append("--------------------------------------------------\n");
+		sb.append("Monitoring directory:" + Configs.monitorDir + "\n");
+		sb.append("--------------------------------------------------\n");
+		Configs.sysLog.info(sb.toString());
+		springApplication.run(args);
+		// SpringApplication.run(WebStarts.class, args);
+		StatRunner.start();
+		InitMonitor.start();
+	}
+}

+ 106 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/config/Configs.java

@@ -0,0 +1,106 @@
+package com.zskk.dicom.monitor.config;
+
+import java.io.File;
+import java.util.ResourceBundle;
+
+import com.zskk.dicom.monitor.utils.LogEnginer;
+
+/**
+ * 监控组件配置信息
+ * 
+ * @author dandian
+ *
+ */
+public class Configs {
+
+	/**
+	 * 医院编号
+	 */
+	public static String hospitalId = "11000001";
+
+	/**
+	 * 监控的文件夹
+	 */
+	public static String monitorDir = "d:\\test";
+
+	/**
+	 * 监控的备份文件夹(上传文件后,将文件转存出来)
+	 */
+	public static String monitorBackDir = "d:\\test_back";
+
+	/**
+	 * 上传的IP
+	 */
+	public static String postHost = "127.0.0.1";
+
+	/**
+	 * 上传的端口
+	 */
+	public static Integer postPort = 1008;
+
+	/**
+	 * 上传的URI
+	 */
+	public static String postUri = "/upload";
+
+	/**
+	 * 异常上报的邮件标题
+	 */
+	public static String errReportTitle = "异常信息";
+
+	/**
+	 * 异常上报的时间间隔(秒)
+	 */
+	public static Long errReportTimeInterval = 60L;
+
+	/**
+	 * 异常上报的接收邮箱<br />
+	 * 多个邮箱接收,使用“;”号分隔
+	 */
+	public static String errReportToEmail = null;
+
+	/**
+	 * 邮件发送邮箱
+	 */
+	public static String errReportFromEmail = null;
+
+	/**
+	 * 邮件发送邮箱的host信息
+	 */
+	public static String errReportFromEmailHost = null;
+
+	/**
+	 * 邮件发送邮箱的密码
+	 */
+	public static String errReportFromEmailPwd = null;
+
+	/**
+	 * 系统日志(包含系统、异常、业务处理等)
+	 */
+	public static LogEnginer sysLog = new LogEnginer("sys");
+
+	/**
+	 * 初始化配置信息
+	 */
+	public static void initConfig() {
+		ResourceBundle rb = ResourceBundle.getBundle("project");
+		hospitalId = rb.getString("monitor.hospitalId");
+		monitorDir = rb.getString("monitor.monitorDir");
+		if (monitorDir.endsWith(File.separator)) {
+			// 去掉路径最后一个路径分隔符
+			monitorDir = monitorDir.substring(0, monitorDir.lastIndexOf(File.separator));
+		}
+		monitorBackDir = monitorDir + "_back";
+		postHost = rb.getString("monitor.postHost");
+		postUri = rb.getString("monitor.postUri");
+		postPort = Integer.parseInt(rb.getString("monitor.postPort"));
+		postUri = rb.getString("monitor.postUri");
+		errReportTitle = rb.getString("monitor.errReportTitle");
+		errReportTimeInterval = Long.parseLong(rb.getString("monitor.errReportTimeInterval"));
+		errReportToEmail = rb.getString("monitor.errReportToEmail");
+		errReportFromEmail = rb.getString("monitor.errReportFromEmail");
+		errReportFromEmailHost = rb.getString("monitor.errReportFromEmailHost");
+		errReportFromEmailPwd = rb.getString("monitor.errReportFromEmailPwd");
+	}
+
+}

+ 12 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/config/Constants.java

@@ -0,0 +1,12 @@
+package com.zskk.dicom.monitor.config;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+public class Constants {
+
+	/**
+	 * 最后一次异常上报时间
+	 */
+	public static AtomicLong lastErrReportTime = new AtomicLong(0);
+
+}

+ 20 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/monitors/FileAction.java

@@ -0,0 +1,20 @@
+package com.zskk.dicom.monitor.monitors;
+
+/**
+ * 文件变动行为枚举
+ * 
+ * @author Goofy <a href="http://www.xdemo.org/">http://www.xdemo.org/</a>
+ * @Date 2015年7月3日 上午10:40:04
+ */
+public enum FileAction {
+	DELETE("ENTRY_DELETE"), CREATE("ENTRY_CREATE"), MODIFY("ENTRY_MODIFY");
+	private String value;
+
+	FileAction(String value) {
+		this.value = value;
+	}
+
+	public String getValue() {
+		return value;
+	}
+}

+ 21 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/monitors/FileActionCallback.java

@@ -0,0 +1,21 @@
+package com.zskk.dicom.monitor.monitors;
+
+import java.io.File;
+
+/**
+ * 文件操作的回调方法
+ * @author Goofy <a href="http://www.xdemo.org/">http://www.xdemo.org/</a>
+ * @Date 2015年7月6日 上午11:11:34
+ */
+public abstract class FileActionCallback {
+
+	public void delete(File file) {
+	};
+
+	public void modify(File file) {
+	};
+
+	public void create(File file) {
+	};
+
+}

+ 66 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/monitors/FileChangeProc.java

@@ -0,0 +1,66 @@
+package com.zskk.dicom.monitor.monitors;
+
+import java.io.File;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.uploader.UploadsQueue;
+
+/**
+ * 
+ * @author Goofy
+ * @Date 2015年7月6日 上午11:22:32
+ */
+public class FileChangeProc {
+
+	public void startMonitor(String dir) {
+
+		if (dir == null) {
+			String msg = "error, the monitor dir con't is null!";
+			ErrReporter.report(msg);
+			return;
+		}
+
+		final File file = new File(dir);
+
+		new Thread(new Runnable() {
+
+			public void run() {
+				try {
+					new WatchDir(file, true, new FileActionCallback() {
+						@Override
+						public void create(File file) {
+							if (file.isDirectory()) {
+								// 创建文件夹不处理
+								return;
+							}
+							String msg = "File create \t" + file.getAbsolutePath();
+							Configs.sysLog.info(msg);
+							UploadsQueue.add(file);
+						}
+
+						@Override
+						public void delete(File file) {
+							String msg = "File delete \t" + file.getAbsolutePath();
+							Configs.sysLog.info(msg);
+						}
+
+						@Override
+						public void modify(File file) {
+							String msg = "File update \t" + file.getAbsolutePath();
+							Configs.sysLog.info(msg);
+						}
+					});
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		}).start();
+		Configs.sysLog.info("--------------------------------------------------\nMonitoring:" + file.getAbsolutePath() + "\t >>> ");
+	}
+
+	public static void main(String[] args) throws Exception {
+		new FileChangeProc().startMonitor("D:\\upload");
+	}
+
+}

+ 23 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/monitors/InitMonitor.java

@@ -0,0 +1,23 @@
+package com.zskk.dicom.monitor.monitors;
+
+import java.io.File;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.uploader.UploadsQueue;
+import com.zskk.dicom.monitor.utils.MonitorFileUtils;
+
+public class InitMonitor {
+
+	/**
+	 * 系统启动时,将目录中的图片进行上传处理
+	 */
+	public static void start() {
+		Configs.sysLog.info("Dicom monitor check waiting files ...");
+		File monitorDir = new File(Configs.monitorDir);
+		// 判断备份目录是否存在
+		MonitorFileUtils.touchBackDir(monitorDir);
+		// 处理监控开启前未处理的文件
+		UploadsQueue.init();
+	}
+
+}

+ 162 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/monitors/WatchDir.java

@@ -0,0 +1,162 @@
+package com.zskk.dicom.monitor.monitors;
+
+import static java.nio.file.LinkOption.NOFOLLOW_LINKS;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.StandardWatchEventKinds;
+import java.nio.file.WatchEvent;
+import java.nio.file.WatchEvent.Kind;
+import java.nio.file.WatchKey;
+import java.nio.file.WatchService;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+
+/**
+ * 文件夹监控
+ * 
+ * @author Goofy <a href="http://www.xdemo.org/">http://www.xdemo.org/</a>
+ * @Date 2015年7月3日 上午9:21:33
+ */
+public class WatchDir {
+
+	private final WatchService watcher;
+	private final Map<WatchKey, Path> keys;
+	private final boolean subDir;
+
+	/**
+	 * 构造方法
+	 * 
+	 * @param file
+	 *            文件目录,不可以是文件
+	 * @param subDir
+	 * @throws Exception
+	 */
+	public WatchDir(File file, boolean subDir, FileActionCallback callback) throws Exception {
+		if (!file.isDirectory()) {
+			Exception newExce = new Exception(file.getAbsolutePath() + "is not a directory!");
+			Configs.sysLog.info(ExceptionUtil.getExceptionTxt(newExce));
+			throw newExce;
+		}
+
+		this.watcher = FileSystems.getDefault().newWatchService();
+		this.keys = new HashMap<WatchKey, Path>();
+		this.subDir = subDir;
+
+		Path dir = Paths.get(file.getAbsolutePath());
+
+		if (subDir) {
+			registerAll(dir);
+		} else {
+			register(dir);
+		}
+		processEvents(callback);
+	}
+
+	@SuppressWarnings("unchecked")
+	static <T> WatchEvent<T> cast(WatchEvent<?> event) {
+		return (WatchEvent<T>) event;
+	}
+
+	/**
+	 * 观察指定的目录
+	 * 
+	 * @param dir
+	 * @throws IOException
+	 */
+	private void register(Path dir) throws IOException {
+		WatchKey key = dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
+		keys.put(key, dir);
+	}
+
+	/**
+	 * 观察指定的目录,并且包括子目录
+	 */
+	private void registerAll(final Path start) throws IOException {
+		Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
+			@Override
+			public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+				register(dir);
+				return FileVisitResult.CONTINUE;
+			}
+		});
+	}
+
+	/**
+	 * 发生文件变化的回调函数
+	 */
+	@SuppressWarnings("rawtypes")
+	void processEvents(FileActionCallback callback) {
+		for (;;) {
+			WatchKey key;
+			try {
+				key = watcher.take();
+			} catch (InterruptedException x) {
+				return;
+			}
+			Path dir = keys.get(key);
+			if (dir == null) {
+				// 操作未识别
+				continue;
+			}
+
+			for (WatchEvent<?> event : key.pollEvents()) {
+				Kind kind = event.kind();
+
+				// 事件可能丢失或遗弃
+				if (kind == StandardWatchEventKinds.OVERFLOW) {
+					continue;
+				}
+
+				// 目录内的变化可能是文件或者目录
+				WatchEvent<Path> ev = cast(event);
+				Path name = ev.context();
+				Path child = dir.resolve(name);
+				File file = child.toFile();
+				if (kind.name().equals(FileAction.DELETE.getValue())) {
+					callback.delete(file);
+				} else if (kind.name().equals(FileAction.CREATE.getValue())) {
+					callback.create(file);
+				} else if (kind.name().equals(FileAction.MODIFY.getValue())) {
+					callback.modify(file);
+				} else {
+					continue;
+				}
+
+				// if directory is created, and watching recursively, then
+				// register it and its sub-directories
+				if (subDir && (kind == StandardWatchEventKinds.ENTRY_CREATE)) {
+					try {
+						if (Files.isDirectory(child, NOFOLLOW_LINKS)) {
+							registerAll(child);
+						}
+					} catch (IOException x) {
+						// ignore to keep sample readbale
+					}
+				}
+			}
+
+			boolean valid = key.reset();
+			if (!valid) {
+				// 移除不可访问的目录
+				// 因为有可能目录被移除,就会无法访问
+				keys.remove(key);
+				// 如果待监控的目录都不存在了,就中断执行
+				if (keys.isEmpty()) {
+					break;
+				}
+			}
+		}
+	}
+
+}

+ 29 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/report/ErrReporter.java

@@ -0,0 +1,29 @@
+package com.zskk.dicom.monitor.report;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class ErrReporter {
+
+	/**
+	 * 准备上报的异常队列<br />
+	 * 异常将只存储最近的3种错误或异常
+	 */
+	protected static List<String> errReportsQueue = Collections.synchronizedList(new ArrayList<String>());
+
+	private static ExecutorService pools = Executors.newFixedThreadPool(2);
+
+	/**
+	 * 将错误上报
+	 * 
+	 * @param errMsg
+	 */
+	public static void report(String errMsg) {
+		// 异步线程发送异常
+		pools.execute(new ErrReporterSender(errMsg));
+	}
+
+}

+ 67 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/report/ErrReporterSender.java

@@ -0,0 +1,67 @@
+package com.zskk.dicom.monitor.report;
+
+import org.apache.commons.mail.EmailException;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.config.Constants;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+import com.zskk.dicom.monitor.utils.MailerUtil;
+
+public class ErrReporterSender implements Runnable {
+
+	/**
+	 * 准备上报的异常信息
+	 */
+	private String errMsg;
+
+	public ErrReporterSender(String errMsg) {
+		this.errMsg = errMsg;
+		Configs.sysLog.info("error:\n" + errMsg);
+	}
+
+	@Override
+	public void run() {
+		Long curTime = System.currentTimeMillis();
+		if ((curTime - Constants.lastErrReportTime.get()) / 1000 < Configs.errReportTimeInterval) {
+			// 异常发送间隔太短
+			// 暂时放入队列
+			if (!ErrReporter.errReportsQueue.contains(errMsg)) {
+				ErrReporter.errReportsQueue.add(errMsg);
+			}
+			return;
+		} else {
+			ErrReporter.errReportsQueue.add(errMsg);
+		}
+
+		if (ErrReporter.errReportsQueue.isEmpty()) {
+			return;
+		}
+		// 保存异常同步的时间
+		Constants.lastErrReportTime.set(System.currentTimeMillis());
+		// 准备发送邮件
+		StringBuilder sb = new StringBuilder();
+		for (String msg : ErrReporter.errReportsQueue) {
+			sb.append(msg).append("\r\n<br />");
+		}
+		// 清除队列
+		ErrReporter.errReportsQueue.clear();
+		try {
+			String to = Configs.errReportToEmail;
+			String cc = null;
+			if (to.contains(";")) {
+				// 将to中的多个邮箱,放到cc中
+				if (cc == null) {
+					cc = to.substring(to.indexOf(";") + 1);
+				}
+				to = to.substring(0, to.indexOf(";"));
+			}
+			// 开始邮件发送异常信息
+			MailerUtil.SendMail(Configs.errReportFromEmailHost, Configs.errReportFromEmail, Configs.errReportFromEmail, Configs.errReportFromEmailPwd, to, cc, "utf8", Configs.hospitalId + "--" + Configs.errReportTitle, sb.toString(), null);
+		} catch (EmailException e) {
+			e.printStackTrace();
+			Configs.sysLog.info(ExceptionUtil.getExceptionTxt(e));
+		}
+		sb = null;
+	}
+
+}

+ 13 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/schedules/DirMonitor.java

@@ -0,0 +1,13 @@
+package com.zskk.dicom.monitor.schedules;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.monitors.FileChangeProc;
+
+public class DirMonitor implements Runnable {
+
+	@Override
+	public void run() {
+		new FileChangeProc().startMonitor(Configs.monitorDir);
+	}
+
+}

+ 34 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/schedules/StatRunner.java

@@ -0,0 +1,34 @@
+package com.zskk.dicom.monitor.schedules;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.uploader.UploadsQueue;
+
+public class StatRunner {
+
+	private static ExecutorService pools = null;
+
+	public static void start() {
+		if (pools != null && !pools.isTerminated()) {
+			pools.shutdown();
+			while (pools.isTerminated()) {
+				try {
+					pools.awaitTermination(200, TimeUnit.MILLISECONDS);
+				} catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		Configs.sysLog.info("StatRunner.start() ...");
+		Configs.sysLog.info("Error report from:" + Configs.errReportFromEmail);
+		Configs.sysLog.info("Error report to:" + Configs.errReportToEmail);
+		pools = Executors.newSingleThreadExecutor();
+		pools.execute(new DirMonitor());
+		// 处理监控开启前未处理的文件
+		UploadsQueue.init();
+	}
+
+}

+ 30 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/schedules/StatTimer.java

@@ -0,0 +1,30 @@
+package com.zskk.dicom.monitor.schedules;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import com.zskk.dicom.monitor.config.Configs;
+
+@Component
+@EnableScheduling
+@Lazy(false)
+public class StatTimer {
+
+	DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+	/**
+	 * 每小时重启一次
+	 */
+	@Scheduled(cron = "0 0 * * * ?")
+	public void timmer_1() {
+		Configs.sysLog.info("Scheduled--" + df.format(new Date()));
+		StatRunner.start();
+	}
+
+}

+ 135 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/uploader/FileUploader.java

@@ -0,0 +1,135 @@
+package com.zskk.dicom.monitor.uploader;
+
+import java.io.BufferedReader;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.UUID;
+
+import com.zskk.dicom.monitor.config.Configs;
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+import com.zskk.dicom.monitor.utils.MonitorFileUtils;
+
+public class FileUploader {
+
+	public static void upload(File file) {
+		File dir = file.getParentFile();
+		try {
+			String boundaryKey = UUID.randomUUID().toString().replaceAll("-", "").substring(8, 24);
+			String content = "\r\n----" + boundaryKey + "\r\n" + "Content-Type: application/octet-stream\r\n" + "Content-Disposition: form-data; name=\"" + renameFileName(file.getName()) + "\"; filename=\"" + renameFileName(file.getName()) + "\"\r\n" + "Content-Transfer-Encoding: binary\r\n\r\n";
+			String postUrl = "http://" + Configs.postHost + ":" + Configs.postPort + Configs.postUri;
+			Boolean uploadResult = uploadToUrl(postUrl, boundaryKey, content, "", file);
+			// 创建目录
+			String targetFile = MonitorFileUtils.touchBackDir(file);
+			if (uploadResult == true) {
+				// 上传完成后,移除文件
+				boolean isSucDel = file.renameTo(new File(targetFile));
+				if (!isSucDel) {
+					// 文件没有成功删除
+					ErrReporter.report("文件移动失败:" + file.getCanonicalPath() + " target:" + targetFile);
+				}
+			}
+			// 移除空的目录
+			MonitorFileUtils.removeEmptyDir(dir);
+		} catch (Exception e) {
+			ErrReporter.report(ExceptionUtil.getExceptionTxt(e));
+			e.printStackTrace();
+		}
+	}
+
+	private static String renameFileName(String name) {
+		return Configs.hospitalId + "-" + name;
+	}
+
+	@SuppressWarnings("static-access")
+	private static boolean uploadToUrl(String url, String boundaryKey, String contentBinary, String fileId, File fromFile) throws Exception {
+		String uri = url;
+		String enddata = "\r\n----" + boundaryKey + "--";
+		// 获取文件输入流
+		InputStream in = null;
+		try {
+			in = new FileInputStream(fromFile);
+		} catch (FileNotFoundException fnfe) {
+			// 有些图片格式,会被系统临时占用,抛出文件被占用异常
+			Thread.currentThread().sleep(1000);
+			in = new FileInputStream(fromFile);
+		}
+		URL urlObj = new URL(uri);
+		HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
+		try {
+			con.setRequestMethod("POST"); // 设置关键值,以Post方式提交表单,默认get方式
+			con.setDoInput(true);
+			con.setDoOutput(true);
+			con.setUseCaches(false); // post方式不能使用缓存
+			// 设置请求头信息
+			// con.setRequestProperty("Connection", "Keep-Alive");
+			con.setRequestProperty("Charset", "UTF-8");
+			// 设置边界
+			con.setRequestProperty("Content-Type", "multipart/form-data; boundary=--" + boundaryKey);
+			// 设置文件大小
+			con.setRequestProperty("Content-Length", String.valueOf(fromFile.length()));
+			// 请求正文信息
+			// 第一部分:
+			StringBuilder sb = new StringBuilder();
+			sb.append(contentBinary);
+			// 未知文件类型,以流的方式上传
+			byte[] head = sb.toString().getBytes("utf-8");
+			// 获得输出流
+			OutputStream out = new DataOutputStream(con.getOutputStream());
+			// 输出表头
+			out.write(head);
+			// 文件正文部分
+			// 把文件以流文件的方式 推入到url中
+			DataInputStream dataIn = new DataInputStream(in);
+			int bytes = 0;
+			byte[] bufferOut = new byte[1024];
+			while ((bytes = dataIn.read(bufferOut)) != -1) {
+				out.write(bufferOut, 0, bytes);
+			}
+			in.close();
+			// 结尾部分
+			byte[] foot = (enddata).getBytes("utf-8");// 定义最后数据分隔线
+			out.write(foot);
+			out.flush();
+			out.close();
+			// 读取返回数据
+			StringBuilder strBuf = new StringBuilder();
+			BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
+			try {
+				String line = null;
+				while ((line = reader.readLine()) != null) {
+					strBuf.append(line).append("\n");
+				}
+			} finally {
+				reader.close();
+			}
+			String rs = strBuf.toString();
+			Configs.sysLog.info("The file (" + fromFile.getName() + ") uploaded ! result:" + rs);
+			if (strBuf.indexOf("success\":true") > 0) {
+				return true;
+			} else {
+				return false;
+			}
+		} finally {
+			try {
+				con.disconnect();
+				con = null;
+			} catch (Exception e) {
+			}
+			try {
+				in.close();
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+}

+ 28 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/uploader/UploadRunner.java

@@ -0,0 +1,28 @@
+package com.zskk.dicom.monitor.uploader;
+
+import java.io.File;
+
+import com.zskk.dicom.monitor.report.ErrReporter;
+import com.zskk.dicom.monitor.utils.ExceptionUtil;
+
+public class UploadRunner implements Runnable {
+
+	private File uploadFile;
+
+	public UploadRunner(File uploadFile) {
+		this.uploadFile = uploadFile;
+	}
+
+	@Override
+	public void run() {
+		try {
+			FileUploader.upload(uploadFile);
+			// 从队列中移除已完成任务
+			UploadsQueue.fileQueue.remove(uploadFile);
+		} catch (Throwable e) {
+			ErrReporter.report(ExceptionUtil.getExceptionTxt(e));
+			e.printStackTrace();
+		}
+	}
+
+}

+ 57 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/uploader/UploadsQueue.java

@@ -0,0 +1,57 @@
+package com.zskk.dicom.monitor.uploader;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.apache.commons.io.FileUtils;
+
+import com.zskk.dicom.monitor.config.Configs;
+
+public class UploadsQueue {
+
+	/**
+	 * 待处理的文件队列
+	 */
+	protected static List<File> fileQueue = Collections.synchronizedList(new ArrayList<File>());
+
+	/**
+	 * 文件上传线程池
+	 */
+	private static ExecutorService pools = Executors.newFixedThreadPool(2);
+
+	public static void add(File file) {
+		if (fileQueue.contains(file)) {
+			// 文件已经在队列中
+			Configs.sysLog.info(file + ", The file is already in the queue!");
+		} else {
+			fileQueue.add(file);
+			Configs.sysLog.info(file + ", The file is added to the queue!");
+			pools.execute(new UploadRunner(file));
+		}
+	}
+
+	/**
+	 * 系统启动时,将文件夹中的文件添加到上传队列中
+	 */
+	@SuppressWarnings("rawtypes")
+	public static void init() {
+		File dir = new File(Configs.monitorDir);
+		StringBuilder sb = new StringBuilder();
+		Iterator its = FileUtils.iterateFiles(dir, new String[] { "dcm" }, true);
+		while (its.hasNext()) {
+			File file = (File) its.next();
+			add(file);
+			sb.append(file.getAbsolutePath() + "\n");
+		}
+		if (sb.length() > 0) {
+			Configs.sysLog.info("System start & inits, this files added to the queue:\n" + sb.toString());
+		}
+		sb = null;
+	}
+
+}

+ 25 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/utils/ExceptionUtil.java

@@ -0,0 +1,25 @@
+package com.zskk.dicom.monitor.utils;
+
+public class ExceptionUtil {
+
+	/**
+	 * 获取异常信息
+	 * 
+	 * @param e
+	 * @return
+	 */
+	public static String getExceptionTxt(Throwable e) {
+		StringBuilder sOut = new StringBuilder();
+		sOut.append("----------\r\n<br />");
+		sOut.append(e.getMessage() + "\r\n<br />");
+		StackTraceElement[] trace = e.getStackTrace();
+		for (StackTraceElement s : trace) {
+			String ste = s.toString();
+			if (ste.contains("com.zskk")) {
+				sOut.append(s + "\r\n<br />");
+			}
+		}
+		return sOut.toString();
+	}
+
+}

+ 168 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/utils/LogEnginer.java

@@ -0,0 +1,168 @@
+package com.zskk.dicom.monitor.utils;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+
+import org.slf4j.LoggerFactory;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.filter.LevelFilter;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.rolling.RollingFileAppender;
+import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
+import ch.qos.logback.core.spi.FilterReply;
+import ch.qos.logback.core.util.FileSize;
+
+/**
+ * log4j
+ * 
+ */
+public class LogEnginer {
+
+	/**
+	 * 单个文件最大大小(500M)
+	 */
+	private static FileSize MaxFileSize = FileSize.valueOf("500MB");
+
+	/**
+	 * (全部)日志最大大小限制
+	 */
+	private static FileSize TotalSizeCap = FileSize.valueOf("100GB");
+
+	private static String AppenderFile = "./logs/{logName}.log";
+
+	private static String FileNamePattern = "./logs/%d{yyyy-MM-dd}/{logName}-%d{yyyy-MM-dd}.%i.log";
+
+	/**
+	 * 日志输出对象
+	 */
+	private Logger log;
+
+	/**
+	 * 日志Appender配置
+	 */
+	private RollingFileAppender<ILoggingEvent> appender = new RollingFileAppender<ILoggingEvent>();
+
+	private LoggerContext lc;
+
+	/**
+	 * 日志(文件)名
+	 */
+	String logName;
+
+	@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
+	public LogEnginer(String logName) {
+
+		org.slf4j.Logger slog = (org.slf4j.Logger) LoggerFactory.getLogger(logName);
+
+		Object fobj = LoggerFactory.getILoggerFactory();
+		if (fobj instanceof org.slf4j.helpers.SubstituteLoggerFactory) {
+			org.slf4j.helpers.SubstituteLoggerFactory slf = (org.slf4j.helpers.SubstituteLoggerFactory) fobj;
+		} else {
+			lc = (LoggerContext) fobj;
+		}
+
+		// lc.reset(); // 重置之前的配置(注意:全局)
+
+		log = (ch.qos.logback.classic.Logger) slog;
+		log.detachAndStopAllAppenders();
+
+		this.logName = logName;
+
+		appender.setFile(AppenderFile.replaceAll("\\{logName\\}", logName));
+
+		SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy();
+		policy.setContext(lc);
+		policy.setFileNamePattern(FileNamePattern.replaceAll("\\{logName\\}", logName));
+		policy.setMaxHistory(Integer.MAX_VALUE);
+		policy.setTotalSizeCap(TotalSizeCap);
+		policy.setMaxFileSize(MaxFileSize);
+		policy.setParent(appender);
+		policy.start();
+
+		appender.setTriggeringPolicy(policy);
+		appender.setRollingPolicy(policy);
+
+		appender.setAppend(true); // 可追加
+
+		PatternLayoutEncoder layoutEncoder = new PatternLayoutEncoder();
+		layoutEncoder.setCharset(Charset.forName("utf8"));
+		// layoutEncoder.setPattern("%-5p [%d] %C:%L - %m %n");
+		layoutEncoder.setPattern("%m%n");
+		layoutEncoder.setContext(lc);
+		layoutEncoder.start();
+		appender.setEncoder(layoutEncoder);
+
+		LevelFilter filter = new LevelFilter();
+		filter.setLevel(Level.INFO);
+		filter.setOnMatch(FilterReply.ACCEPT);
+		filter.setOnMismatch(FilterReply.DENY);
+
+		appender.setName(logName + ".STDOUT");
+
+		// System.out.println("......................");
+		// StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
+		// System.out.println("......................");
+
+		appender.setContext(lc);
+		log.addAppender(appender);
+		log.setLevel(Level.ALL);
+		log.setAdditive(false);
+		appender.start();
+	}
+
+	/**
+	 * info:一般信息
+	 * 
+	 * @param logMsg
+	 * @throws IOException
+	 */
+	public synchronized void info(String logMsg) {
+		System.out.println(logMsg);
+		log.info(logMsg);
+	}
+
+	/**
+	 * error:出错信息
+	 * 
+	 * @param logMsg
+	 * @throws IOException
+	 */
+	public synchronized void error(String logMsg) {
+		log.error(logMsg);
+	}
+
+	/**
+	 * debug:调试信息
+	 * 
+	 * @param logMsg
+	 * @throws IOException
+	 */
+	public synchronized void debug(String logMsg) {
+		log.debug(logMsg);
+	}
+
+	/**
+	 * trace:追踪信息
+	 * 
+	 * @param logMsg
+	 * @throws IOException
+	 */
+	public synchronized void trace(String logMsg) {
+		log.trace(logMsg);
+	}
+
+	/**
+	 * warn:警告信息
+	 * 
+	 * @param logMsg
+	 * @throws IOException
+	 */
+	public synchronized void warn(String logMsg) {
+		log.warn(logMsg);
+	}
+
+}

+ 48 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/utils/MailerUtil.java

@@ -0,0 +1,48 @@
+package com.zskk.dicom.monitor.utils;
+
+import org.apache.commons.mail.EmailAttachment;
+import org.apache.commons.mail.EmailException;
+import org.apache.commons.mail.HtmlEmail;
+
+import com.zskk.dicom.monitor.config.Configs;
+
+public class MailerUtil {
+
+	public static void SendMail(String host, String from, String username, String password, String to, String cc, String charset, String subject, String mailConent, EmailAttachment[] atts) throws EmailException {
+		if (charset == null || charset.equals("")) {
+			charset = "GB2312";
+		}
+		HtmlEmail email = new HtmlEmail();
+		email.setAuthentication(username, password);
+		email.setHostName(host);
+		email.addTo(to, from);
+		if (cc != null && !"".equals(cc)) {
+			if (cc.contains(";")) {
+				String ccs[] = cc.split(";");
+				for (int i = 0; i < ccs.length; i++) {
+					email.addCc(ccs[i]);
+				}
+			} else {
+				email.addCc(cc);
+			}
+		}
+		email.setFrom(from);
+		email.setSubject(subject);
+		email.setCharset(charset);
+		email.setHtmlMsg(mailConent); /* 邮件内容 */
+		// 添加附件对象
+		if (atts != null && atts.length > 0) {
+			for (int i = 0; i < atts.length; i++) {
+				if (atts[i] != null)
+					email.attach(atts[i]);
+			}
+		}
+		email.send();
+		// 保存系统日志
+		StringBuilder logMsg = new StringBuilder();
+		logMsg.append("SendMail:" + from + " --> " + to + (cc == null ? "" : ";cc:" + cc) + "[" + subject + "]:\n");
+		logMsg.append(mailConent);
+		Configs.sysLog.info(logMsg.toString());
+		logMsg = null;
+	}
+}

+ 50 - 0
dicom_monitor/src/main/java/com/zskk/dicom/monitor/utils/MonitorFileUtils.java

@@ -0,0 +1,50 @@
+package com.zskk.dicom.monitor.utils;
+
+import java.io.File;
+
+import com.zskk.dicom.monitor.config.Configs;
+
+public class MonitorFileUtils {
+
+	/**
+	 * 移除空的目录
+	 * 
+	 * @param dirFile
+	 */
+	public static void removeEmptyDir(File dirFile) {
+		// 文件的上级目录
+		String fs[] = dirFile.list();
+		if (fs == null || fs.length < 1) {
+			String filePath = dirFile.getAbsolutePath();
+			Boolean delRs = dirFile.delete();
+			if (delRs) {
+				Configs.sysLog.info("Dir is delete suc:" + filePath);
+			} else {
+				Configs.sysLog.info("Dir is delete fail:" + filePath);
+			}
+		}
+	}
+
+	/**
+	 * 
+	 * @param dcomFile
+	 * @return
+	 */
+	public static String touchBackDir(File dcomFile) {
+		String targetFile = dcomFile.getAbsolutePath();
+		targetFile = targetFile.replace(Configs.monitorDir, "");
+		targetFile = Configs.monitorBackDir + targetFile;
+		String targetFileDirStr = targetFile.substring(0, targetFile.lastIndexOf(File.separator));
+		File targetFileDir = new File(targetFileDirStr);
+		if (!targetFileDir.exists()) {
+			Boolean cr = targetFileDir.mkdirs();
+			if (cr) {
+				Configs.sysLog.info("Create backup dir :" + targetFileDir.getAbsolutePath());
+			} else {
+				Configs.sysLog.info("Create backup dir failed :" + targetFileDir.getAbsolutePath());
+			}
+		}
+		return targetFile;
+	}
+
+}

+ 6 - 0
dicom_monitor/src/main/resources/application.properties

@@ -0,0 +1,6 @@
+
+server.port=80
+
+spring.resources.chain.cache=false
+
+

+ 12 - 0
dicom_monitor/src/main/resources/project.properties

@@ -0,0 +1,12 @@
+monitor.monitorDir=D:\\testmr
+monitor.hospitalId=11000001
+monitor.postHost=api.pacsonline.cn
+monitor.postPort=80
+monitor.postUri=/upload
+monitor.errReportTitle=dicome-error-report
+monitor.errReportTimeInterval=60
+monitor.errReportToEmail=denggx@pacsonline.cn;liu.tao@pacsonline.cn;fu.yu@pacsonline.cn
+monitor.errReportFromEmail=denggx@pacsonline.cn
+monitor.errReportFromEmailHost=smtp.exmail.qq.com
+monitor.errReportFromEmailPwd=123456Dgx
+