98 Commits

Author SHA1 Message Date
59208d80ba 。。。 2023-05-15 21:03:23 +08:00
cba061e177 xxx 2022-12-16 15:51:44 +08:00
c988bf4c91 加入使用代理功能,修改json格式! 2022-11-04 16:11:18 +08:00
628b08e1ef 完成json配置文件的读取。 2022-11-04 15:06:03 +08:00
7dce36562c 保存进度! 2022-11-04 11:50:52 +08:00
9b0d6a8c6d 保存进度! 2022-11-04 11:39:28 +08:00
3b1844c994 和风天气json结构变更。 2022-06-07 14:03:35 +08:00
db8f9e9c05 保存进度! 2022-05-17 10:39:53 +08:00
4c0cb3c76e 保存进度! 2022-05-13 17:44:23 +08:00
65431a0f0e 增加要查询的城市清单。 2022-05-12 18:17:24 +08:00
cd8bcb8ba0 Merge branch 'develop' of http://cppdisciple.f3322.org:3000/CPICXIM/disaster_warrning into develop 2022-05-12 10:10:23 +08:00
e800558a32 修改数据保存方式! 2022-05-12 10:09:35 +08:00
b993638e5b 提交小修改! 2022-05-11 23:10:01 +08:00
6671cb69c9 问题已修正! 2022-05-10 19:37:52 +08:00
7abeffb61a 清理 2022-05-10 16:37:32 +08:00
54d73db62f 保存进度! 2022-05-10 16:36:06 +08:00
8149e21e2f 程序打包! 2022-05-10 16:35:07 +08:00
2847747f53 完成日志功能! 2022-05-10 16:32:59 +08:00
1231fe3132 保存进度! 2022-05-10 16:03:40 +08:00
fbe9f8e532 完成打包! 2022-05-10 14:24:07 +08:00
53849e4f74 保存进度! 2022-05-09 17:03:26 +08:00
d1bcb3b956 保存进度! 2022-05-06 17:33:56 +08:00
c0443d3a8b 完成基本功能。 2022-05-06 11:15:04 +08:00
eb7f53ad4b 保存进度! 2022-05-05 17:53:31 +08:00
91c99ba8f9 完成发送记录保存功能。待完善…… 2022-05-05 16:59:28 +08:00
0fb8b90509 重构一下 2022-05-04 00:08:17 +08:00
cd743c645f 保存进度! 2022-04-28 15:59:40 +08:00
2d1d4dea66 提交小修改! 2022-04-27 23:38:47 +08:00
24cdc66b7d 完成check函数!修正jdbc url的错误! 2022-04-27 17:37:36 +08:00
5da53f02ea 完成判断消息是否已发送功能! 2022-04-27 16:09:58 +08:00
0587001de0 提交小修改! 2022-04-26 23:23:43 +08:00
64170d2e67 提交小修改! 2022-04-26 23:23:10 +08:00
51a2829433 提交小修改! 2022-04-26 23:21:37 +08:00
59977ec9b6 修正读取配置文件utf-8编码的bug! 2022-04-26 23:17:24 +08:00
9d57987f0c 改变配置文件的获取方式!改成singleton! 2022-04-25 23:27:38 +08:00
a78fad18ea 保存进度! 2022-04-25 17:41:41 +08:00
07ae9f88a3 完善 jackson 解析时间。 2022-04-24 11:34:49 +08:00
2dbe40b7a8 Merge branch 'develop'
第一个可用版本!
2022-04-24 10:22:43 +08:00
5496c06eea 保存进度! 2022-04-24 10:20:48 +08:00
70884ab305 完成基本功能! 2022-04-23 23:53:29 +08:00
69434b3b58 。。。 2022-04-23 00:30:57 +08:00
1e8e58d3de ... 2022-04-22 23:48:34 +08:00
9c1f141a00 提交小修改! 2022-04-22 23:35:29 +08:00
f1c1d5a4a5 提交小修改! 2022-04-22 17:37:23 +08:00
116b4a0f12 保存进度! 2022-04-22 17:30:02 +08:00
021b20876f 保存进度! 2022-04-22 16:58:19 +08:00
2237690139 完成基本功能,准备加入log4j。 2022-04-22 16:22:23 +08:00
16c54998de 保存进度! 2022-04-22 11:51:33 +08:00
9857451f05 保存进度! 2022-04-22 10:46:41 +08:00
ae7b2127bc 尝试用vscode开发! 2022-04-22 10:32:58 +08:00
17b8d4dde6 保存进度! 2022-04-21 17:12:00 +08:00
130f237af2 修改配置文件,增加公众号接口URL配置项。 2022-04-19 15:31:34 +08:00
216c6926ac 保存进度! 2022-04-18 17:41:38 +08:00
cb8563ce5c 增加公众号推送功能代码! 2022-04-18 16:25:20 +08:00
d23826e056 保存进度! 2022-04-18 11:50:02 +08:00
3dda8252f6 保存进度! 2022-04-14 11:40:55 +08:00
2202972510 111 2022-04-13 16:55:49 +08:00
7a9c55930e 增加公众号接口文档! 2022-04-13 15:33:35 +08:00
bc3b9b044f 保存进度! 2022-04-07 11:24:40 +08:00
95b3ad8f1b 保存进度! 2022-04-06 13:41:37 +08:00
4e1ca52d2f 提交小修改! 2022-03-27 20:54:06 +08:00
050edac28a 提交小修改! 2022-03-27 17:14:21 +08:00
83e73cfe60 提交小修改! 2022-03-27 17:13:06 +08:00
f95d8ed08b 提交小修改! 2022-03-27 17:12:04 +08:00
b184846ea4 保存进度! 2022-03-27 16:28:27 +08:00
74a69767a2 保存进度! 2022-03-27 16:26:33 +08:00
4fae3cbd8e 保存进度! 2022-03-27 16:20:34 +08:00
9f593e6787 Merge branch 'develop' of http://cppdisciple.f3322.org:65310/cpicxm/disaster-warning into develop
切换git
2022-03-27 16:01:02 +08:00
94f5262402 保存进度! 2022-03-27 16:00:53 +08:00
3d302919de 保存进度! 2022-03-27 15:58:59 +08:00
6579c08e5f 保存进度! 2022-03-26 18:34:04 +08:00
ae51dde6a3 保存进度! 2022-03-26 18:32:05 +08:00
566809868a 保存小修改! 2022-03-25 17:36:26 +08:00
e5be1e0b66 保存小修改! 2022-03-25 17:35:40 +08:00
c588131c12 保存小修改! 2022-03-22 18:01:36 +08:00
be919a1d3a 保存小修改! 2022-03-22 10:02:47 +08:00
4bd1a4b98b 保存进度! 2022-03-18 20:17:52 +08:00
1019dff1a9 保存进度! 2022-03-18 20:16:06 +08:00
aa2837af38 保存小修改! 2022-03-18 17:59:01 +08:00
bc913171ee ... 2022-03-18 16:45:25 +08:00
d7c667cb40 完成json配置文件加载。 2022-03-18 16:04:54 +08:00
2378de88dc ... 2022-03-18 10:26:45 +08:00
c4e04523ed ... 2022-03-18 10:25:17 +08:00
540b44cf9d 。。。 2022-03-18 01:40:59 +08:00
479eb32f7e 完成json反序列化。 2022-03-17 16:40:09 +08:00
5825b7a929 ... 2022-03-17 09:29:35 +08:00
36166f5b60 做了一些小重构 2022-03-16 18:26:36 +08:00
cea1ff78f7 ... 2022-03-16 17:51:25 +08:00
0e574c7031 ... 2022-03-16 16:05:17 +08:00
f2c340d3cb 完成数据抓取! 2022-03-16 15:58:00 +08:00
a27a1c8d85 ... 2022-03-16 15:57:45 +08:00
d2cbc91e9d ... 2022-03-16 15:57:04 +08:00
91cef7bf0e ... 2022-03-16 15:55:59 +08:00
f65b43534f ... 2022-03-16 15:55:05 +08:00
0d1e389b3b 。。。 2022-03-16 09:18:46 +08:00
ebf5b196e8 改变忽略文件结构 2022-03-15 18:04:15 +08:00
60a8453296 新建项目 2022-03-15 18:01:53 +08:00
14983d296b Initial commit 2022-03-15 09:58:43 +00:00
39 changed files with 3181 additions and 2 deletions

10
.gitignore vendored
View File

@@ -1,3 +1,7 @@
target/*
*.jar
# ---> C++
# Prerequisites
*.d
@@ -90,3 +94,9 @@ buildNumber.properties
# JDT-specific (Eclipse Java Development Tools)
.classpath
code/java/天气灾害预警/target/
code/java/天气灾害预警/out/
*.jar
*.iws
*.log
*.lck

View File

@@ -1,3 +1,8 @@
# disaster_warrning
大灾预警
<h1 style="text-align:center;font-size:4rem;" title>气象灾害预警推送应用</h1>
**功能:**
- 从和风天气查询配置文件中列出地区的气象灾害预警;
- 如果预警则推送厦门太保公众。

139
code/java/DisasterWarning/.gitignore vendored Normal file
View File

@@ -0,0 +1,139 @@
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### VisualStudioCode template
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### Windows template
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
target/*
logs/*
logs

View File

@@ -0,0 +1,15 @@
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Launch AppMain",
"request": "launch",
"mainClass": "AppMain",
"projectName": "disaster_warning"
}
]
}

View File

@@ -0,0 +1,7 @@
{
"java.configuration.updateBuildConfiguration": "automatic",
"java.format.settings.url": "E:\\工作文档\\4、配置备份\\vscode\\eclipse-java-google-style.xml",
"[java]": {
"editor.detectIndentation": true
}
}

View File

@@ -0,0 +1,33 @@
{
"title": "天气灾害预警配置文件",
"key": "fe9fa8eeeb6f4301a92541eed565dd15",
"query_url": "https://devapi.qweather.com/v7/warning/now?",
"wechat_officalaccount_url": "https://cxxmwx.cpic.com.cn/app/index.php?i=2&c=entry&do=send_group_tpl_api&m=ok_tplmessage",
"query_interval": 10,
"proxy_setting": {
"enable": true,
"proxy_mode": "http",
"proxy_address": "172.16.39.2",
"proxy_port": 18080
},
"cities": [
{
"city_name": "厦门",
"city_code": "101230201"
},
{
"city_name": "同安",
"city_code": "101230202"
},
{
"city_name": "翔安",
"city_code": "101230207"
}
],
"notify_stuffs": [
{
"stuff_name": "王炜",
"mobile_phone": "15959215339"
}
]
}

View File

@@ -0,0 +1,14 @@
{
"tns_name": "xmcx1",
"ip_addr": "10.39.0.86",
"jdbc_url": "jdbc:oracle:thin:@10.39.0.86:1521:xmcx1",
"table_space": "wechat",
"user_name": "wechat",
"password": "@rn7Q+t5zeyKIZ~s",
"tables": [
{
"table_name": "weather_disaster_notify",
"table_description": "天气预警消息表"
}
]
}

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library" scope="TEST">
<library name="JUnit4">
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/junit-4.13.1.jar!/" />
<root url="jar://$MODULE_DIR$/lib/hamcrest-core-1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="Maven: com.oracle:ojdbc8:19.3.0.0.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
<orderEntry type="library" name="Maven: commons-logging:commons-logging:1.2" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.13.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest-core:1.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.8" level="project" />
</component>
</module>

View File

@@ -0,0 +1,343 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CodeStyleManager">
<option name="USE_DEFAULT_CODE_STYLE_SCHEME" value="true" />
<option name="CODE_STYLE_SCHEME" value="" />
</component>
<component name="CompilerConfiguration">
<wildcardResourcePatterns>
<entry name="!?*.java" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="disaster_warning" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel>
<module name="disaster_warning" target="1.8" />
</bytecodeTargetLevel>
</component>
<component name="Encoding" native2AsciiForPropertiesFiles="true" defaultCharsetForPropertiesFiles="UTF-8">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
<file url="PROJECT" charset="UTF-8" />
</component>
<component name="ExportToHTMLSettings">
<option name="PRINT_LINE_NUMBERS" value="false" />
<option name="OPEN_IN_BROWSER" value="false" />
<option name="OUTPUT_DIRECTORY" />
</component>
<component name="ImportConfiguration">
<option name="VENDOR" />
<option name="RELEASE_TAG" />
<option name="LOG_MESSAGE" />
<option name="CHECKOUT_AFTER_IMPORT" value="true" />
</component>
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
</profile>
<version value="1.0" />
</component>
<component name="JUnitGeneratorProjectSettings">
<option name="selectedTemplateKey" value="JUnit 4" />
<option name="vmTemplates">
<map>
<entry key="JUnit 3" value="######################################################################################## &#10;## &#10;## Available variables: &#10;## $entryList.methodList - List of method composites &#10;## $entryList.privateMethodList - List of private method composites &#10;## $entryList.fieldList - ArrayList of class scope field names &#10;## $entryList.className - class name &#10;## $entryList.packageName - package name &#10;## $today - Todays date in MM/dd/yyyy format &#10;## &#10;## MethodComposite variables: &#10;## $method.name - Method Name &#10;## $method.signature - Full method signature in String form &#10;## $method.reflectionCode - list of strings representing commented out reflection code to access method (Private Methods) &#10;## $method.paramNames - List of Strings representing the method's parameters' names &#10;## $method.paramClasses - List of Strings representing the method's parameters' classes &#10;## &#10;## You can configure the output class name using &quot;testClass&quot; variable below. &#10;## Here are some examples: &#10;## Test${entry.ClassName} - will produce TestSomeClass &#10;## ${entry.className}Test - will produce SomeClassTest &#10;## &#10;######################################################################################## &#10;## &#10;#macro (cap $strIn)$strIn.valueOf($strIn.charAt(0)).toUpperCase()$strIn.substring(1)#end &#10;## Iterate through the list and generate testcase for every entry. &#10;#foreach ($entry in $entryList) &#10;#set( $testClass=&quot;${entry.className}Test&quot;) &#10;## &#10;package test.$entry.packageName; &#10;&#10;import junit.framework.Test; &#10;import junit.framework.TestSuite; &#10;import junit.framework.TestCase; &#10;&#10;/** &#10;* ${entry.className} Tester. &#10;* &#10;* @author &lt;Authors name&gt; &#10;* @since &lt;pre&gt;$today&lt;/pre&gt; &#10;* @version 1.0 &#10;*/ &#10;public class $testClass extends TestCase { &#10;public $testClass(String name) { &#10;super(name); &#10;} &#10;&#10;public void setUp() throws Exception { &#10;super.setUp(); &#10;} &#10;&#10;public void tearDown() throws Exception { &#10;super.tearDown(); &#10;} &#10;&#10;#foreach($method in $entry.methodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;} &#10;&#10;#end &#10;&#10;#foreach($method in $entry.privateMethodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;#foreach($string in $method.reflectionCode) &#10;$string &#10;#end &#10;} &#10;&#10;#end &#10;&#10;public static Test suite() { &#10;return new TestSuite(${testClass}.class); &#10;} &#10;} &#10;#end" />
<entry key="JUnit 4" value="######################################################################################## &#10;## &#10;## Available variables: &#10;## $entryList.methodList - List of method composites &#10;## $entryList.privateMethodList - List of private method composites &#10;## $entryList.fieldList - ArrayList of class scope field names &#10;## $entryList.className - class name &#10;## $entryList.packageName - package name &#10;## $today - Todays date in MM/dd/yyyy format &#10;## &#10;## MethodComposite variables: &#10;## $method.name - Method Name &#10;## $method.signature - Full method signature in String form &#10;## $method.reflectionCode - list of strings representing commented out reflection code to access method (Private Methods) &#10;## $method.paramNames - List of Strings representing the method's parameters' names &#10;## $method.paramClasses - List of Strings representing the method's parameters' classes &#10;## &#10;## You can configure the output class name using &quot;testClass&quot; variable below. &#10;## Here are some examples: &#10;## Test${entry.ClassName} - will produce TestSomeClass &#10;## ${entry.className}Test - will produce SomeClassTest &#10;## &#10;######################################################################################## &#10;## &#10;#macro (cap $strIn)$strIn.valueOf($strIn.charAt(0)).toUpperCase()$strIn.substring(1)#end &#10;## Iterate through the list and generate testcase for every entry. &#10;#foreach ($entry in $entryList) &#10;#set( $testClass=&quot;${entry.className}Test&quot;) &#10;## &#10;package $entry.packageName; &#10;&#10;import org.junit.Test; &#10;import org.junit.Before; &#10;import org.junit.After; &#10;&#10;/** &#10;* ${entry.className} Tester. &#10;* &#10;* @author &lt;Authors name&gt; &#10;* @since &lt;pre&gt;$date&lt;/pre&gt; &#10;* @version 1.0 &#10;*/ &#10;public class $testClass { &#10;&#10;@Before&#10;public void before() throws Exception { &#10;} &#10;&#10;@After&#10;public void after() throws Exception { &#10;} &#10;&#10;#foreach($method in $entry.methodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;@Test&#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;} &#10;&#10;#end &#10;&#10;#foreach($method in $entry.privateMethodList) &#10;/** &#10;* &#10;* Method: $method.signature &#10;* &#10;*/ &#10;@Test&#10;public void test#cap(${method.name})() throws Exception { &#10;//TODO: Test goes here... &#10;#foreach($string in $method.reflectionCode) &#10;$string &#10;#end &#10;} &#10;&#10;#end &#10;} &#10;#end" />
</map>
</option>
</component>
<component name="JUnitProjectSettings">
<option name="TEST_RUNNER" value="UI" />
</component>
<component name="JavadocGenerationManager">
<option name="OPTION_HIERARCHY" value="false" />
<option name="OPTION_NAVIGATOR" value="false" />
<option name="OPTION_INDEX" value="false" />
<option name="OPTION_SEPARATE_INDEX" value="false" />
<option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="false" />
<option name="OPTION_DEPRECATED_LIST" value="false" />
<option name="OPEN_IN_BROWSER" value="false" />
</component>
<component name="JikesSettings">
<option name="DEBUGGING_INFO" value="true" />
<option name="DEPRECATION" value="true" />
<option name="GENERATE_NO_WARNINGS" value="false" />
<option name="GENERATE_MAKE_FILE_DEPENDENCIES" value="false" />
<option name="DO_FULL_DEPENDENCE_CHECK" value="false" />
<option name="IS_INCREMENTAL_MODE" value="false" />
<option name="IS_EMACS_ERRORS_MODE" value="true" />
<option name="ADDITIONAL_OPTIONS_STRING" value="" />
<option name="MAXIMUM_HEAP_SIZE" value="128" />
</component>
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/disaster_warning.iml" filepath="$PROJECT_DIR$/disaster_warning.iml" />
</modules>
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="1.8" />
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
</component>
<component name="libraryTable">
<library name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.8">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.8/jackson-annotations-2.9.8.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.8/jackson-annotations-2.9.8-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.8/jackson-annotations-2.9.8-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.8">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.8/jackson-core-2.9.8.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.8/jackson-core-2.9.8-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.8/jackson-core-2.9.8-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.8">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.8/jackson-databind-2.9.8.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.8/jackson-databind-2.9.8-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.8/jackson-databind-2.9.8-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.oracle:ojdbc8:19.3.0.0.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/oracle/ojdbc8/19.3.0.0.0/ojdbc8-19.3.0.0.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/oracle/ojdbc8/19.3.0.0.0/ojdbc8-19.3.0.0.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/oracle/ojdbc8/19.3.0.0.0/ojdbc8-19.3.0.0.0-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: commons-codec:commons-codec:1.11">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: commons-logging:commons-logging:1.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.2/commons-logging-1.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.2/commons-logging-1.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-logging/commons-logging/1.2/commons-logging-1.2-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: junit:junit:4.13.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.13.2/junit-4.13.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.13.2/junit-4.13.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.13.2/junit-4.13.2-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.httpcomponents:httpclient:4.5.13">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.httpcomponents:httpcore:4.4.13">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.hamcrest:hamcrest-core:1.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar!/" />
</SOURCES>
</library>
</component>
</project>

View File

@@ -0,0 +1,10 @@
handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler
.level = INFO
java.util.logging.FileHandler.pattern = ./logs/log_%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8"?>
<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>com.cpic.xim</groupId>
<artifactId>disaster_warning</artifactId>
<version>1.1</version>
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0.0</version>
<!-- <scope>system</scope>
<systemPath>${project.basedir}/lib/ojdbc8.jar</systemPath> -->
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.4</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>
<build>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M6</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>AppMain</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assmenbly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dev</id>
<properties></properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties></properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
</project>

View File

@@ -0,0 +1,174 @@
/*
* @Author: Kane
* @Date: 2022-04-22 10:53:49
* @LastEditors: Kane
* @LastEditTime: 2022-11-04 11:50:17
* @FilePath: \DisasterWarning\src\main\java\AppMain.java
* @Description: 和风天气预警推送厦门太保公众号主程序!
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
import com.cpic.xim.config.AppConfigManager;
import com.cpic.xim.config.City;
import com.cpic.xim.notify.disaster.QWeatherDisasterWarning;
import com.cpic.xim.notify.disaster.QWeatherDisasterWarningItem;
import com.cpic.xim.notify.disaster.WeatherDisasterWarningGrabber;
import com.cpic.xim.wechat.officalAccount.sendMessage;
import com.cpic.xim.config.WeatherDisasterNotifyConfig;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.*;
public class AppMain
{
// private final static String LOG_FILE_PATH = "./logs/app%u.log";
public static void main( String[] args )
{
String json;
WeatherDisasterNotifyConfig config = null;
QWeatherDisasterWarning warning = null;
Logger logger = null;
// 配置logger
try
{
setRootLogger();
logger = Logger.getLogger( "com.cpicxim" );
}
catch ( IOException error )
{
System.out.println( "配置logger失败原因" + error.getMessage() );
return;
}
// 读取配置
try
{
config = AppConfigManager.getConfig();
}
catch ( IOException error )
{
System.out.println( "读取配置文件失败!" );
System.out.println( error.getMessage() );
logger.log( Level.SEVERE, "读取配置文件失败:{0}", error.getMessage() );
return;
}
Vector<City> cities = config.getCities();
String queryURL = config.getQueryUrl();
String userKey = config.getKey();
// 遍历所有城市,查询是否有警报,有则推送。
while (true)
{
for ( City city : cities )
{
try
{
json = WeatherDisasterWarningGrabber.getWeatherDisasterWarningJSON( queryURL,
userKey, city.getCityCode(), config.getProxySetting() );
warning = WeatherDisasterWarningGrabber.convertWeatherDisasterWarning( json );
logger.log( Level.INFO, "查询{0}天气预警,结果:{1}。", new Object[]
{ city.getCityName(), json} );
Vector<QWeatherDisasterWarningItem> warningItems = warning.getWarning();
// 判断是否有警报,没有警报就结束当前城市的处理
if ( warningItems.isEmpty() == true)
{
logger.log( Level.INFO, "查询{0}天气预警,无警报!。", new Object[]
{ city.getCityName()} );
continue;
}
// 有警报,就遍历警报数组
for ( QWeatherDisasterWarningItem item : warningItems )
{
// 先检查是否已经发送过
if ( sendMessage.checkWarningHasSended( item.getId() ) == false)
{
logger.log( Level.INFO, "查询{0}天气预警ID:{1},已有发送记录,跳过。", new Object[]
{ city.getCityName(), item.getId()} );
continue;
}
// 没有发送过
logger.log( Level.INFO, "查询{0}天气预警,发送日志。", new Object[]
{ city.getCityName()} );
sendMessage.sendWeatherDisasterWarning( config.getWechatOfficalAccountURL(),
item );
logger.log( Level.INFO, "{0}天气预警,日志发送成功。", new Object[]
{ city.getCityName()} );
// 将发送的警报,保存起来
sendMessage.saveWeatherDisasterWarning( city.getCityName(), item );
}
}
catch ( IOException error )
{
System.out.println( "查询" + city.getCityName() + "出现异常!" );
System.out.println( error.getMessage() );
logger.log( Level.SEVERE, "查询 {0} 出现异常:{1}。", new Object[]
{ city.getCityName(), error.getMessage()} );
}
catch ( SQLException error )
{
logger.log( Level.SEVERE, "查询 {0} 写入数据库失败:{1}。", new Object[]
{ city.getCityName(), error.getMessage()} );
}
catch ( ClassNotFoundException error )
{
logger.log( Level.SEVERE, "查询 {0} 加载oracle驱动失败:{1}。", new Object[]
{ city.getCityName(), error.getMessage()} );
}
catch ( Exception error )
{
logger.log( Level.SEVERE, "查询 {0} 出现未知错误:{1}。", new Object[]
{ city.getCityName(), error.getMessage()} );
}
}
try
{
logger.log( Level.INFO, "查询结束,休眠{0}分钟。", config.getQueryInterval() );
Thread.sleep( config.getQueryInterval() * 1000 * 60 );
}
catch ( InterruptedException error )
{
logger.log( Level.SEVERE, "线程休眠异常,错误信息:{0}", new Object[]
{ error.getMessage()} );
}
}
}
/**
* 设置JUL的logger。
*/
private static void setRootLogger() throws IOException
{
LogManager logManager = LogManager.getLogManager();
// 使用外部的配置文件。
FileInputStream configFile = new FileInputStream( "./logging.properties" );
// 使用jar中的配置文件。
// InputStream configFile =
// AppMain.class.getClassLoader().getResourceAsStream( "logging.properties" );
logManager.readConfiguration( configFile );
Logger.getLogger( "com.cpicxim" );
}
}

View File

@@ -0,0 +1,79 @@
/*
* @Author: Kane
* @Date: 2022-05-10 16:06:14
* @LastEditors: Kane
* @LastEditTime: 2022-05-10 16:09:07
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\config\AppConfigManager.java
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.config;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
public class AppConfigManager
{
private static final int BUFFER_SIZE = 1024;
private static final String CONFIG_FILE_CHARSET = "UTF-8";
private static final String CONFIG_FILE_PATH = "./config.json";
private static WeatherDisasterNotifyConfig appConfig = null;
public static WeatherDisasterNotifyConfig getConfig() throws IOException
{
if ( appConfig != null)
{
return appConfig;
}
ObjectMapper mapper = new ObjectMapper();
FileInputStream configFile = null;
InputStreamReader in = null;
StringBuffer json = null;
char[] buffer = new char[BUFFER_SIZE];
// 设置json属性
mapper.setPropertyNamingStrategy( PropertyNamingStrategy.SNAKE_CASE );
try
{
configFile = new FileInputStream( CONFIG_FILE_PATH );
in = new InputStreamReader( configFile, CONFIG_FILE_CHARSET );
json = new StringBuffer();
int length = in.read( buffer );
while (length != -1)
{
json.append( buffer );
length = in.read( buffer );
}
appConfig = mapper.readValue( json.toString(), WeatherDisasterNotifyConfig.class );
}
finally
{
if ( configFile != null)
{
try
{
configFile.close();
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
return appConfig;
}
}

View File

@@ -0,0 +1,52 @@
package com.cpic.xim.config;
import java.util.Objects;
public class City
{
public City() {}
public String getCityName()
{
return cityName;
}
public void setCityName( String cityName )
{
this.cityName = cityName;
}
public String getCityCode()
{
return cityCode;
}
public void setCityCode( String cityCode )
{
this.cityCode = cityCode;
}
@Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
City city = (City) o;
return cityName.equals( city.cityName ) && cityCode.equals( city.cityCode );
}
@Override
public int hashCode()
{
return Objects.hash( cityName, cityCode );
}
private String cityName;
private String cityCode;
}

View File

@@ -0,0 +1,64 @@
/*
* @Author: Kane
* @Date: 2022-04-22 17:33:30
* @LastEditors: Kane
* @LastEditTime: 2022-04-23 23:50:45
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\config\CpicxmStuff.java
* @Description: 产险厦门分公司人员信息
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.config;
import java.util.Objects;
public class CpicxmStuff
{
public CpicxmStuff()
{};
public String getStuffName()
{
return stuffName;
}
public void setStuffName( String stuffName )
{
this.stuffName = stuffName;
}
public String getMobilePhone()
{
return mobilePhone;
}
public void setMobilePhone( String mobilePhone )
{
this.mobilePhone = mobilePhone;
}
@Override
public boolean equals( Object o )
{
if ( this == o)
{
return true;
}
if ( !(o instanceof CpicxmStuff))
{
return false;
}
CpicxmStuff that = (CpicxmStuff) o;
return stuffName.equals( that.stuffName ) && mobilePhone.equals( that.mobilePhone );
}
@Override
public int hashCode()
{
return Objects.hash( stuffName, mobilePhone );
}
private String stuffName;
private String mobilePhone;
}

View File

@@ -0,0 +1,116 @@
/*
* @Author: Kane
* @Date: 2022-11-04 14:18:19
* @LastEditors: Kane
* @LastEditTime: 2022-11-04 15:01:58
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\config\db\ProxySetting.java
* @Description: 用于存放代理服务器设置的类。
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.config;
import com.fasterxml.jackson.annotation.*;;
/*****************************************************
* 用于存放代理服务器设置的类。
*****************************************************/
public class ProxySetting
{
public ProxySetting()
{}
public boolean isEnable()
{
return enable;
}
public void setEnable( boolean enable )
{
this.enable = enable;
}
public String getProxyMode()
{
return proxyMode;
}
public void setProxyMode( String proxyMode )
{
this.proxyMode = proxyMode;
}
public String getProxyAddress()
{
return proxyAddress;
}
public void setProxyAddress( String proxy_address )
{
this.proxyAddress = proxy_address;
}
public int getProxyPort()
{
return proxyPort;
}
public void setProxyPort( int proxy_port )
{
this.proxyPort = proxy_port;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + (enable ? 1231 : 1237);
result = prime * result + ((proxyMode == null) ? 0 : proxyMode.hashCode());
result = prime * result + ((proxyAddress == null) ? 0 : proxyAddress.hashCode());
result = prime * result + proxyPort;
return result;
}
@Override
public boolean equals( Object obj )
{
if ( this == obj)
return true;
if ( obj == null)
return false;
if ( getClass() != obj.getClass())
return false;
ProxySetting other = (ProxySetting) obj;
if ( enable != other.enable)
return false;
if ( proxyMode == null)
{
if ( other.proxyMode != null)
return false;
} else if ( !proxyMode.equals( other.proxyMode ))
return false;
if ( proxyAddress == null)
{
if ( other.proxyAddress != null)
return false;
} else if ( !proxyAddress.equals( other.proxyAddress ))
return false;
if ( proxyPort != other.proxyPort)
return false;
return true;
}
@JsonProperty( "enable")
private boolean enable = true;
@JsonProperty( "proxy_mode")
private String proxyMode = "http";
@JsonProperty( "proxy_address")
private String proxyAddress;
@JsonProperty( "proxy_port")
private int proxyPort;
}

View File

@@ -0,0 +1,127 @@
/*
* @Author: Kane
* @Date: 2022-04-24 10:21:46
* @LastEditors: Kane
* @LastEditTime: 2022-11-04 15:03:05
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\config\WeatherDisasterNotifyConfig.java
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.config;
import java.util.Vector;
import com.fasterxml.jackson.annotation.JsonProperty;
public class WeatherDisasterNotifyConfig
{
public WeatherDisasterNotifyConfig()
{};
public String getTitle()
{
return title;
}
public void setTitle( String title )
{
this.title = title;
}
public String getKey()
{
return key;
}
public void setKey( String key )
{
this.key = key;
}
public String getQueryUrl()
{
return queryUrl;
}
public void setQueryUrl( String queryUrl )
{
this.queryUrl = queryUrl;
}
public Vector<City> getCities()
{
return cities;
}
public int getQueryInterval()
{
return queryInterval;
}
public void setQueryInterval( int queryInterval )
{
this.queryInterval = queryInterval;
}
public ProxySetting getProxySetting()
{
return proxySetting;
}
public void setProxySetting( ProxySetting proxySetting )
{
this.proxySetting = proxySetting;
}
public void setCities( Vector<City> cities )
{
this.cities = cities;
}
public Vector<CpicxmStuff> getNotifyStuffs()
{
return notifyStuffs;
}
public void setNotifyStuffs( Vector<CpicxmStuff> notifyStuffs )
{
this.notifyStuffs = notifyStuffs;
}
public String getWechatOfficalAccountURL()
{
return wechatOfficalAccountURL;
}
public void setWechatOfficalAccountURL( String wechatOfficalAccountURL )
{
this.wechatOfficalAccountURL = wechatOfficalAccountURL;
}
@JsonProperty( "title")
private String title;
@JsonProperty( "key")
private String key;
@JsonProperty( "query_url")
private String queryUrl;
@JsonProperty( "query_interval")
private int queryInterval;
@JsonProperty( "proxy_setting")
private ProxySetting proxySetting;
@JsonProperty( "wechat_officalaccount_url")
private String wechatOfficalAccountURL;
@JsonProperty( "cities")
private Vector<City> cities;
@JsonProperty( "notify_stuffs")
private Vector<CpicxmStuff> notifyStuffs;
}

View File

@@ -0,0 +1,69 @@
/*
* @Author: Kane
* @Date: 2022-04-22 17:33:30
* @LastEditors: Kane
* @LastEditTime: 2022-04-27 16:53:13
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\config\db\DBTable.java
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.config.db;
import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonProperty;
public class DBTable
{
public DBTable()
{}
public String getTableName()
{
return tableName;
}
public void setTableName( String tableName )
{
this.tableName = tableName;
}
public String getTableDescription()
{
return tableDescription;
}
public void setTableDescription( String tableDescription )
{
this.tableDescription = tableDescription;
}
@Override
public boolean equals( Object o )
{
if ( this == o)
{
return true;
}
if ( !(o instanceof DBTable))
{
return false;
}
DBTable dbTable = (DBTable) o;
return tableName.equals( dbTable.tableName )
&& tableDescription.equals( dbTable.tableDescription );
}
@Override
public int hashCode()
{
return Objects.hash( tableName, tableDescription );
}
@JsonProperty( "table_name")
private String tableName;
@JsonProperty( "table_description")
private String tableDescription;
}

View File

@@ -0,0 +1,113 @@
/*
* @Author: Kane
* @Date: 2022-04-22 17:33:30
* @LastEditors: Kane
* @LastEditTime: 2022-04-25 21:33:07
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\config\db\OracleConfig.java
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.config.db;
import java.util.Vector;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* @Description oracle数据库相关参数对象。
*/
public class OracleConfig
{
public String getTnsName()
{
return tnsName;
}
public void setTnsName( String tnsName )
{
this.tnsName = tnsName;
}
public String getIpAddr()
{
return ipAddr;
}
public void setIpAddr( String ipAddr )
{
this.ipAddr = ipAddr;
}
public String getJdbcURL()
{
return jdbcURL;
}
public void setJdbcURL( String jdbcURL )
{
this.jdbcURL = jdbcURL;
}
public String getTableSpace()
{
return tableSpace;
}
public void setTableSpace( String tableSpace )
{
this.tableSpace = tableSpace;
}
public String getUserName()
{
return userName;
}
public void setUserName( String userName )
{
this.userName = userName;
}
public String getPassword()
{
return password;
}
public void setPassword( String password )
{
this.password = password;
}
public Vector<DBTable> getTables()
{
return tables;
}
public void setTables( Vector<DBTable> tables )
{
this.tables = tables;
}
@JsonProperty( "tns_name")
private String tnsName;
@JsonProperty( "ip_addr")
private String ipAddr;
@JsonProperty( "jdbc_url")
private String jdbcURL;
@JsonProperty( "table_space")
private String tableSpace;
@JsonProperty( "user_name")
private String userName;
@JsonProperty( "password")
private String password;
@JsonProperty( "tables")
private Vector<DBTable> tables;
}

View File

@@ -0,0 +1,77 @@
/*
* @Author: Kane
* @Date: 2022-04-25 21:45:12
* @LastEditors: Kane
* @LastEditTime: 2022-11-04 14:51:25
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\config\db\OracleConfigManager.java
* @Description: oracle数据库配置文件加载类
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.config.db;
import java.io.*;
import com.fasterxml.jackson.databind.*;
public class OracleConfigManager
{
private static final String CONFIG_FILE_PATH = "./db.json";
private static final String CONFIG_FILE_CHARSET = "UTF-8";
private static final int BUFFER_SIZE = 1024;
private static OracleConfig dbConfig = null;
private OracleConfigManager()
{}
public static OracleConfig getOracleConfig() throws IOException
{
FileInputStream file = null;
InputStreamReader in = null;
StringBuffer json = null;
char[] buffer = new char[BUFFER_SIZE];
if ( dbConfig != null)
{
return dbConfig;
}
try
{
file = new FileInputStream( CONFIG_FILE_PATH );
in = new InputStreamReader( file, CONFIG_FILE_CHARSET );
json = new StringBuffer();
int count = in.read( buffer );
while (count != -1)
{
json.append( buffer );
count = in.read( buffer );
}
ObjectMapper mapper = new ObjectMapper();
dbConfig = mapper.readValue( json.toString(), OracleConfig.class );
}
catch ( IOException error )
{
throw error;
}
finally
{
try
{
file.close();
}
catch ( Exception error )
{
error.printStackTrace();
}
}
return dbConfig;
}
}

View File

@@ -0,0 +1,96 @@
/*
* @Author: Kane
* @Date: 2022-04-22 09:54:05
* @LastEditors: Kane
* @LastEditTime: 2022-11-04 11:48:28
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\httpUtil\HttpUtils.java
* @Description: http相关的工具类。
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.httpUtil;
import java.util.HashMap;
import java.net.URL;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.nio.charset.StandardCharsets;
/**
* Http相关的工具类。
*/
public class HttpUtils {
/**
* 以POST方式发送http请求
*
* @param url 访问的链接字符串
* @param headers 请求头部参数集合
* @param params 请求体字符串
*/
public static String postHttpRequest(String url, HashMap<String, String> headers,
String param) throws MalformedURLException {
URL httpURL = null;
HttpURLConnection conn = null;
OutputStreamWriter out = null;
BufferedReader in = null;
StringBuilder result = new StringBuilder();
try {
// 获取connection
httpURL = new URL(url);
conn = (HttpURLConnection) httpURL.openConnection();
// 设置请求方式
conn.setRequestMethod("POST");
// 设置请求头参数
for (HashMap.Entry<String, String> head : headers.entrySet()) {
conn.setRequestProperty(head.getKey(), head.getValue());
}
// 连接
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
// 输出请求
out = new OutputStreamWriter(conn.getOutputStream(), StandardCharsets.UTF_8);
out.write(param);
out.flush();
// 读取返回值。
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = in.readLine();
while (line != null) {
result.append(line);
line = in.readLine();
}
} catch (IOException error) {
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
if (conn != null) {
conn.disconnect();
}
} catch (Exception error) {
error.printStackTrace();
}
}
return result.toString();
}
}

View File

@@ -0,0 +1,88 @@
/*
* @Author: Kane
* @Date: 2022-04-24 10:21:46
* @LastEditors: Kane
* @LastEditTime: 2022-04-24 11:28:58
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\notify\disaster\QWeatherDisasterWarning.java
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.notify.disaster;
import java.util.Date;
import java.util.Vector;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
public class QWeatherDisasterWarning
{
public QWeatherDisasterWarning()
{}
public String getCode()
{
return code;
}
public void setCode( String code )
{
this.code = code;
}
public Date getUpdateTime()
{
return updateTime;
}
public void setUpdateTime( Date updateTime )
{
this.updateTime = updateTime;
}
public String getFxLink()
{
return fxLink;
}
public void setFxLink( String fxLink )
{
this.fxLink = fxLink;
}
public Vector<QWeatherDisasterWarningItem> getWarning()
{
return warning;
}
public void setWarning( Vector<QWeatherDisasterWarningItem> warning )
{
this.warning = warning;
}
public QWeatherDisasterWarningRefer getRefer()
{
return refer;
}
public void setRefer( QWeatherDisasterWarningRefer refer )
{
this.refer = refer;
}
@JsonProperty( "code")
private String code;
@JsonProperty( "updateTime")
@JsonFormat( pattern = "yyyy-MM-dd'T'HH:mmXXX")
private Date updateTime;
@JsonProperty( "fxLink")
private String fxLink;
@JsonProperty( "warning")
private Vector<QWeatherDisasterWarningItem> warning;
@JsonProperty( "refer")
private QWeatherDisasterWarningRefer refer;
}

View File

@@ -0,0 +1,357 @@
package com.cpic.xim.notify.disaster;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
//import com.fasterxml.jackson.annotation.JsonIgnore;
public class QWeatherDisasterWarningItem
{
public QWeatherDisasterWarningItem()
{}
public String getId()
{
return id;
}
public void setId( String id )
{
this.id = id;
}
public String getSender()
{
return sender;
}
public void setSender( String sender )
{
this.sender = sender;
}
public Date getPubTime()
{
return pubTime;
}
public void setPubTime( Date pubTime )
{
this.pubTime = pubTime;
}
public String getTitle()
{
return title;
}
public void setTitle( String title )
{
this.title = title;
}
public Date getStartTime()
{
return startTime;
}
public void setStartTime( Date startTime )
{
this.startTime = startTime;
}
public Date getEndTime()
{
return endTime;
}
public void setEndTime( Date endTime )
{
this.endTime = endTime;
}
public String getStatus()
{
return status;
}
public void setStatus( String status )
{
this.status = status;
}
public String getLevel()
{
return level;
}
public void setLevel( String level )
{
this.level = level;
}
public String getSeverity()
{
return severity;
}
public void setSeverity( String severity )
{
this.severity = severity;
}
public String getSeverityColor()
{
return severityColor;
}
public void setSeverityColor( String severityColor )
{
this.severityColor = severityColor;
}
public String getType()
{
return type;
}
public void setType( String type )
{
this.type = type;
}
public String getTypeName()
{
return typeName;
}
public void setTypeName( String typeName )
{
this.typeName = typeName;
}
public String getText()
{
return text;
}
public void setText( String text )
{
this.text = text;
}
public String getRelated()
{
return related;
}
public void setRelated( String related )
{
this.related = related;
}
public String getUrgency()
{
return urgency;
}
public void setUrgency( String urgency )
{
this.urgency = urgency;
}
public String getCertainty()
{
return certainty;
}
public void setCertainty( String certainty )
{
this.certainty = certainty;
}
@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((sender == null) ? 0 : sender.hashCode());
result = prime * result + ((pubTime == null) ? 0 : pubTime.hashCode());
result = prime * result + ((title == null) ? 0 : title.hashCode());
result = prime * result + ((startTime == null) ? 0 : startTime.hashCode());
result = prime * result + ((endTime == null) ? 0 : endTime.hashCode());
result = prime * result + ((status == null) ? 0 : status.hashCode());
result = prime * result + ((level == null) ? 0 : level.hashCode());
result = prime * result + ((severity == null) ? 0 : severity.hashCode());
result = prime * result + ((severityColor == null) ? 0 : severityColor.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((typeName == null) ? 0 : typeName.hashCode());
result = prime * result + ((text == null) ? 0 : text.hashCode());
result = prime * result + ((related == null) ? 0 : related.hashCode());
result = prime * result + ((urgency == null) ? 0 : urgency.hashCode());
result = prime * result + ((certainty == null) ? 0 : certainty.hashCode());
return result;
}
@Override
public boolean equals( Object obj )
{
if ( this == obj)
return true;
if ( obj == null)
return false;
if ( getClass() != obj.getClass())
return false;
QWeatherDisasterWarningItem other = (QWeatherDisasterWarningItem) obj;
if ( id == null)
{
if ( other.id != null)
return false;
} else if ( !id.equals( other.id ))
return false;
if ( sender == null)
{
if ( other.sender != null)
return false;
} else if ( !sender.equals( other.sender ))
return false;
if ( pubTime == null)
{
if ( other.pubTime != null)
return false;
} else if ( !pubTime.equals( other.pubTime ))
return false;
if ( title == null)
{
if ( other.title != null)
return false;
} else if ( !title.equals( other.title ))
return false;
if ( startTime == null)
{
if ( other.startTime != null)
return false;
} else if ( !startTime.equals( other.startTime ))
return false;
if ( endTime == null)
{
if ( other.endTime != null)
return false;
} else if ( !endTime.equals( other.endTime ))
return false;
if ( status == null)
{
if ( other.status != null)
return false;
} else if ( !status.equals( other.status ))
return false;
if ( level == null)
{
if ( other.level != null)
return false;
} else if ( !level.equals( other.level ))
return false;
if ( severity == null)
{
if ( other.severity != null)
return false;
} else if ( !severity.equals( other.severity ))
return false;
if ( severityColor == null)
{
if ( other.severityColor != null)
return false;
} else if ( !severityColor.equals( other.severityColor ))
return false;
if ( type == null)
{
if ( other.type != null)
return false;
} else if ( !type.equals( other.type ))
return false;
if ( typeName == null)
{
if ( other.typeName != null)
return false;
} else if ( !typeName.equals( other.typeName ))
return false;
if ( text == null)
{
if ( other.text != null)
return false;
} else if ( !text.equals( other.text ))
return false;
if ( related == null)
{
if ( other.related != null)
return false;
} else if ( !related.equals( other.related ))
return false;
if ( urgency == null)
{
if ( other.urgency != null)
return false;
} else if ( !urgency.equals( other.urgency ))
return false;
if ( certainty == null)
{
if ( other.certainty != null)
return false;
} else if ( !certainty.equals( other.certainty ))
return false;
return true;
}
@JsonProperty( "id")
private String id;
@JsonProperty( "sender")
private String sender;
@JsonProperty( "pubTime")
@JsonFormat( shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd\'T\'HH:mmXXX")
private Date pubTime;
@JsonProperty( "title")
private String title;
@JsonProperty( "startTime")
@JsonFormat( shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd\'T\'HH:mmXXX")
private Date startTime;
@JsonProperty( "endTime")
@JsonFormat( shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd\'T\'HH:mmXXX")
private Date endTime;
@JsonProperty( "status")
private String status;
@JsonProperty( "level")
private String level;
@JsonProperty( "severity")
private String severity;
@JsonProperty( "severityColor")
private String severityColor;
@JsonProperty( "type")
private String type;
@JsonProperty( "typeName")
private String typeName;
@JsonProperty( "text")
private String text;
@JsonProperty( "related")
private String related;
@JsonProperty( "urgency")
private String urgency;
@JsonProperty( "certainty")
private String certainty;
}

View File

@@ -0,0 +1,41 @@
/*
* @Author: Kane
* @Date: 2022-03-17 21:08:09
* @LastEditors: Kane
* @LastEditTime: 2022-03-18 00:30:53
* @FilePath: \天气灾害预警\src\main\java\com\cpic\xim\disaster_warning\QWeatherDisasterWarningRefer.java
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.notify.disaster;
//import java.util.Objects;
public class QWeatherDisasterWarningRefer
{
public QWeatherDisasterWarningRefer() {}
public String[] getSources()
{
return sources;
}
public void setSources( String[] sources )
{
this.sources = sources;
}
public String[] getLicense()
{
return license;
}
public void setLicense( String[] license )
{
this.license = license;
}
private String[] sources;
private String[] license;
}

View File

@@ -0,0 +1,146 @@
/**
* @author 王炜
* @version 1.0
*/
package com.cpic.xim.notify.disaster;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.util.zip.GZIPInputStream;
import com.cpic.xim.config.ProxySetting;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
*
*/
public class WeatherDisasterWarningGrabber
{
/***
* 从和风天气获取天气警报json字符串
*
* @param cityCode 城市或区域代码
* @return 返回警报的json字符串
*/
public static String getWeatherDisasterWarningJSON( String queryURL, String userKey,
String cityCode, ProxySetting proxySetting )
{
// 拼接url字符串
String json = "";
String requestURL = queryURL + "key=" + userKey + "&location=" + cityCode;
// 链接用
HttpURLConnection connection = null;
URL url = null;
InputStream inputStream = null;
BufferedReader bufferedReader = null;
StringBuilder buffer = new StringBuilder();
try
{
url = new URL( requestURL );
// 是否要用代理服务器
if ( proxySetting.isEnable())
{
InetSocketAddress proxyAddress = new InetSocketAddress(
proxySetting.getProxyAddress(), proxySetting.getProxyPort() );
Proxy proxy = new Proxy( Proxy.Type.HTTP, proxyAddress );
connection = (HttpURLConnection) url.openConnection( proxy );
} else
{
connection = (HttpURLConnection) url.openConnection();
}
connection.setRequestMethod( "GET" );
connection.setConnectTimeout( 15000 );
connection.setReadTimeout( 60000 );
connection.connect();
// 如果responseCode为200说明访问成功
if ( connection.getResponseCode() == 200)
{
// 注意和风使用了gzip压缩响应体
inputStream = new GZIPInputStream( connection.getInputStream() );
bufferedReader =
new BufferedReader( new InputStreamReader( inputStream, "UTF-8" ) );
// 读出数据
String temp = bufferedReader.readLine();
while (temp != null)
{
buffer.append( temp );
temp = bufferedReader.readLine();
}
json = buffer.toString();
}
}
catch ( MalformedURLException error )
{
error.printStackTrace();
}
catch ( IOException error )
{
System.out.println( "读取失败!" );
}
finally
{
if ( bufferedReader != null)
{
try
{
bufferedReader.close();
}
catch ( IOException error )
{
error.printStackTrace();
}
}
if ( inputStream != null)
{
try
{
inputStream.close();
}
catch ( IOException error )
{
error.printStackTrace();
}
}
if ( connection != null)
{
connection.disconnect();
}
}
return json;
}
/**
* 将天气警告的json字符串转换成java对象。
*
* @param json json字符串
* @return 返回 QWeatherDisasterWarning 对象。
* @throws IOException
*/
public static QWeatherDisasterWarning convertWeatherDisasterWarning( String json )
throws IOException
{
ObjectMapper mapper = new ObjectMapper();
QWeatherDisasterWarning warning = mapper.readValue( json, QWeatherDisasterWarning.class );
return warning;
}
}

View File

@@ -0,0 +1,439 @@
/*
* @Author: Kane
* @Date: 2022-04-22 10:53:49
* @LastEditors: Kane
* @LastEditTime: 2022-12-16 15:51:36
* @FilePath: \DisasterWarning\src\main\java\com\cpic\xim\wechat\officalAccount\sendMessage.java
* @Description: 用来推送公众号消息的程序库。
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.wechat.officalAccount;
import com.cpic.xim.config.db.OracleConfigManager;
import com.cpic.xim.config.db.OracleConfig;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.cpic.xim.notify.disaster.*;
import com.cpic.xim.httpUtil.HttpUtils;
/**
* 推送微信公众号消息。
*
* @author Kane
*/
public class sendMessage
{
private static HashMap<String, String> warningLevel;
/*****************************************************
* 推送天气灾害预警!接口文档参考 彭奕洁 编写《消息发送接口调用文档》
* 使用 post 方式,请求体内容以最基础的 post 格式。
*
* @param officalAccountURL 产险厦门分公司公众号接口网址
* @param warningItem 灾害预警对象
*****************************************************/
public static void sendWeatherDisasterWarning( String officalAccountURL,
QWeatherDisasterWarningItem warningItem )
{
// Vector<QWeatherDisasterWarningItem> warningItems = warningItem.getWarning();
StringBuilder requestBody = null;
// 设置请求头参数
HashMap<String, String> headers = new HashMap<String, String>();
headers.put( "accept", "*/*" );
headers.put( "Connection", "Keep-Alive" );
headers.put( "Content-Type", "application/x-www-form-urlencoded;charset=UTF-8" );
// 遍历消息,将消息推送出去。
// 拼接消息内容
String title = warningItem.getTitle();
String text = warningItem.getText();
String color = warningLevel.containsKey( warningItem.getLevel() )
? warningLevel.get( warningItem.getLevel() )
: "#000000";
requestBody = new StringBuilder();
requestBody.append( "tplid=57&groupid=1&first=尊敬的#realname#,您好!&" );
requestBody.append( "keyword1=" ).append( title ).append( "&" );
requestBody.append( "keyword1color=" ).append( color ).append( "&" );
requestBody.append( "keyword2=" ).append( text );
try
{
HttpUtils.postHttpRequest( officalAccountURL, headers, requestBody.toString() );
}
catch ( MalformedURLException error )
{
error.printStackTrace();
}
}
/**
* 检查预警是否已经推送过,通过 QWeatherDisasterWarningItem 对象的 id 属性。
* 查询 oracle xmcx1 数据库 wechat 表空间下 weather_disaster_notify 表,
* 统计 warningID 的数量如果不为0,说明该预警已经保存过,视为已经推送过。
*
* @param warningID 预警的id
* @return 如果推送过返回false否则返回 true。
*/
public static boolean checkWarningHasSended( String warningID )
throws ClassNotFoundException, SQLException, IOException
{
boolean result = false;
OracleConfig dbConfig = OracleConfigManager.getOracleConfig();
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
String jdbcURL = dbConfig.getJdbcURL();
String userName = dbConfig.getUserName();
String password = dbConfig.getPassword();
String sql = "select count(*) from weather_disaster_notify where notify_id = ?";
// Logger logger = Logger.getLogger( "com.cpicxim.wechat.officalAccount.sendMessage" );
try
{
Class.forName( "oracle.jdbc.driver.OracleDriver" );
conn = DriverManager.getConnection( jdbcURL, userName, password );
stmt = conn.prepareStatement( sql );
stmt.setString( 1, warningID );
rs = stmt.executeQuery();
if ( rs.next() && rs.getInt( 1 ) == 0)
{
result = true;
}
}
finally
{
try
{
if ( rs != null)
{
rs.close();
}
}
catch ( Exception error )
{
error.printStackTrace();
}
try
{
if ( stmt != null)
{
stmt.close();
}
}
catch ( Exception error )
{
error.printStackTrace();
}
try
{
if ( conn != null)
{
conn.close();
}
}
catch ( Exception error )
{
error.printStackTrace();
}
}
return result;
}
/**
* 保存天气预警警报数据。
* 保存至 oracle xmcx1 数据库 wechat 表空间下 weather_disaster_notify 表。
* 保存的数据用来判断预警是否已经推送过,以防止反复推送数据。
*
* @param city 城市名称
* @param warning 预警数据,为 QWeatherDisasterWarningItem 对象。
* @throws SQLException 执行sql时可能抛出的异常。出现sql异常就回滚事务。
* @throws IOException 读取数据库配置文件时可能抛出的异常。
* @throws ClassNotFoundException 加载oracle jdbc驱动时可能抛出的异常。
*/
public static void saveWeatherDisasterWarning( String city,
QWeatherDisasterWarningItem warning )
throws SQLException, IOException, ClassNotFoundException
{
Connection conn = null;
PreparedStatement stmt = null;
String sql = new StringBuilder()
.append( "insert into weather_disaster_notify(notify_id, sender, city," )
.append( "warning_level, warning_type_code, warning_type_name, title," )
.append( "text, pub_time) values( ?,?,?,?,?,?,?,?,?)" ).toString();
OracleConfig dbConfig = OracleConfigManager.getOracleConfig();
String jdbcURL = dbConfig.getJdbcURL();
String userName = dbConfig.getUserName();
String password = dbConfig.getPassword();
try
{
Class.forName( "oracle.jdbc.driver.OracleDriver" );
conn = DriverManager.getConnection( jdbcURL, userName, password );
stmt = conn.prepareStatement( sql );
conn.setAutoCommit( false );
java.sql.Timestamp pubTime = new java.sql.Timestamp( warning.getPubTime().getTime() );
stmt.setString( 1, warning.getId() );
stmt.setString( 2, warning.getSender() );
stmt.setString( 3, city );
stmt.setString( 4, warning.getLevel() );
stmt.setString( 5, warning.getType() );
stmt.setString( 6, warning.getTypeName() );
stmt.setString( 7, warning.getTitle() );
stmt.setString( 8, warning.getText() );
stmt.setTimestamp( 9, pubTime );
stmt.execute();
// 没有问题就提交
conn.commit();
}
catch ( SQLException error )
{
// 出现sql错误就回滚
if ( conn != null)
{
conn.rollback();
}
throw error;
}
finally
{
try
{
if ( stmt != null)
{
stmt.close();
}
}
catch ( Exception error )
{
error.printStackTrace();
}
try
{
if ( conn != null)
{
conn.close();
}
}
catch ( Exception error )
{
error.printStackTrace();
}
}
}
static
{
// 预警级别色彩
warningLevel = new HashMap<>();
warningLevel.put( "蓝色", "#0000FF" );
warningLevel.put( "黄色", "#FFFF00" );
warningLevel.put( "橙色", "#FFA500" );
warningLevel.put( "红色", "#FF0000" );
}
}
class WechatOfficalAccountMessageParameter
{
WechatOfficalAccountMessageParameter()
{
tplID = 57;
groupID = 1;
}
@JsonProperty( "tplid")
private int tplID;
@JsonProperty( "groupid")
private int groupID;
@JsonProperty( "first")
private String first;
@JsonProperty( "keyword1")
private String keyword1;
@JsonProperty( "keyword1color")
private String keyword1Color;
@JsonProperty( "keyword2")
private String keyword2;
@JsonProperty( "keyword2color")
private String keyword2Color;
@JsonProperty( "remark")
private String remark;
@JsonProperty( "remarkcolor")
private String remarkColor;
@JsonProperty( "url")
private String url;
@JsonProperty( "appid")
private String appid;
@JsonProperty( "pagepath")
private String pagePath;
public int getTplID()
{
return tplID;
}
public void setTplID( int tplID )
{
this.tplID = tplID;
}
public int getGroupID()
{
return groupID;
}
public void setGroupID( int groupID )
{
this.groupID = groupID;
}
public String getFirst()
{
return first;
}
public void setFirst( String first )
{
this.first = first;
}
public String getKeyword1()
{
return keyword1;
}
public void setKeyword1( String keyword1 )
{
this.keyword1 = keyword1;
}
public String getKeyword1Color()
{
return keyword1Color;
}
public void setKeyword1Color( String keyword1Color )
{
this.keyword1Color = keyword1Color;
}
public String getKeyword2()
{
return keyword2;
}
public void setKeyword2( String keyword2 )
{
this.keyword2 = keyword2;
}
public String getKeyword2Color()
{
return keyword2Color;
}
public void setKeyword2Color( String keyword2Color )
{
this.keyword2Color = keyword2Color;
}
public String getRemark()
{
return remark;
}
public void setRemark( String remark )
{
this.remark = remark;
}
public String getRemarkColor()
{
return remarkColor;
}
public void setRemarkColor( String remarkColor )
{
this.remarkColor = remarkColor;
}
public String getUrl()
{
return url;
}
public void setUrl( String url )
{
this.url = url;
}
public String getAppid()
{
return appid;
}
public void setAppid( String appid )
{
this.appid = appid;
}
public String getPagePath()
{
return pagePath;
}
public void setPagePath( String pagePath )
{
this.pagePath = pagePath;
}
}

View File

@@ -0,0 +1,10 @@
handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler
.level = INFO
java.util.logging.FileHandler.pattern = ./logs/log_%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true;

View File

@@ -0,0 +1,100 @@
/*
* @Author: Kane
* @Date: 2022-04-22 10:53:49
* @LastEditors: Kane
* @LastEditTime: 2023-05-15 21:03:21
* @FilePath: /DisasterWarning/src/test/java/com/cpic/xim/wechat/officalAccount/sendMessageTest.java
* @Description:
*
* Copyright (c) ${2022} by Kane, All Rights Reserved.
*/
package com.cpic.xim.wechat.officalAccount;
import com.cpic.xim.notify.disaster.QWeatherDisasterWarning;
import static org.junit.Assert.*;
import com.cpic.xim.httpUtil.*;
import java.io.IOException;
import java.util.*;
import org.junit.Test;
import com.fasterxml.jackson.databind.ObjectMapper;
public class sendMessageTest
{
private static String url =
"https://cxxmwx.cpic.com.cn/app/index.php?i=2&c=entry&do=send_group_tpl_api&m=ok_tplmessage";
@Test
public void postNotifyMessageJson()
{
try
{
// sendMessage.postNotifyMessageJSON( url, "警报", "警报标题", "警报内容!" );
}
catch ( Exception error )
{
fail( "测试失败!" );
}
}
// @Test
public void postNotifyMessage()
{
HashMap<String, String> headers = new HashMap<String, String>();
String param = "tplid=57&groupid=1&first=亲爱的#realname#,您好!&"
+ "keyword1=东山县气象台发布大雾黄色预警[Ⅲ级/较重]&" + "keyword1color=#ffff00&"
+ "keyword2=东山县气象台2022年04月22日06时12分发布大雾黄色预警信号预计未来12小时内我县、闽南渔场和台湾浅滩渔场将出现能见度小于500米的雾。请注意防范";
headers.put( "accept", "*/*" );
headers.put( "Connection", "Keep-Alive" );
headers.put( "Content-Type", "application/x-www-form-urlencoded;charset=UTF-8" );
try
{
HttpUtils.postHttpRequest( url, headers, param );
}
catch ( Exception error )
{
}
}
// @Test
public void testSendWeatherDisasterWarning() throws IOException
{
String warningJSON =
"{\"code\":\"200\",\"updateTime\":\"2022-04-23T23:25+08:00\",\"fxLink\":\"http://hfx.link/3645\",\"warning\":[{\"id\":\"10123060820220423203500874007118\",\"sender\":\"东山县气象台\",\"pubTime\":\"2022-04-23T20:35+08:00\",\"title\":\"东山县气象台发布大雾黄色预警[Ⅲ级/较重]\",\"status\":\"active\",\"level\":\"黄色\",\"type\":\"1017\",\"typeName\":\"大雾\",\"text\":\"东山县气象台2022年04月23日20时35分发布大雾黄色预警信号预计未来12小时内我县、闽南渔场和台湾浅滩渔场将出现能见度小于500米的雾。请注意防范\",\"related\":\"\",\"urgency\":\"\",\"certainty\":\"\"}],\"refer\":{\"sources\":[\"12379\"],\"license\":[\"no commercial use\"]}}";
try
{
ObjectMapper mapper = new ObjectMapper();
QWeatherDisasterWarning warning =
mapper.readValue( warningJSON, QWeatherDisasterWarning.class );
String city = "东山县";
// sendMessage.saveWeatherDisasterWarning( city, warning );
}
catch ( Exception error )
{
fail( error.getMessage() );
}
}
@Test
public void testCheckWarningHasSended()
{
String warningID = "10123060820220422061200476313081";
try
{
sendMessage.checkWarningHasSended( warningID );
}
catch ( Exception error )
{
error.printStackTrace();
}
}
}

27
应用/1.0/config.json Normal file
View File

@@ -0,0 +1,27 @@
{
"title": "天气灾害预警配置文件",
"key": "fe9fa8eeeb6f4301a92541eed565dd15",
"query_url": "https://devapi.qweather.com/v7/warning/now?",
"wechat_officalaccount_url": "https://cxxmwx.cpic.com.cn/app/index.php?i=2&c=entry&do=send_group_tpl_api&m=ok_tplmessage",
"query_interval": 10,
"cities": [
{
"city_name": "厦门",
"city_code": "101230201"
},
{
"city_name": "同安",
"city_code": "101230202"
},
{
"city_name": "翔安",
"city_code": "101230207"
}
],
"notify_stuffs": [
{
"stuff_name": "王炜",
"mobile_phone": "15959215339"
}
]
}

14
应用/1.0/db.json Normal file
View File

@@ -0,0 +1,14 @@
{
"tns_name": "xmcx1",
"ip_addr": "10.39.0.86",
"jdbc_url": "jdbc:oracle:thin:@10.39.0.86:1521:xmcx1",
"table_space": "wechat",
"user_name": "wechat",
"password": "@rn7Q+t5zeyKIZ~s",
"tables": [
{
"table_name": "weather_disaster_notify",
"table_description": "天气预警消息表"
}
]
}

View File

@@ -0,0 +1,10 @@
handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler
.level = INFO
java.util.logging.FileHandler.pattern = ./logs/log_%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append = true;

2
应用/1.0/run.bat Normal file
View File

@@ -0,0 +1,2 @@
java -jar disaster_warning-1.0-SNAPSHOT-jar-with-dependencies.jar
pause

Binary file not shown.

View File

@@ -0,0 +1,23 @@
{
"code": "200",
"updateTime": "2022-04-22T15:54+08:00",
"fxLink": "http://hfx.link/3645",
"warning": [
{
"id": "10123060820220422061200476313081",
"sender": "东山县气象台",
"pubTime": "2022-04-22T06:12+08:00",
"title": "东山县气象台发布大雾黄色预警[Ⅲ级/较重]",
"status": "active",
"level": "黄色",
"type": "1017",
"typeName": "大雾",
"text": "东山县气象台2022年04月22日06时12分发布大雾黄色预警信号预计未来12小时内我县、闽南渔场和台湾浅滩渔场将出现能见度小于500米的雾。请注意防范",
"related": "",
"urgency": "",
"certainty": ""
}
],
"refer": { "sources": ["12379"], "license": ["no commercial use"] },
"testURL": "https://devapi.qweather.com/v7/warning/now?key=fe9fa8eeeb6f4301a92541eed565dd15&location=101230201"
}

View File

@@ -0,0 +1,26 @@
{
"code": "200",
"updateTime": "2022-11-04T15:18+08:00",
"fxLink": "http://hfx.link/3565",
"warning": [
{
"id": "10123020120221104060100024343791",
"sender": "厦门市气象台",
"pubTime": "2022-11-04T06:01+08:00",
"title": "厦门市气象台发布大风黄色预警[Ⅲ级/较重]",
"startTime": "2022-11-04T06:09+08:00",
"endTime": "2022-11-05T06:09+08:00",
"status": "active",
"level": "黄色",
"severity": "Moderate",
"severityColor": "Yellow",
"type": "1006",
"typeName": "大风",
"urgency": "",
"certainty": "",
"text": "厦门市气象台2022年11月04日06时01分发布大风黄色预警信号受冷空气影响未来12小时思明区、湖里区、集美区、海沧区及海上风力逐渐增强预计厦门市区东北风最大可达56级、阵风78级厦门内海及各大桥、高海拔山区最大可达67级、阵风89级崇武到东山沿海最大可达78级、阵风9级台湾海峡南部最大可达78级、阵风910级。请注意防范。同安区、翔安区请关注属地的预警信号发布情况。",
"related": ""
}
],
"refer": { "sources": ["12379"], "license": ["no commercial use"] }
}

211
文档/example.java Normal file
View File

@@ -0,0 +1,211 @@
/*
* @Author: Kane
* @Date: 2022-04-18 11:37:33
* @LastEditors: Kane
* @LastEditTime: 2022-04-18 15:58:34
* @FilePath: \undefinedd:\develop\产险厦门分公司项目\天气灾害预警\文档\example.java
import org.apache.httpcomponents.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
public class HttpUtils {
public static String sendPostWithJson(String url, String jsonStr, HashMap<String, String> headers) {
// 返回的结果
String jsonResult = "";
try {
HttpClient client = new HttpClient();
// 连接超时
client.getHttpConnectionManager().getParams().setConnectionTimeout(3 * 1000);
// 读取数据超时
client.getHttpConnectionManager().getParams().setSoTimeout(3 * 60 * 1000);
client.getParams().setContentCharset("UTF-8");
PostMethod postMethod = new PostMethod(url);
postMethod.setRequestHeader("content-type", headers.get("content-type"));
// 非空
if (null != jsonStr && !"".equals(jsonStr)) {
StringRequestEntity requestEntity = new StringRequestEntity(jsonStr, headers.get("content-type"),
"UTF-8");
postMethod.setRequestEntity(requestEntity);
}
int status = client.executeMethod(postMethod);
if (status == HttpStatus.SC_OK) {
jsonResult = postMethod.getResponseBodyAsString();
} else {
throw new RuntimeException("接口连接失败!");
}
} catch (Exception e) {
throw new RuntimeException("接口连接失败!");
}
return jsonResult;
}
public static void main(String[] args) {
String requestUrl = "http://localhost:8070/test/rz/server/rzxx/at_VaildToken.do";
String jsonStr = "{\"name\":\"张三\"}";
HashMap<String, String> headers = new HashMap<>(3);
headers.put("content-type", "application/json");
// 发送post请求
String resultData = HttpUtils.sendPostWithJson(requestUrl, jsonStr, headers);
// 并接收返回结果
System.out.println(resultData);
}
}
/**
*
* @author : cjd
*
* @description : post接口 返回结果字符串
*
* @params : [url, param]
*
* @param url 请求接口
*
* @param param 需要的json字符串
*
* @return :java.lang.String
*
* @date : 17:31 2018/8/1
*
*/
public static String sendPost(String url, String param)
{
OutputStreamWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
HttpURLConnection conn = null; // 打开和URL之间的连接
conn = (HttpURLConnection) realUrl.openConnection(); // 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST"); // POST方法
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
conn.connect(); // 获取URLConnection对象对应的输出流
out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); // 发送请求参数
out.write(param); // flush输出流的缓冲
out.flush(); // 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null)
{
result += line;
}
}
catch (Exception e)
{
System.out.println("发送 POST 请求出现异常!" + e);
e.printStackTrace();
} // 使用finally块来关闭输出流、输入流
finally {
try {
if (out != null)
{
out.close();
}
if (in != null)
{
in.close();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
return result;
}
public String postMethod(String url,String param){
// 结果值
StringBuffer rest=new StringBuffer();
HttpURLConnection conn=null;
OutputStream out=null;
BufferedReader br=null;
try {
// 创建 URL
URL restUrl = new URL(url);
// 打开连接
conn= (HttpURLConnection) restUrl.openConnection();
// 设置请求方式为 POST
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection","keep-Alive");
// 设置接收文件类型
// conn.setRequestProperty("Accept","application/json");
//设置发送文件类型
/**
这里注意 传递JSON数据的话 就要设置
普通参数的话 就要注释掉
*/
conn.setRequestProperty("Content-Type","application/json");
// 输入 输出 都打开
conn.setDoOutput(true);
conn.setDoInput(true);
//开始连接
conn.connect();
// 传递参数 流的方式
out=conn.getOutputStream();
out.write(param.getBytes());
out.flush();
// 读取数据
br=new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
String line=null;
while (null != (line=br.readLine())){
rest.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
// 关闭所有通道
try {
if (br!=null) {
br.close();
}
if (out!=null) {
out.close();
}
if (conn!=null) {
conn.disconnect();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return rest.toString();
}

Binary file not shown.