From 99db139894f540253ea9dd3436f30ad44977995f Mon Sep 17 00:00:00 2001 From: duoduo Date: Sun, 7 Jul 2019 22:06:02 +0800 Subject: [PATCH 01/20] first step boost mode --- .../tool/push/logic/BoostPushRunThread.java | 197 ++++++++++++++++++ .../fangxuele/tool/push/logic/PushData.java | 13 ++ .../msgsender/AliDayuTemplateMsgSender.java | 5 + .../push/logic/msgsender/AliYunMsgSender.java | 5 + .../tool/push/logic/msgsender/IMsgSender.java | 7 + .../push/logic/msgsender/MailMsgSender.java | 5 + .../push/logic/msgsender/TxYunMsgSender.java | 5 + .../push/logic/msgsender/WxCpMsgSender.java | 5 + .../push/logic/msgsender/WxKefuMsgSender.java | 5 + .../logic/msgsender/WxKefuPriorMsgSender.java | 5 + .../msgsender/WxMaTemplateMsgSender.java | 5 + .../msgsender/WxMpTemplateMsgSender.java | 132 ++++++++++++ .../logic/msgsender/YunPianMsgSender.java | 5 + .../logic/msgthread/MsgAsyncSendThread.java | 41 ++++ .../java/com/fangxuele/tool/push/ui/Init.java | 2 + .../tool/push/ui/form/BoostForm.form | 53 ++--- .../tool/push/ui/form/BoostForm.java | 183 ++++++++-------- .../tool/push/ui/listener/BoostListener.java | 45 ++++ .../fangxuele/tool/push/util/ConsoleUtil.java | 22 ++ 19 files changed, 630 insertions(+), 110 deletions(-) create mode 100644 src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java create mode 100644 src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java diff --git a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java new file mode 100644 index 00000000..03503599 --- /dev/null +++ b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java @@ -0,0 +1,197 @@ +package com.fangxuele.tool.push.logic; + +import cn.hutool.core.date.BetweenFormater; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.cron.pattern.CronPattern; +import cn.hutool.cron.pattern.CronPatternUtil; +import cn.hutool.log.Log; +import cn.hutool.log.LogFactory; +import com.fangxuele.tool.push.App; +import com.fangxuele.tool.push.logic.msgsender.IMsgSender; +import com.fangxuele.tool.push.logic.msgsender.MsgSenderFactory; +import com.fangxuele.tool.push.logic.msgthread.MsgAsyncSendThread; +import com.fangxuele.tool.push.ui.form.BoostForm; +import com.fangxuele.tool.push.ui.form.ScheduleForm; +import com.fangxuele.tool.push.ui.listener.MemberListener; +import com.fangxuele.tool.push.util.ConsoleUtil; +import org.apache.commons.lang3.time.DateFormatUtils; + +import javax.swing.*; +import java.io.IOException; +import java.util.Date; + +/** + *
+ * 性能模式推送执行控制线程
+ * 
+ * + * @author RememBerBer + * @since 2019/7/7. + */ +public class BoostPushRunThread extends Thread { + + private static final Log logger = LogFactory.get(); + + @Override + public void run() { + if (PushControl.pushCheck()) { + BoostForm.boostForm.getProcessedProgressBar().setIndeterminate(true); + BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(true); + // 准备推送 + preparePushRun(); + BoostForm.boostForm.getProcessedProgressBar().setIndeterminate(false); + BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(false); + ConsoleUtil.boostConsoleWithLog("推送开始……"); + // 消息数据分片以及线程纷发 + shardingAndMsgThread(); + // 时间监控 + timeMonitor(); + } + } + + /** + * 准备推送 + */ + private void preparePushRun() { + // 按钮状态 + BoostForm.boostForm.getScheduledRunButton().setEnabled(false); + BoostForm.boostForm.getStartButton().setEnabled(false); + BoostForm.boostForm.getStopButton().setEnabled(true); + + BoostForm.boostForm.getStopButton().setText("停止"); + // 初始化 + BoostForm.boostForm.getProcessedCountLabel().setText("0"); + BoostForm.boostForm.getSuccessCountLabel().setText("0"); + BoostForm.boostForm.getFailCountLabel().setText("0"); + + // 设置是否空跑 + PushControl.dryRun = BoostForm.boostForm.getDryRunCheckBox().isSelected(); + + // 执行前重新导入目标用户 + reimportMembers(); + + // 重置推送数据 + PushData.reset(); + PushData.startTime = System.currentTimeMillis(); + + // 拷贝准备的目标用户 + PushData.toSendList.addAll(PushData.allUser); + // 总记录数 + PushData.totalRecords = PushData.toSendList.size(); + + BoostForm.boostForm.getMemberCountLabel().setText("消息总数:" + PushData.totalRecords); + BoostForm.boostForm.getProcessedProgressBar().setMaximum((int) PushData.totalRecords); + BoostForm.boostForm.getCompletedProgressBar().setMaximum((int) PushData.totalRecords); + ConsoleUtil.consoleWithLog("消息总数:" + PushData.totalRecords); + // 可用处理器核心数量 + BoostForm.boostForm.getProcessorCountLabel().setText("可用处理器核心:" + Runtime.getRuntime().availableProcessors()); + ConsoleUtil.consoleWithLog("可用处理器核心:" + Runtime.getRuntime().availableProcessors()); + + // 准备消息构造器 + PushControl.prepareMsgMaker(); + } + + /** + * 消息数据分片以及线程纷发 + */ + private static void shardingAndMsgThread() { + + MsgAsyncSendThread msgAsyncSendThread; + + IMsgSender msgSender = MsgSenderFactory.getMsgSender(); + msgAsyncSendThread = new MsgAsyncSendThread(msgSender); + + ThreadUtil.execute(msgAsyncSendThread); + ConsoleUtil.consoleWithLog("线程启动完毕……"); + } + + /** + * 时间监控 + */ + private void timeMonitor() { + long startTimeMillis = System.currentTimeMillis(); + // 计时 + while (true) { + if (PushData.stopedThreadCount.intValue() == PushData.threadCount) { + if (!PushData.fixRateScheduling) { + BoostForm.boostForm.getStopButton().setEnabled(false); + BoostForm.boostForm.getStopButton().updateUI(); + BoostForm.boostForm.getStartButton().setEnabled(true); + BoostForm.boostForm.getStartButton().updateUI(); + BoostForm.boostForm.getScheduledRunButton().setEnabled(true); + BoostForm.boostForm.getScheduledRunButton().updateUI(); + BoostForm.boostForm.getScheduledTaskLabel().setText(""); + String finishTip = "发送完毕!\n"; + JOptionPane.showMessageDialog(BoostForm.boostForm.getBoostPanel(), finishTip, "提示", + JOptionPane.INFORMATION_MESSAGE); + } else { + if (App.config.isRadioCron()) { + Date nextDate = CronPatternUtil.nextDateAfter(new CronPattern(App.config.getTextCron()), new Date(), true); + BoostForm.boostForm.getScheduledTaskLabel().setText("计划任务执行中,下一次执行时间:" + DateFormatUtils.format(nextDate, "yyyy-MM-dd HH:mm:ss")); + } + BoostForm.boostForm.getStopButton().setText("停止计划任务"); + } + + PushData.endTime = System.currentTimeMillis(); + + // 保存停止前的数据 + try { + ConsoleUtil.consoleWithLog("正在保存结果数据……"); + BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(true); + // 空跑控制 + if (!BoostForm.boostForm.getDryRunCheckBox().isSelected()) { + PushControl.savePushData(); + } + ConsoleUtil.consoleWithLog("结果数据保存完毕!"); + } catch (IOException e) { + logger.error(e); + } finally { + BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(false); + } + break; + } + + long currentTimeMillis = System.currentTimeMillis(); + long lastTimeMillis = currentTimeMillis - startTimeMillis; + long leftTimeMillis = (long) ((double) lastTimeMillis / (PushData.sendSuccessList.size() + PushData.sendFailList.size()) * (PushData.allUser.size() - PushData.sendSuccessList.size() - PushData.sendFailList.size())); + + // 耗时 + String formatBetweenLast = DateUtil.formatBetween(lastTimeMillis, BetweenFormater.Level.SECOND); + BoostForm.boostForm.getLastTimeLabel().setText("".equals(formatBetweenLast) ? "0s" : formatBetweenLast); + + // 预计剩余 + String formatBetweenLeft = DateUtil.formatBetween(leftTimeMillis, BetweenFormater.Level.SECOND); + BoostForm.boostForm.getLeftTimeLabel().setText("".equals(formatBetweenLeft) ? "0s" : formatBetweenLeft); + + BoostForm.boostForm.getJvmMemoryLabel().setText("JVM内存占用:" + FileUtil.readableFileSize(Runtime.getRuntime().totalMemory()) + "/" + FileUtil.readableFileSize(Runtime.getRuntime().maxMemory())); + + ThreadUtil.safeSleep(100); + } + } + + /** + * 重新导入目标用户(定时任务) + */ + private void reimportMembers() { + if (PushData.fixRateScheduling && ScheduleForm.scheduleForm.getReimportCheckBox().isSelected()) { + switch ((String) ScheduleForm.scheduleForm.getReimportComboBox().getSelectedItem()) { + case "通过SQL导入": + MemberListener.importFromSql(); + break; + case "通过文件导入": + MemberListener.importFromFile(); + break; + case "导入所有关注公众号的用户": + MemberListener.importWxAll(); + break; + case "导入企业通讯录中所有用户": + MemberListener.importWxCpAll(); + break; + default: + } + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushData.java b/src/main/java/com/fangxuele/tool/push/logic/PushData.java index 03d06056..bca45d1d 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushData.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushData.java @@ -26,6 +26,11 @@ public class PushData { */ static long totalRecords; + /** + * (异步发送)已处理数 + */ + public static LongAdder processedRecords = new LongAdder(); + /** * 发送成功数 */ @@ -76,6 +81,13 @@ public class PushData { */ static LongAdder stopedThreadCount = new LongAdder(); + /** + * 已处理数+1 + */ + public static void increaseProcessed() { + processedRecords.add(1); + } + /** * 成功数+1 */ @@ -112,6 +124,7 @@ public static void increaseStopedThread() { */ static void reset() { running = true; + processedRecords.reset(); successRecords.reset(); failRecords.reset(); stopedThreadCount.reset(); diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/AliDayuTemplateMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/AliDayuTemplateMsgSender.java index 7b2c93d8..3960322d 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/AliDayuTemplateMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/AliDayuTemplateMsgSender.java @@ -58,6 +58,11 @@ public SendResult send(String[] msgData) { return result; } + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } + /** * 获取阿里大于短信发送客户端 * diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/AliYunMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/AliYunMsgSender.java index 0d79b9af..c4bfbbb6 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/AliYunMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/AliYunMsgSender.java @@ -61,6 +61,11 @@ public SendResult send(String[] msgData) { return sendResult; } + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } + /** * 获取阿里云短信发送客户端 * diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/IMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/IMsgSender.java index 0d2252bb..e57675cd 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/IMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/IMsgSender.java @@ -16,4 +16,11 @@ public interface IMsgSender { * @param msgData 消息数据 */ SendResult send(String[] msgData); + + /** + * 异步发送消息 + * + * @param msgData 消息数据 + */ + SendResult asyncSend(String[] msgData); } diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/MailMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/MailMsgSender.java index 376b0f12..dca0713a 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/MailMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/MailMsgSender.java @@ -60,6 +60,11 @@ public SendResult send(String[] msgData) { return sendResult; } + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } + public SendResult sendTestMail(String tos) { SendResult sendResult = new SendResult(); diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/TxYunMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/TxYunMsgSender.java index 1b6980d6..0fbefccf 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/TxYunMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/TxYunMsgSender.java @@ -60,6 +60,11 @@ public SendResult send(String[] msgData) { return sendResult; } + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } + /** * 获取腾讯云短信发送客户端 * diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxCpMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxCpMsgSender.java index 628056db..662b7d46 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxCpMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxCpMsgSender.java @@ -70,6 +70,11 @@ public SendResult send(String[] msgData) { return sendResult; } + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } + /** * 微信企业号配置 * diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxKefuMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxKefuMsgSender.java index bc77a313..2a30f46f 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxKefuMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxKefuMsgSender.java @@ -48,4 +48,9 @@ public SendResult send(String[] msgData) { sendResult.setSuccess(true); return sendResult; } + + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } } diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxKefuPriorMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxKefuPriorMsgSender.java index 12f34e39..0f2c3a6c 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxKefuPriorMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxKefuPriorMsgSender.java @@ -33,4 +33,9 @@ public SendResult send(String[] msgData) { sendResult.setSuccess(true); return sendResult; } + + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } } diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMaTemplateMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMaTemplateMsgSender.java index b8d983c9..5aee73e7 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMaTemplateMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMaTemplateMsgSender.java @@ -57,6 +57,11 @@ public SendResult send(String[] msgData) { return sendResult; } + @Override + public SendResult asyncSend(String[] msgData) { + return null; + } + /** * 微信小程序配置 * diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java index d6180ce7..f2970702 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java @@ -1,14 +1,33 @@ package com.fangxuele.tool.push.logic.msgsender; +import cn.hutool.json.JSONUtil; import com.fangxuele.tool.push.App; import com.fangxuele.tool.push.logic.PushControl; +import com.fangxuele.tool.push.logic.PushData; import com.fangxuele.tool.push.logic.msgmaker.WxMpTemplateMsgMaker; +import com.fangxuele.tool.push.ui.form.BoostForm; +import com.fangxuele.tool.push.util.ConsoleUtil; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder; import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; +import org.apache.http.HttpResponse; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.concurrent.FutureCallback; +import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; +import org.apache.http.impl.nio.client.HttpAsyncClients; +import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager; +import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; +import org.apache.http.impl.nio.reactor.IOReactorConfig; +import org.apache.http.nio.reactor.ConnectingIOReactor; +import org.apache.http.nio.reactor.IOReactorException; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.util.concurrent.Future; /** *
@@ -22,6 +41,7 @@
 public class WxMpTemplateMsgSender implements IMsgSender {
     public volatile static WxMpInMemoryConfigStorage wxMpConfigStorage;
     public volatile static WxMpService wxMpService;
+    public volatile static CloseableHttpAsyncClient closeableHttpAsyncClient;
     private WxMpTemplateMsgMaker wxMpTemplateMsgMaker;
 
     public WxMpTemplateMsgSender() {
@@ -54,6 +74,36 @@ public SendResult send(String[] msgData) {
         return sendResult;
     }
 
+    @Override
+    public SendResult asyncSend(String[] msgData) {
+        SendResult sendResult = new SendResult();
+
+        try {
+            if (PushControl.dryRun) {
+                sendResult.setSuccess(true);
+                return sendResult;
+            } else {
+                String openId = msgData[0];
+                WxMpTemplateMessage wxMessageTemplate = wxMpTemplateMsgMaker.makeMsg(msgData);
+                wxMessageTemplate.setToUser(openId);
+
+                String url = "https://api.weixin.qq.com/cgi-bin/message/template/send";
+                // TODO
+                Future httpResponseFuture = getCloseableHttpAsyncClient().execute(new HttpPost(url), new Back(msgData));
+                if (!PushData.running) {
+                    httpResponseFuture.cancel(true);
+                }
+            }
+        } catch (Exception e) {
+            sendResult.setSuccess(false);
+            sendResult.setInfo(e.getMessage());
+            log.error(e.toString());
+            return sendResult;
+        }
+
+        return sendResult;
+    }
+
     /**
      * 微信公众号配置
      *
@@ -115,4 +165,86 @@ public static WxMpService getWxMpService() {
         }
         return wxMpService;
     }
+
+    public static CloseableHttpAsyncClient getCloseableHttpAsyncClient() throws IOReactorException {
+        if (closeableHttpAsyncClient == null) {
+            synchronized (WxMpTemplateMsgSender.class) {
+                if (closeableHttpAsyncClient == null) {
+                    RequestConfig requestConfig = RequestConfig.custom()
+                            .setConnectTimeout(500000)
+                            .setSocketTimeout(500000)
+                            .setConnectionRequestTimeout(500000)
+                            .build();
+
+                    //配置io线程
+                    IOReactorConfig ioReactorConfig = IOReactorConfig.custom().
+                            setIoThreadCount(Runtime.getRuntime().availableProcessors())
+                            .setSoKeepAlive(true).setConnectTimeout(-1).setSoTimeout(-1)
+                            .build();
+                    //设置连接池大小
+                    ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);
+                    PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(ioReactor);
+                    //最大连接数
+                    connManager.setMaxTotal(5000);
+                    //per route最大连接数
+                    connManager.setDefaultMaxPerRoute(5000);
+
+                    closeableHttpAsyncClient = HttpAsyncClients.custom().
+                            setConnectionManager(connManager)
+                            .setDefaultRequestConfig(requestConfig)
+                            .build();
+
+                    closeableHttpAsyncClient.start();
+                }
+            }
+        }
+        return closeableHttpAsyncClient;
+    }
+
+    static class Back implements FutureCallback {
+
+        String[] msgData;
+
+        Back(String[] msgData) {
+            this.msgData = msgData;
+        }
+
+        @Override
+        public void completed(HttpResponse httpResponse) {
+            try {
+                EntityUtils.toString(httpResponse.getEntity());
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+
+            // 已成功+1
+            PushData.increaseSuccess();
+            BoostForm.boostForm.getSuccessCountLabel().setText(String.valueOf(PushData.successRecords));
+
+            // 保存发送成功
+            PushData.sendSuccessList.add(msgData);
+            // 总进度条
+            BoostForm.boostForm.getCompletedProgressBar().setValue(PushData.successRecords.intValue() + PushData.failRecords.intValue());
+        }
+
+        @Override
+        public void failed(Exception e) {
+            // 总发送失败+1
+            PushData.increaseFail();
+            BoostForm.boostForm.getFailCountLabel().setText(String.valueOf(PushData.failRecords));
+
+            // 保存发送失败
+            PushData.sendFailList.add(msgData);
+
+            // 失败异常信息输出控制台
+            ConsoleUtil.boostConsoleOnly("发送失败:" + e.toString() + ";msgData:" + JSONUtil.toJsonPrettyStr(msgData));
+            // 总进度条
+            BoostForm.boostForm.getCompletedProgressBar().setValue(PushData.successRecords.intValue() + PushData.failRecords.intValue());
+        }
+
+        @Override
+        public void cancelled() {
+
+        }
+    }
 }
diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/YunPianMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/YunPianMsgSender.java
index 143f8811..2f601697 100644
--- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/YunPianMsgSender.java
+++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/YunPianMsgSender.java
@@ -61,6 +61,11 @@ public SendResult send(String[] msgData) {
         return sendResult;
     }
 
+    @Override
+    public SendResult asyncSend(String[] msgData) {
+        return null;
+    }
+
     /**
      * 获取云片网短信发送客户端
      *
diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java b/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java
new file mode 100644
index 00000000..fc951658
--- /dev/null
+++ b/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java
@@ -0,0 +1,41 @@
+package com.fangxuele.tool.push.logic.msgthread;
+
+import com.fangxuele.tool.push.logic.PushData;
+import com.fangxuele.tool.push.logic.msgsender.IMsgSender;
+import com.fangxuele.tool.push.logic.msgsender.SendResult;
+import com.fangxuele.tool.push.ui.form.BoostForm;
+
+/**
+ * 
+ * 消息异步发送服务线程
+ * 
+ * + * @author RememBerBer + * @since 2019/7/7. + */ +public class MsgAsyncSendThread extends Thread { + + private IMsgSender iMsgSender; + + public MsgAsyncSendThread(IMsgSender msgSender) { + this.iMsgSender = msgSender; + } + + @Override + public void run() { + + for (int i = 0; i < PushData.toSendList.size(); i++) { + + // 本条消息所需的数据 + String[] msgData = PushData.toSendList.get(i); + SendResult sendResult = iMsgSender.asyncSend(msgData); + // 已处理+1 + PushData.increaseProcessed(); + BoostForm.boostForm.getProcessedCountLabel().setText(String.valueOf(PushData.processedRecords)); + + // 总进度条 + BoostForm.boostForm.getProcessedProgressBar().setValue(PushData.processedRecords.intValue()); + } + + } +} diff --git a/src/main/java/com/fangxuele/tool/push/ui/Init.java b/src/main/java/com/fangxuele/tool/push/ui/Init.java index 6cf27352..84a4a4f9 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/Init.java +++ b/src/main/java/com/fangxuele/tool/push/ui/Init.java @@ -6,6 +6,7 @@ import com.fangxuele.tool.push.App; import com.fangxuele.tool.push.ui.dialog.FontSizeAdjustDialog; import com.fangxuele.tool.push.ui.form.AboutForm; +import com.fangxuele.tool.push.ui.form.BoostForm; import com.fangxuele.tool.push.ui.form.HelpForm; import com.fangxuele.tool.push.ui.form.MemberForm; import com.fangxuele.tool.push.ui.form.MessageEditForm; @@ -139,6 +140,7 @@ public static void initAllTab() { MessageManageForm.init(); MemberForm.init(); PushForm.init(); + BoostForm.init(); ScheduleForm.init(); SettingForm.init(); PushHisForm.init(); diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.form index a1e9c5a7..aad8ee90 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.form +++ b/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.form @@ -24,14 +24,14 @@ - + - + @@ -42,14 +42,14 @@ - + - + @@ -60,7 +60,7 @@ - + @@ -75,19 +75,19 @@ - + - + - + @@ -106,20 +106,20 @@ - + - + - + - + @@ -138,22 +138,22 @@ - + - + - + - + @@ -182,31 +182,32 @@ - + - + - + - + - + + @@ -226,7 +227,7 @@ - + @@ -242,7 +243,7 @@ - + @@ -255,7 +256,7 @@ - + @@ -263,7 +264,7 @@ - + @@ -271,7 +272,7 @@ - + diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java index ff84f8d6..5c98f46c 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java @@ -19,17 +19,31 @@ @Getter public class BoostForm { private JPanel boostPanel; - private JTextArea textArea1; - private JButton 开始Button; - private JButton 停止Button; - private JButton 按计划执行Button; - private JCheckBox 空跑CheckBox; - private JProgressBar progressBar1; - private JProgressBar progressBar2; + private JTextArea consoleTextArea; + private JButton startButton; + private JButton stopButton; + private JButton scheduledRunButton; + private JCheckBox dryRunCheckBox; + private JProgressBar processedProgressBar; + private JProgressBar completedProgressBar; private JLabel boostModeHelpLabel; + private JLabel processedCountLabel; + private JLabel successCountLabel; + private JLabel failCountLabel; + private JLabel lastTimeLabel; + private JLabel leftTimeLabel; + private JLabel msgNameLabel; + private JLabel memberCountLabel; + private JLabel processorCountLabel; + private JLabel jvmMemoryLabel; + private JLabel scheduledTaskLabel; public static BoostForm boostForm = new BoostForm(); + public static void init() { + boostForm.getScheduledTaskLabel().setVisible(false); + } + { // GUI initializer generated by IntelliJ IDEA GUI Designer // >>> IMPORTANT!! <<< @@ -53,65 +67,65 @@ public class BoostForm { final JSeparator separator1 = new JSeparator(); separator1.setOrientation(1); panel1.add(separator1, new GridConstraints(0, 3, 5, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + successCountLabel = new JLabel(); + Font successCountLabelFont = this.$$$getFont$$$(null, -1, 72, successCountLabel.getFont()); + if (successCountLabelFont != null) successCountLabel.setFont(successCountLabelFont); + successCountLabel.setForeground(new Color(-13587376)); + successCountLabel.setText("0"); + panel1.add(successCountLabel, new GridConstraints(0, 5, 2, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JLabel label1 = new JLabel(); - Font label1Font = this.$$$getFont$$$(null, -1, 72, label1.getFont()); - if (label1Font != null) label1.setFont(label1Font); - label1.setForeground(new Color(-13587376)); - label1.setText("1230"); - panel1.add(label1, new GridConstraints(0, 5, 2, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + label1.setText("成功"); + panel1.add(label1, new GridConstraints(0, 6, 2, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + failCountLabel = new JLabel(); + Font failCountLabelFont = this.$$$getFont$$$(null, -1, 72, failCountLabel.getFont()); + if (failCountLabelFont != null) failCountLabel.setFont(failCountLabelFont); + failCountLabel.setForeground(new Color(-2200483)); + failCountLabel.setText("0"); + panel1.add(failCountLabel, new GridConstraints(2, 5, 2, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JLabel label2 = new JLabel(); - label2.setText("成功"); - panel1.add(label2, new GridConstraints(0, 6, 2, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label3 = new JLabel(); - Font label3Font = this.$$$getFont$$$(null, -1, 72, label3.getFont()); - if (label3Font != null) label3.setFont(label3Font); - label3.setForeground(new Color(-2200483)); - label3.setText("43"); - panel1.add(label3, new GridConstraints(2, 5, 2, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label4 = new JLabel(); - label4.setText("失败"); - panel1.add(label4, new GridConstraints(2, 6, 2, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - progressBar2 = new JProgressBar(); - panel1.add(progressBar2, new GridConstraints(4, 4, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + label2.setText("失败"); + panel1.add(label2, new GridConstraints(2, 6, 2, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + completedProgressBar = new JProgressBar(); + panel1.add(completedProgressBar, new GridConstraints(4, 4, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JSeparator separator2 = new JSeparator(); separator2.setEnabled(true); separator2.setOrientation(1); panel1.add(separator2, new GridConstraints(0, 7, 5, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); - progressBar1 = new JProgressBar(); - panel1.add(progressBar1, new GridConstraints(4, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label5 = new JLabel(); - Font label5Font = this.$$$getFont$$$(null, -1, 72, label5.getFont()); - if (label5Font != null) label5.setFont(label5Font); - label5.setText("1273"); - panel1.add(label5, new GridConstraints(2, 1, 2, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label6 = new JLabel(); - label6.setText("已处理"); - panel1.add(label6, new GridConstraints(2, 2, 2, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + processedProgressBar = new JProgressBar(); + panel1.add(processedProgressBar, new GridConstraints(4, 0, 1, 3, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + processedCountLabel = new JLabel(); + Font processedCountLabelFont = this.$$$getFont$$$(null, -1, 72, processedCountLabel.getFont()); + if (processedCountLabelFont != null) processedCountLabel.setFont(processedCountLabelFont); + processedCountLabel.setText("0"); + panel1.add(processedCountLabel, new GridConstraints(2, 1, 2, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label3 = new JLabel(); + label3.setText("已处理"); + panel1.add(label3, new GridConstraints(2, 2, 2, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JSeparator separator3 = new JSeparator(); separator3.setOrientation(1); panel1.add(separator3, new GridConstraints(0, 11, 5, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); - final JLabel label7 = new JLabel(); - label7.setText("消息总数:1273"); - panel1.add(label7, new GridConstraints(1, 12, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label8 = new JLabel(); - label8.setText("可用处理器核心:4"); - panel1.add(label8, new GridConstraints(2, 12, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label9 = new JLabel(); - label9.setText("耗时"); - panel1.add(label9, new GridConstraints(0, 9, 2, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label10 = new JLabel(); - label10.setText("预计剩余"); - panel1.add(label10, new GridConstraints(2, 9, 2, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label11 = new JLabel(); - Font label11Font = this.$$$getFont$$$(null, -1, 36, label11.getFont()); - if (label11Font != null) label11.setFont(label11Font); - label11.setText("13s"); - panel1.add(label11, new GridConstraints(0, 10, 2, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label12 = new JLabel(); - Font label12Font = this.$$$getFont$$$(null, -1, 36, label12.getFont()); - if (label12Font != null) label12.setFont(label12Font); - label12.setText("15s"); - panel1.add(label12, new GridConstraints(2, 10, 2, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + memberCountLabel = new JLabel(); + memberCountLabel.setText("消息总数:0"); + panel1.add(memberCountLabel, new GridConstraints(1, 12, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + processorCountLabel = new JLabel(); + processorCountLabel.setText("可用处理器核心:-"); + panel1.add(processorCountLabel, new GridConstraints(2, 12, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label4 = new JLabel(); + label4.setText("耗时"); + panel1.add(label4, new GridConstraints(0, 9, 2, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + final JLabel label5 = new JLabel(); + label5.setText("预计剩余"); + panel1.add(label5, new GridConstraints(2, 9, 2, 1, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + lastTimeLabel = new JLabel(); + Font lastTimeLabelFont = this.$$$getFont$$$(null, -1, 36, lastTimeLabel.getFont()); + if (lastTimeLabelFont != null) lastTimeLabel.setFont(lastTimeLabelFont); + lastTimeLabel.setText("0s"); + panel1.add(lastTimeLabel, new GridConstraints(0, 10, 2, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + leftTimeLabel = new JLabel(); + Font leftTimeLabelFont = this.$$$getFont$$$(null, -1, 36, leftTimeLabel.getFont()); + if (leftTimeLabelFont != null) leftTimeLabel.setFont(leftTimeLabelFont); + leftTimeLabel.setText("0s"); + panel1.add(leftTimeLabel, new GridConstraints(2, 10, 2, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final Spacer spacer1 = new Spacer(); panel1.add(spacer1, new GridConstraints(2, 0, 2, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); final Spacer spacer2 = new Spacer(); @@ -125,43 +139,44 @@ public class BoostForm { boostModeHelpLabel.setIcon(new ImageIcon(getClass().getResource("/icon/helpButton.png"))); boostModeHelpLabel.setText("性能模式"); panel1.add(boostModeHelpLabel, new GridConstraints(0, 0, 2, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label13 = new JLabel(); - Font label13Font = this.$$$getFont$$$(null, -1, 24, label13.getFont()); - if (label13Font != null) label13.setFont(label13Font); - label13.setForeground(new Color(-276358)); - label13.setText("消息名称:"); - panel1.add(label13, new GridConstraints(0, 12, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label14 = new JLabel(); - label14.setText("JVM内存占用:"); - panel1.add(label14, new GridConstraints(3, 12, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - final JLabel label15 = new JLabel(); - label15.setForeground(new Color(-276358)); - label15.setText("计划任务执行中"); - panel1.add(label15, new GridConstraints(4, 12, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + msgNameLabel = new JLabel(); + Font msgNameLabelFont = this.$$$getFont$$$(null, -1, 24, msgNameLabel.getFont()); + if (msgNameLabelFont != null) msgNameLabel.setFont(msgNameLabelFont); + msgNameLabel.setForeground(new Color(-276358)); + msgNameLabel.setText("消息名称:-"); + panel1.add(msgNameLabel, new GridConstraints(0, 12, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + jvmMemoryLabel = new JLabel(); + jvmMemoryLabel.setText("JVM内存占用:-"); + panel1.add(jvmMemoryLabel, new GridConstraints(3, 12, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + scheduledTaskLabel = new JLabel(); + scheduledTaskLabel.setForeground(new Color(-276358)); + scheduledTaskLabel.setText("计划任务执行中"); + scheduledTaskLabel.setVisible(true); + panel1.add(scheduledTaskLabel, new GridConstraints(4, 12, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JPanel panel2 = new JPanel(); panel2.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1)); boostPanel.add(panel2, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); final JScrollPane scrollPane1 = new JScrollPane(); panel2.add(scrollPane1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); - textArea1 = new JTextArea(); - scrollPane1.setViewportView(textArea1); + consoleTextArea = new JTextArea(); + scrollPane1.setViewportView(consoleTextArea); final JPanel panel3 = new JPanel(); panel3.setLayout(new GridLayoutManager(1, 5, new Insets(0, 5, 5, 5), -1, -1)); boostPanel.add(panel3, new GridConstraints(2, 0, 1, 2, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); - 开始Button = new JButton(); - 开始Button.setText("开始"); - panel3.add(开始Button, new GridConstraints(0, 4, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + startButton = new JButton(); + startButton.setText("开始"); + panel3.add(startButton, new GridConstraints(0, 4, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final Spacer spacer4 = new Spacer(); panel3.add(spacer4, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); - 停止Button = new JButton(); - 停止Button.setText("停止"); - panel3.add(停止Button, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - 按计划执行Button = new JButton(); - 按计划执行Button.setText("按计划执行"); - panel3.add(按计划执行Button, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); - 空跑CheckBox = new JCheckBox(); - 空跑CheckBox.setText("空跑"); - panel3.add(空跑CheckBox, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + stopButton = new JButton(); + stopButton.setText("停止"); + panel3.add(stopButton, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + scheduledRunButton = new JButton(); + scheduledRunButton.setText("按计划执行"); + panel3.add(scheduledRunButton, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + dryRunCheckBox = new JCheckBox(); + dryRunCheckBox.setText("空跑"); + panel3.add(dryRunCheckBox, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final Spacer spacer5 = new Spacer(); boostPanel.add(spacer5, new GridConstraints(1, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); } diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java index 11372094..4827c7cf 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java @@ -1,8 +1,15 @@ package com.fangxuele.tool.push.ui.listener; +import cn.hutool.core.thread.ThreadUtil; +import com.fangxuele.tool.push.logic.BoostPushRunThread; +import com.fangxuele.tool.push.logic.PushData; import com.fangxuele.tool.push.ui.UiConsts; import com.fangxuele.tool.push.ui.dialog.CommonTipsDialog; +import com.fangxuele.tool.push.ui.form.BoostForm; +import com.fangxuele.tool.push.ui.form.MainWindow; +import com.fangxuele.tool.push.ui.form.MessageEditForm; import com.fangxuele.tool.push.util.ComponentUtil; +import org.apache.commons.lang3.StringUtils; import javax.swing.*; import java.awt.*; @@ -58,5 +65,43 @@ public void mouseExited(MouseEvent e) { super.mouseExited(e); } }); + + // 开始按钮事件 + BoostForm.boostForm.getStartButton().addActionListener((e) -> ThreadUtil.execute(() -> { + if (checkBeforePush()) { + int isPush = JOptionPane.showConfirmDialog(boostForm.getBoostPanel(), + "确定开始推送吗?\n\n推送消息:" + + MessageEditForm.messageEditForm.getMsgNameField().getText() + + "\n推送人数:" + PushData.allUser.size() + + "\n\n空跑模式:" + + BoostForm.boostForm.getDryRunCheckBox().isSelected() + "\n", "确认推送?", + JOptionPane.YES_NO_OPTION); + if (isPush == JOptionPane.YES_OPTION) { + ThreadUtil.execute(new BoostPushRunThread()); + } + } + })); + } + + /** + * 推送前检查 + * + * @return boolean + */ + private static boolean checkBeforePush() { + if (StringUtils.isEmpty(MessageEditForm.messageEditForm.getMsgNameField().getText())) { + JOptionPane.showMessageDialog(boostForm.getBoostPanel(), "请先选择一条消息!", "提示", + JOptionPane.INFORMATION_MESSAGE); + MainWindow.mainWindow.getTabbedPane().setSelectedIndex(2); + + return false; + } + if (PushData.allUser == null || PushData.allUser.size() == 0) { + JOptionPane.showMessageDialog(boostForm.getBoostPanel(), "请先准备目标用户!", "提示", + JOptionPane.INFORMATION_MESSAGE); + + return false; + } + return true; } } diff --git a/src/main/java/com/fangxuele/tool/push/util/ConsoleUtil.java b/src/main/java/com/fangxuele/tool/push/util/ConsoleUtil.java index 95da9807..2ba0bd8c 100644 --- a/src/main/java/com/fangxuele/tool/push/util/ConsoleUtil.java +++ b/src/main/java/com/fangxuele/tool/push/util/ConsoleUtil.java @@ -2,6 +2,7 @@ import cn.hutool.log.Log; import cn.hutool.log.LogFactory; +import com.fangxuele.tool.push.ui.form.BoostForm; import com.fangxuele.tool.push.ui.form.PushForm; import lombok.extern.slf4j.Slf4j; @@ -29,6 +30,17 @@ public static void consoleWithLog(String log) { logger.warn(log); } + /** + * 输出到性能模式控制台和log + * + * @param log + */ + public static void boostConsoleWithLog(String log) { + BoostForm.boostForm.getConsoleTextArea().append(log + "\n"); + BoostForm.boostForm.getConsoleTextArea().setCaretPosition(BoostForm.boostForm.getConsoleTextArea().getText().length()); + logger.warn(log); + } + /** * 仅输出到控制台 * @@ -38,4 +50,14 @@ public static void consoleOnly(String log) { PushForm.pushForm.getPushConsoleTextArea().append(log + "\n"); PushForm.pushForm.getPushConsoleTextArea().setCaretPosition(PushForm.pushForm.getPushConsoleTextArea().getText().length()); } + + /** + * 仅输出到性能模式控制台 + * + * @param log + */ + public static void boostConsoleOnly(String log) { + BoostForm.boostForm.getConsoleTextArea().append(log + "\n"); + BoostForm.boostForm.getConsoleTextArea().setCaretPosition(BoostForm.boostForm.getConsoleTextArea().getText().length()); + } } From 6f609a347a1fe0c2110c537ae3e228f199fcedd3 Mon Sep 17 00:00:00 2001 From: duoduo Date: Mon, 8 Jul 2019 23:05:28 +0800 Subject: [PATCH 02/20] first step boost mode --- .../tool/push/logic/BoostPushRunThread.java | 2 +- .../logic/msgsender/WxMpTemplateMsgSender.java | 14 ++++++++++---- .../com/fangxuele/tool/push/ui/form/BoostForm.java | 2 ++ .../tool/push/ui/listener/BoostListener.java | 11 +++++++++++ .../tool/push/ui/listener/TabListener.java | 5 +++++ 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java index 03503599..23e70ab0 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java @@ -114,7 +114,7 @@ private void timeMonitor() { long startTimeMillis = System.currentTimeMillis(); // 计时 while (true) { - if (PushData.stopedThreadCount.intValue() == PushData.threadCount) { + if (PushData.totalRecords == PushData.successRecords.longValue() + PushData.failRecords.longValue()) { if (!PushData.fixRateScheduling) { BoostForm.boostForm.getStopButton().setEnabled(false); BoostForm.boostForm.getStopButton().updateUI(); diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java index f2970702..e0599d11 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java @@ -80,6 +80,11 @@ public SendResult asyncSend(String[] msgData) { try { if (PushControl.dryRun) { + // 已成功+1 + PushData.increaseSuccess(); + BoostForm.boostForm.getSuccessCountLabel().setText(String.valueOf(PushData.successRecords)); + // 总进度条 + BoostForm.boostForm.getCompletedProgressBar().setValue(PushData.successRecords.intValue() + PushData.failRecords.intValue()); sendResult.setSuccess(true); return sendResult; } else { @@ -171,9 +176,9 @@ public static CloseableHttpAsyncClient getCloseableHttpAsyncClient() throws IORe synchronized (WxMpTemplateMsgSender.class) { if (closeableHttpAsyncClient == null) { RequestConfig requestConfig = RequestConfig.custom() - .setConnectTimeout(500000) - .setSocketTimeout(500000) - .setConnectionRequestTimeout(500000) + .setConnectTimeout(-1) + .setSocketTimeout(-1) + .setConnectionRequestTimeout(-1) .build(); //配置io线程 @@ -212,7 +217,8 @@ static class Back implements FutureCallback { @Override public void completed(HttpResponse httpResponse) { try { - EntityUtils.toString(httpResponse.getEntity()); + String response = EntityUtils.toString(httpResponse.getEntity()); + ConsoleUtil.boostConsoleOnly(response); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java index 5c98f46c..fb46270e 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java @@ -1,5 +1,6 @@ package com.fangxuele.tool.push.ui.form; +import com.fangxuele.tool.push.App; import com.intellij.uiDesigner.core.GridConstraints; import com.intellij.uiDesigner.core.GridLayoutManager; import com.intellij.uiDesigner.core.Spacer; @@ -41,6 +42,7 @@ public class BoostForm { public static BoostForm boostForm = new BoostForm(); public static void init() { + boostForm.getDryRunCheckBox().setSelected(App.config.isDryRun()); boostForm.getScheduledTaskLabel().setVisible(false); } diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java index 4827c7cf..3d0178d2 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java @@ -1,5 +1,6 @@ package com.fangxuele.tool.push.ui.listener; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.thread.ThreadUtil; import com.fangxuele.tool.push.logic.BoostPushRunThread; import com.fangxuele.tool.push.logic.PushData; @@ -104,4 +105,14 @@ private static boolean checkBeforePush() { } return true; } + + static void refreshPushInfo() { + // 总记录数 + long totalCount = PushData.allUser.size(); + BoostForm.boostForm.getMemberCountLabel().setText("消息总数:" + totalCount); + // 可用处理器核心 + BoostForm.boostForm.getProcessorCountLabel().setText("可用处理器核心:" + Runtime.getRuntime().availableProcessors()); + // JVM内存占用 + BoostForm.boostForm.getJvmMemoryLabel().setText("JVM内存占用:" + FileUtil.readableFileSize(Runtime.getRuntime().totalMemory()) + "/" + FileUtil.readableFileSize(Runtime.getRuntime().maxMemory())); + } } diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/TabListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/TabListener.java index 27c58a3a..2102e7ad 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/TabListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/TabListener.java @@ -1,6 +1,7 @@ package com.fangxuele.tool.push.ui.listener; import com.fangxuele.tool.push.ui.form.AboutForm; +import com.fangxuele.tool.push.ui.form.BoostForm; import com.fangxuele.tool.push.ui.form.MainWindow; import com.fangxuele.tool.push.ui.form.MessageEditForm; import com.fangxuele.tool.push.ui.form.PushForm; @@ -47,6 +48,10 @@ public void stateChanged(ChangeEvent e) { PushForm.pushForm.getPushMsgName().setText(MessageEditForm.messageEditForm.getMsgNameField().getText()); PushListener.refreshPushInfo(); break; + case 5: + BoostForm.boostForm.getMsgNameLabel().setText(MessageEditForm.messageEditForm.getMsgNameField().getText()); + BoostListener.refreshPushInfo(); + break; default: break; } From d06ef4c43c1517128604cc2e20bca93b310d7344 Mon Sep 17 00:00:00 2001 From: rememberber Date: Tue, 9 Jul 2019 10:31:43 +0800 Subject: [PATCH 03/20] test:boost mode test --- .../tool/push/logic/BoostPushRunThread.java | 27 +------------------ .../tool/push/logic/PushControl.java | 23 ++++++++++++++++ .../tool/push/logic/PushRunThread.java | 27 +------------------ .../msgsender/WxMpTemplateMsgSender.java | 4 ++- 4 files changed, 28 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java index 23e70ab0..9f9b8e31 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java @@ -13,8 +13,6 @@ import com.fangxuele.tool.push.logic.msgsender.MsgSenderFactory; import com.fangxuele.tool.push.logic.msgthread.MsgAsyncSendThread; import com.fangxuele.tool.push.ui.form.BoostForm; -import com.fangxuele.tool.push.ui.form.ScheduleForm; -import com.fangxuele.tool.push.ui.listener.MemberListener; import com.fangxuele.tool.push.util.ConsoleUtil; import org.apache.commons.lang3.time.DateFormatUtils; @@ -70,7 +68,7 @@ private void preparePushRun() { PushControl.dryRun = BoostForm.boostForm.getDryRunCheckBox().isSelected(); // 执行前重新导入目标用户 - reimportMembers(); + PushControl.reimportMembers(); // 重置推送数据 PushData.reset(); @@ -171,27 +169,4 @@ private void timeMonitor() { } } - /** - * 重新导入目标用户(定时任务) - */ - private void reimportMembers() { - if (PushData.fixRateScheduling && ScheduleForm.scheduleForm.getReimportCheckBox().isSelected()) { - switch ((String) ScheduleForm.scheduleForm.getReimportComboBox().getSelectedItem()) { - case "通过SQL导入": - MemberListener.importFromSql(); - break; - case "通过文件导入": - MemberListener.importFromFile(); - break; - case "导入所有关注公众号的用户": - MemberListener.importWxAll(); - break; - case "导入企业通讯录中所有用户": - MemberListener.importWxCpAll(); - break; - default: - } - } - } - } \ No newline at end of file diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java index ce556404..8a8a7070 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java @@ -363,4 +363,27 @@ static void prepareMsgMaker() { } } + /** + * 重新导入目标用户(定时任务) + */ + public static void reimportMembers() { + if (PushData.fixRateScheduling && ScheduleForm.scheduleForm.getReimportCheckBox().isSelected()) { + switch ((String) ScheduleForm.scheduleForm.getReimportComboBox().getSelectedItem()) { + case "通过SQL导入": + MemberListener.importFromSql(); + break; + case "通过文件导入": + MemberListener.importFromFile(); + break; + case "导入所有关注公众号的用户": + MemberListener.importWxAll(); + break; + case "导入企业通讯录中所有用户": + MemberListener.importWxCpAll(); + break; + default: + } + } + } + } \ No newline at end of file diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java index f4dcc7f9..f7670a7e 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java @@ -14,8 +14,6 @@ import com.fangxuele.tool.push.logic.msgthread.MsgSendThread; import com.fangxuele.tool.push.ui.component.TableInCellProgressBarRenderer; import com.fangxuele.tool.push.ui.form.PushForm; -import com.fangxuele.tool.push.ui.form.ScheduleForm; -import com.fangxuele.tool.push.ui.listener.MemberListener; import com.fangxuele.tool.push.util.ConsoleUtil; import org.apache.commons.lang3.time.DateFormatUtils; @@ -71,7 +69,7 @@ private void preparePushRun() { PushControl.dryRun = PushForm.pushForm.getDryRunCheckBox().isSelected(); // 执行前重新导入目标用户 - reimportMembers(); + PushControl.reimportMembers(); // 重置推送数据 PushData.reset(); @@ -222,27 +220,4 @@ private void timeMonitor() { } } - /** - * 重新导入目标用户(定时任务) - */ - private void reimportMembers() { - if (PushData.fixRateScheduling && ScheduleForm.scheduleForm.getReimportCheckBox().isSelected()) { - switch ((String) ScheduleForm.scheduleForm.getReimportComboBox().getSelectedItem()) { - case "通过SQL导入": - MemberListener.importFromSql(); - break; - case "通过文件导入": - MemberListener.importFromFile(); - break; - case "导入所有关注公众号的用户": - MemberListener.importWxAll(); - break; - case "导入企业通讯录中所有用户": - MemberListener.importWxCpAll(); - break; - default: - } - } - } - } \ No newline at end of file diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java index e0599d11..1a225fee 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java @@ -83,6 +83,8 @@ public SendResult asyncSend(String[] msgData) { // 已成功+1 PushData.increaseSuccess(); BoostForm.boostForm.getSuccessCountLabel().setText(String.valueOf(PushData.successRecords)); + // 保存发送成功 + PushData.sendSuccessList.add(msgData); // 总进度条 BoostForm.boostForm.getCompletedProgressBar().setValue(PushData.successRecords.intValue() + PushData.failRecords.intValue()); sendResult.setSuccess(true); @@ -92,7 +94,7 @@ public SendResult asyncSend(String[] msgData) { WxMpTemplateMessage wxMessageTemplate = wxMpTemplateMsgMaker.makeMsg(msgData); wxMessageTemplate.setToUser(openId); - String url = "https://api.weixin.qq.com/cgi-bin/message/template/send"; + String url = "http://localhost:9000/qian/api/test/lucky?msg=" + openId; // TODO Future httpResponseFuture = getCloseableHttpAsyncClient().execute(new HttpPost(url), new Back(msgData)); if (!PushData.running) { From e794b47d6f90aa994171aeb861c7a4e60ad05fc3 Mon Sep 17 00:00:00 2001 From: rememberber Date: Tue, 9 Jul 2019 18:52:55 +0800 Subject: [PATCH 04/20] test:boost mode test --- src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.form | 3 +++ src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.form index aad8ee90..495be453 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.form +++ b/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.form @@ -248,6 +248,7 @@ + @@ -261,6 +262,7 @@ + @@ -269,6 +271,7 @@ + diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java index fb46270e..cfd47970 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/BoostForm.java @@ -166,14 +166,17 @@ public static void init() { panel3.setLayout(new GridLayoutManager(1, 5, new Insets(0, 5, 5, 5), -1, -1)); boostPanel.add(panel3, new GridConstraints(2, 0, 1, 2, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false)); startButton = new JButton(); + startButton.setIcon(new ImageIcon(getClass().getResource("/icon/run@2x.png"))); startButton.setText("开始"); panel3.add(startButton, new GridConstraints(0, 4, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final Spacer spacer4 = new Spacer(); panel3.add(spacer4, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false)); stopButton = new JButton(); + stopButton.setIcon(new ImageIcon(getClass().getResource("/icon/suspend.png"))); stopButton.setText("停止"); panel3.add(stopButton, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); scheduledRunButton = new JButton(); + scheduledRunButton.setIcon(new ImageIcon(getClass().getResource("/icon/clock.png"))); scheduledRunButton.setText("按计划执行"); panel3.add(scheduledRunButton, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); dryRunCheckBox = new JCheckBox(); From 006ad2e8037030ad10ff47e34af8f01cef9820cc Mon Sep 17 00:00:00 2001 From: rememberber Date: Thu, 11 Jul 2019 09:02:33 +0800 Subject: [PATCH 05/20] test:boost mode test --- .../java/com/fangxuele/tool/push/ui/listener/BoostListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java index 3d0178d2..a04db03e 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java @@ -38,7 +38,7 @@ public void mousePressed(MouseEvent e) { StringBuilder tipsBuilder = new StringBuilder(); tipsBuilder.append("

什么是性能模式?

"); tipsBuilder.append("

最大限度利用系统资源,提升性能,实验性地不断优化,以期获得更快速的批量推送效果

"); - tipsBuilder.append("

利用异步HTTP、NIO等技术提高批量推送效率

"); + tipsBuilder.append("

利用异步HTTP、NIO、协程等技术提高批量推送效率

"); tipsBuilder.append("

不断学习使用新技术,优化无止境,不择手段地提升批量推送速度

"); tipsBuilder.append("

一个人的力量有限,也希望更多技术大佬提供帮助和支持,一起挑战HTTP极限!

"); tipsBuilder.append("

注意:性能模式下CPU、内存、网络连接资源占用过大," + From 0e7b37f0a083723f14233e313bf17a4166ac67f1 Mon Sep 17 00:00:00 2001 From: duoduo Date: Fri, 12 Jul 2019 23:31:29 +0800 Subject: [PATCH 06/20] =?UTF-8?q?feature:=E6=80=A7=E8=83=BD=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=8C=89=E8=AE=A1=E5=88=92=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tool/push/logic/BoostPushRunThread.java | 25 +- .../tool/push/logic/PushControl.java | 17 +- .../tool/push/logic/PushRunThread.java | 21 +- .../tool/push/ui/form/ScheduleForm.java | 30 +++ .../tool/push/ui/listener/BoostListener.java | 213 ++++++++++++++++-- .../tool/push/ui/listener/PushListener.java | 104 +++------ 6 files changed, 292 insertions(+), 118 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java index 9f9b8e31..edd42423 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java @@ -34,19 +34,17 @@ public class BoostPushRunThread extends Thread { @Override public void run() { - if (PushControl.pushCheck()) { - BoostForm.boostForm.getProcessedProgressBar().setIndeterminate(true); - BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(true); - // 准备推送 - preparePushRun(); - BoostForm.boostForm.getProcessedProgressBar().setIndeterminate(false); - BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(false); - ConsoleUtil.boostConsoleWithLog("推送开始……"); - // 消息数据分片以及线程纷发 - shardingAndMsgThread(); - // 时间监控 - timeMonitor(); - } + BoostForm.boostForm.getProcessedProgressBar().setIndeterminate(true); + BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(true); + // 准备推送 + preparePushRun(); + BoostForm.boostForm.getProcessedProgressBar().setIndeterminate(false); + BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(false); + ConsoleUtil.boostConsoleWithLog("推送开始……"); + // 消息数据分片以及线程纷发 + shardingAndMsgThread(); + // 时间监控 + timeMonitor(); } /** @@ -124,6 +122,7 @@ private void timeMonitor() { String finishTip = "发送完毕!\n"; JOptionPane.showMessageDialog(BoostForm.boostForm.getBoostPanel(), finishTip, "提示", JOptionPane.INFORMATION_MESSAGE); + BoostForm.boostForm.getScheduledTaskLabel().setVisible(false); } else { if (App.config.isRadioCron()) { Date nextDate = CronPatternUtil.nextDateAfter(new CronPattern(App.config.getTextCron()), new Date(), true); diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java index 8a8a7070..6b652c49 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java @@ -19,6 +19,7 @@ import com.fangxuele.tool.push.logic.msgsender.MailMsgSender; import com.fangxuele.tool.push.logic.msgsender.MsgSenderFactory; import com.fangxuele.tool.push.logic.msgsender.SendResult; +import com.fangxuele.tool.push.ui.form.MainWindow; import com.fangxuele.tool.push.ui.form.MessageEditForm; import com.fangxuele.tool.push.ui.form.PushHisForm; import com.fangxuele.tool.push.ui.form.ScheduleForm; @@ -97,7 +98,21 @@ public static List preview() { * * @return boolean */ - static boolean pushCheck() { + public static boolean pushCheck() { + if (StringUtils.isEmpty(MessageEditForm.messageEditForm.getMsgNameField().getText())) { + JOptionPane.showMessageDialog(MainWindow.mainWindow.getMainPanel(), "请先选择一条消息!", "提示", + JOptionPane.INFORMATION_MESSAGE); + MainWindow.mainWindow.getTabbedPane().setSelectedIndex(2); + + return false; + } + if (PushData.allUser == null || PushData.allUser.size() == 0) { + JOptionPane.showMessageDialog(MainWindow.mainWindow.getMainPanel(), "请先准备目标用户!", "提示", + JOptionPane.INFORMATION_MESSAGE); + + return false; + } + int msgType = App.config.getMsgType(); switch (msgType) { case MessageTypeEnum.MP_TEMPLATE_CODE: diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java index f7670a7e..a022a740 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java @@ -38,17 +38,15 @@ public class PushRunThread extends Thread { @Override public void run() { - if (PushControl.pushCheck()) { - PushForm.pushForm.getPushTotalProgressBar().setIndeterminate(true); - // 准备推送 - preparePushRun(); - PushForm.pushForm.getPushTotalProgressBar().setIndeterminate(false); - ConsoleUtil.consoleWithLog("推送开始……"); - // 消息数据分片以及线程纷发 - shardingAndMsgThread(); - // 时间监控 - timeMonitor(); - } + PushForm.pushForm.getPushTotalProgressBar().setIndeterminate(true); + // 准备推送 + preparePushRun(); + PushForm.pushForm.getPushTotalProgressBar().setIndeterminate(false); + ConsoleUtil.consoleWithLog("推送开始……"); + // 消息数据分片以及线程纷发 + shardingAndMsgThread(); + // 时间监控 + timeMonitor(); } /** @@ -175,6 +173,7 @@ private void timeMonitor() { String finishTip = "发送完毕!\n"; JOptionPane.showMessageDialog(PushForm.pushForm.getPushPanel(), finishTip, "提示", JOptionPane.INFORMATION_MESSAGE); + PushForm.pushForm.getScheduleDetailLabel().setVisible(false); } else { if (App.config.isRadioCron()) { Date nextDate = CronPatternUtil.nextDateAfter(new CronPattern(App.config.getTextCron()), new Date(), true); diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/ScheduleForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/ScheduleForm.java index dc03657d..4813fe8c 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/ScheduleForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/ScheduleForm.java @@ -85,6 +85,36 @@ public static void fillReimportComboBox() { } } + public static int getDayOfWeek(String week) { + int dayOfWeek; + switch (week) { + case "一": + dayOfWeek = 2; + break; + case "二": + dayOfWeek = 3; + break; + case "三": + dayOfWeek = 4; + break; + case "四": + dayOfWeek = 5; + break; + case "五": + dayOfWeek = 6; + break; + case "六": + dayOfWeek = 7; + break; + case "日": + dayOfWeek = 1; + break; + default: + dayOfWeek = 0; + } + return dayOfWeek; + } + { // GUI initializer generated by IntelliJ IDEA GUI Designer // >>> IMPORTANT!! <<< diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java index a04db03e..fd821f2e 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java @@ -1,21 +1,37 @@ package com.fangxuele.tool.push.ui.listener; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.cron.CronUtil; +import cn.hutool.cron.pattern.CronPattern; +import cn.hutool.cron.pattern.CronPatternUtil; +import cn.hutool.cron.task.Task; +import com.fangxuele.tool.push.App; import com.fangxuele.tool.push.logic.BoostPushRunThread; +import com.fangxuele.tool.push.logic.PushControl; import com.fangxuele.tool.push.logic.PushData; +import com.fangxuele.tool.push.logic.PushRunThread; import com.fangxuele.tool.push.ui.UiConsts; import com.fangxuele.tool.push.ui.dialog.CommonTipsDialog; import com.fangxuele.tool.push.ui.form.BoostForm; -import com.fangxuele.tool.push.ui.form.MainWindow; import com.fangxuele.tool.push.ui.form.MessageEditForm; +import com.fangxuele.tool.push.ui.form.ScheduleForm; import com.fangxuele.tool.push.util.ComponentUtil; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.commons.lang3.time.DateUtils; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.Date; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import static com.fangxuele.tool.push.ui.form.BoostForm.boostForm; @@ -29,6 +45,12 @@ */ public class BoostListener { + private static ScheduledExecutorService serviceStartAt; + + private static ScheduledExecutorService serviceStartPerDay; + + private static ScheduledExecutorService serviceStartPerWeek; + public static void addListeners() { boostForm.getBoostModeHelpLabel().addMouseListener(new MouseAdapter() { @Override @@ -69,7 +91,7 @@ public void mouseExited(MouseEvent e) { // 开始按钮事件 BoostForm.boostForm.getStartButton().addActionListener((e) -> ThreadUtil.execute(() -> { - if (checkBeforePush()) { + if (PushControl.pushCheck()) { int isPush = JOptionPane.showConfirmDialog(boostForm.getBoostPanel(), "确定开始推送吗?\n\n推送消息:" + MessageEditForm.messageEditForm.getMsgNameField().getText() + @@ -82,28 +104,171 @@ public void mouseExited(MouseEvent e) { } } })); - } - /** - * 推送前检查 - * - * @return boolean - */ - private static boolean checkBeforePush() { - if (StringUtils.isEmpty(MessageEditForm.messageEditForm.getMsgNameField().getText())) { - JOptionPane.showMessageDialog(boostForm.getBoostPanel(), "请先选择一条消息!", "提示", - JOptionPane.INFORMATION_MESSAGE); - MainWindow.mainWindow.getTabbedPane().setSelectedIndex(2); - - return false; - } - if (PushData.allUser == null || PushData.allUser.size() == 0) { - JOptionPane.showMessageDialog(boostForm.getBoostPanel(), "请先准备目标用户!", "提示", - JOptionPane.INFORMATION_MESSAGE); - - return false; - } - return true; + // 按计划执行按钮事件 + BoostForm.boostForm.getScheduledRunButton().addActionListener((e -> ThreadUtil.execute(() -> { + if (PushControl.pushCheck()) { + + // 看是否存在设置的计划任务 + boolean existScheduleTask = false; + + // 定时开始 + if (App.config.isRadioStartAt()) { + long startAtMills = DateUtil.parse(App.config.getTextStartAt(), DatePattern.NORM_DATETIME_PATTERN).getTime(); + if (startAtMills < System.currentTimeMillis()) { + JOptionPane.showMessageDialog(boostForm.getBoostPanel(), "计划开始推送时间不能小于系统当前时间!\n\n请检查计划任务设置!\n\n", "提示", + JOptionPane.INFORMATION_MESSAGE); + return; + } + + int isSchedulePush = JOptionPane.showConfirmDialog(boostForm.getBoostPanel(), + "将在" + + App.config.getTextStartAt() + + "推送\n\n消息:" + + MessageEditForm.messageEditForm.getMsgNameField().getText() + + "\n\n推送人数:" + PushData.allUser.size() + + "\n\n空跑模式:" + + BoostForm.boostForm.getDryRunCheckBox().isSelected(), "确认定时推送?", + JOptionPane.YES_NO_OPTION); + if (isSchedulePush == JOptionPane.YES_OPTION) { + PushData.scheduling = true; + // 按钮状态 + BoostForm.boostForm.getScheduledRunButton().setEnabled(false); + BoostForm.boostForm.getStartButton().setEnabled(false); + BoostForm.boostForm.getStopButton().setText("停止计划任务"); + BoostForm.boostForm.getStopButton().setEnabled(true); + + BoostForm.boostForm.getScheduledTaskLabel().setVisible(true); + BoostForm.boostForm.getScheduledTaskLabel().setText("计划任务执行中:将在" + + App.config.getTextStartAt() + + "开始推送"); + + serviceStartAt = Executors.newSingleThreadScheduledExecutor(); + serviceStartAt.schedule(new PushRunThread(), startAtMills - System.currentTimeMillis(), TimeUnit.MILLISECONDS); + } + existScheduleTask = true; + } + + // 每天固定时间开始 + if (App.config.isRadioPerDay()) { + long startPerDayMills = DateUtil.parse(DateUtil.today() + " " + App.config.getTextPerDay(), DatePattern.NORM_DATETIME_PATTERN).getTime(); + + int isSchedulePush = JOptionPane.showConfirmDialog(boostForm.getBoostPanel(), + "将在每天" + + App.config.getTextPerDay() + + "推送\n\n消息:" + + MessageEditForm.messageEditForm.getMsgNameField().getText() + + "\n\n推送人数:" + PushData.allUser.size() + + "\n\n空跑模式:" + + BoostForm.boostForm.getDryRunCheckBox().isSelected(), "确认定时推送?", + JOptionPane.YES_NO_OPTION); + if (isSchedulePush == JOptionPane.YES_OPTION) { + PushData.fixRateScheduling = true; + // 按钮状态 + BoostForm.boostForm.getScheduledRunButton().setEnabled(false); + BoostForm.boostForm.getStartButton().setEnabled(false); + BoostForm.boostForm.getStopButton().setText("停止计划任务"); + BoostForm.boostForm.getStopButton().setEnabled(true); + + BoostForm.boostForm.getScheduledTaskLabel().setVisible(true); + BoostForm.boostForm.getScheduledTaskLabel().setText("计划任务执行中:将在每天" + + App.config.getTextPerDay() + + "开始推送"); + + serviceStartPerDay = Executors.newSingleThreadScheduledExecutor(); + long millisBetween = startPerDayMills - System.currentTimeMillis(); + long delay = millisBetween < 0 ? millisBetween + 24 * 60 * 60 * 1000 : millisBetween; + serviceStartPerDay.scheduleAtFixedRate(new PushRunThread(), delay, 24 * 60 * 60 * 1000, TimeUnit.MILLISECONDS); + } + existScheduleTask = true; + } + + // 每周固定时间开始 + if (App.config.isRadioPerWeek()) { + + long todaySetMills = DateUtil.parse(DateUtil.today() + " " + App.config.getTextPerWeekTime(), DatePattern.NORM_DATETIME_PATTERN).getTime(); + int dayBetween = ScheduleForm.getDayOfWeek(App.config.getTextPerWeekWeek()) - DateUtil.thisDayOfWeek(); + long startPerWeekMills = dayBetween < 0 ? (dayBetween + 7) * 24 * 60 * 60 * 1000 : dayBetween * 24 * 60 * 60 * 1000; + + int isSchedulePush = JOptionPane.showConfirmDialog(boostForm.getBoostPanel(), + "将在每周" + App.config.getTextPerWeekWeek() + + App.config.getTextPerWeekTime() + + "推送\n\n消息:" + + MessageEditForm.messageEditForm.getMsgNameField().getText() + + "\n\n推送人数:" + PushData.allUser.size() + + "\n\n空跑模式:" + + BoostForm.boostForm.getDryRunCheckBox().isSelected(), "确认定时推送?", + JOptionPane.YES_NO_OPTION); + if (isSchedulePush == JOptionPane.YES_OPTION) { + PushData.scheduling = true; + PushData.fixRateScheduling = true; + // 按钮状态 + BoostForm.boostForm.getScheduledRunButton().setEnabled(false); + BoostForm.boostForm.getStartButton().setEnabled(false); + BoostForm.boostForm.getStopButton().setText("停止计划任务"); + BoostForm.boostForm.getStopButton().setEnabled(true); + + BoostForm.boostForm.getScheduledTaskLabel().setVisible(true); + BoostForm.boostForm.getScheduledTaskLabel().setText("计划任务执行中:将在每周" + + App.config.getTextPerWeekWeek() + + App.config.getTextPerWeekTime() + + "开始推送"); + + serviceStartPerWeek = Executors.newSingleThreadScheduledExecutor(); + long millisBetween = startPerWeekMills + todaySetMills - System.currentTimeMillis(); + long delay = millisBetween < 0 ? millisBetween + 7 * 24 * 60 * 60 * 1000 : millisBetween; + serviceStartPerWeek.scheduleAtFixedRate(new PushRunThread(), delay, 7 * 24 * 60 * 60 * 1000, TimeUnit.MILLISECONDS); + } + existScheduleTask = true; + } + + // 按Cron表达式触发 + if (App.config.isRadioCron()) { + + List latest5RunTimeList = Lists.newArrayList(); + Date now = new Date(); + for (int i = 0; i < 5; i++) { + Date date = CronPatternUtil.nextDateAfter(new CronPattern(App.config.getTextCron()), DateUtils.addDays(now, i), true); + latest5RunTimeList.add(DateFormatUtils.format(date, "yyyy-MM-dd HH:mm:ss")); + } + + int isSchedulePush = JOptionPane.showConfirmDialog(boostForm.getBoostPanel(), + "将按" + + App.config.getTextCron() + + "表达式触发推送\n\n" + + "最近5次运行时间:\n" + + String.join("\n", latest5RunTimeList) + + "\n\n消息名称:" + + MessageEditForm.messageEditForm.getMsgNameField().getText() + + "\n推送人数:" + PushData.allUser.size() + + "\n空跑模式:" + + BoostForm.boostForm.getDryRunCheckBox().isSelected(), "确认定时推送?", + JOptionPane.YES_NO_OPTION); + if (isSchedulePush == JOptionPane.YES_OPTION) { + PushData.fixRateScheduling = true; + // 按钮状态 + BoostForm.boostForm.getScheduledRunButton().setEnabled(false); + BoostForm.boostForm.getStartButton().setEnabled(false); + BoostForm.boostForm.getStopButton().setText("停止计划任务"); + BoostForm.boostForm.getStopButton().setEnabled(true); + + BoostForm.boostForm.getScheduledTaskLabel().setVisible(true); + BoostForm.boostForm.getScheduledTaskLabel().setText("计划任务执行中,下一次执行时间:" + latest5RunTimeList.get(0)); + + // 支持秒级别定时任务 + CronUtil.setMatchSecond(true); + CronUtil.schedule(App.config.getTextCron(), (Task) () -> new PushRunThread().start()); + CronUtil.start(); + } + existScheduleTask = true; + } + + if (!existScheduleTask) { + JOptionPane.showMessageDialog(boostForm.getBoostPanel(), "请先设置计划任务!", "提示", + JOptionPane.INFORMATION_MESSAGE); + } + } + }))); } static void refreshPushInfo() { diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/PushListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/PushListener.java index 408325e3..79785af9 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/PushListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/PushListener.java @@ -11,13 +11,14 @@ import cn.hutool.log.Log; import cn.hutool.log.LogFactory; import com.fangxuele.tool.push.App; +import com.fangxuele.tool.push.logic.PushControl; import com.fangxuele.tool.push.logic.PushData; import com.fangxuele.tool.push.logic.PushRunThread; import com.fangxuele.tool.push.ui.UiConsts; import com.fangxuele.tool.push.ui.dialog.CommonTipsDialog; -import com.fangxuele.tool.push.ui.form.MainWindow; import com.fangxuele.tool.push.ui.form.MessageEditForm; import com.fangxuele.tool.push.ui.form.PushForm; +import com.fangxuele.tool.push.ui.form.ScheduleForm; import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; @@ -59,7 +60,20 @@ public class PushListener { public static void addListeners() { // 开始按钮事件 PushForm.pushForm.getPushStartButton().addActionListener((e) -> ThreadUtil.execute(() -> { - if (checkBeforePush()) { + if (PushControl.pushCheck()) { + if ("0".equals(PushForm.pushForm.getMaxThreadPoolTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getMaxThreadPoolTextField().getText())) { + JOptionPane.showMessageDialog(pushPanel, "请设置每页分配用户数!", "提示", + JOptionPane.INFORMATION_MESSAGE); + + return; + } + if ("0".equals(PushForm.pushForm.getThreadCountTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getThreadCountTextField().getText())) { + JOptionPane.showMessageDialog(pushPanel, "请设置每个线程分配的页数!", "提示", + JOptionPane.INFORMATION_MESSAGE); + + return; + } + int isPush = JOptionPane.showConfirmDialog(pushPanel, "确定开始推送吗?\n\n推送消息:" + MessageEditForm.messageEditForm.getMsgNameField().getText() + @@ -88,6 +102,7 @@ public static void addListeners() { PushForm.pushForm.getPushStartButton().updateUI(); PushForm.pushForm.getScheduleRunButton().updateUI(); PushForm.pushForm.getPushStopButton().updateUI(); + PushForm.pushForm.getScheduleDetailLabel().setVisible(false); PushData.scheduling = false; PushData.running = false; } @@ -112,6 +127,7 @@ public static void addListeners() { PushForm.pushForm.getPushStartButton().updateUI(); PushForm.pushForm.getScheduleRunButton().updateUI(); PushForm.pushForm.getPushStopButton().updateUI(); + PushForm.pushForm.getScheduleDetailLabel().setVisible(false); PushData.fixRateScheduling = false; PushData.running = false; } @@ -129,6 +145,7 @@ public static void addListeners() { PushForm.pushForm.getPushStartButton().updateUI(); PushForm.pushForm.getScheduleRunButton().updateUI(); PushForm.pushForm.getPushStopButton().updateUI(); + PushForm.pushForm.getScheduleDetailLabel().setVisible(false); } } }); @@ -136,8 +153,17 @@ public static void addListeners() { // 按计划执行按钮事件 PushForm.pushForm.getScheduleRunButton().addActionListener((e -> ThreadUtil.execute(() -> { - if (checkBeforePush()) { - + if (PushControl.pushCheck()) { + if ("0".equals(PushForm.pushForm.getMaxThreadPoolTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getMaxThreadPoolTextField().getText())) { + JOptionPane.showMessageDialog(pushPanel, "请设置每页分配用户数!", "提示", + JOptionPane.INFORMATION_MESSAGE); + return; + } + if ("0".equals(PushForm.pushForm.getThreadCountTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getThreadCountTextField().getText())) { + JOptionPane.showMessageDialog(pushPanel, "请设置每个线程分配的页数!", "提示", + JOptionPane.INFORMATION_MESSAGE); + return; + } // 看是否存在设置的计划任务 boolean existScheduleTask = false; @@ -167,6 +193,7 @@ public static void addListeners() { PushForm.pushForm.getPushStopButton().setText("停止计划任务"); PushForm.pushForm.getPushStopButton().setEnabled(true); + PushForm.pushForm.getScheduleDetailLabel().setVisible(true); PushForm.pushForm.getScheduleDetailLabel().setText("计划任务执行中:将在" + App.config.getTextStartAt() + "开始推送"); @@ -198,6 +225,7 @@ public static void addListeners() { PushForm.pushForm.getPushStopButton().setText("停止计划任务"); PushForm.pushForm.getPushStopButton().setEnabled(true); + PushForm.pushForm.getScheduleDetailLabel().setVisible(true); PushForm.pushForm.getScheduleDetailLabel().setText("计划任务执行中:将在每天" + App.config.getTextPerDay() + "开始推送"); @@ -214,7 +242,7 @@ public static void addListeners() { if (App.config.isRadioPerWeek()) { long todaySetMills = DateUtil.parse(DateUtil.today() + " " + App.config.getTextPerWeekTime(), DatePattern.NORM_DATETIME_PATTERN).getTime(); - int dayBetween = getDayOfWeek(App.config.getTextPerWeekWeek()) - DateUtil.thisDayOfWeek(); + int dayBetween = ScheduleForm.getDayOfWeek(App.config.getTextPerWeekWeek()) - DateUtil.thisDayOfWeek(); long startPerWeekMills = dayBetween < 0 ? (dayBetween + 7) * 24 * 60 * 60 * 1000 : dayBetween * 24 * 60 * 60 * 1000; int isSchedulePush = JOptionPane.showConfirmDialog(pushPanel, @@ -235,6 +263,7 @@ public static void addListeners() { PushForm.pushForm.getPushStopButton().setText("停止计划任务"); PushForm.pushForm.getPushStopButton().setEnabled(true); + PushForm.pushForm.getScheduleDetailLabel().setVisible(true); PushForm.pushForm.getScheduleDetailLabel().setText("计划任务执行中:将在每周" + App.config.getTextPerWeekWeek() + App.config.getTextPerWeekTime() + @@ -278,6 +307,7 @@ public static void addListeners() { PushForm.pushForm.getPushStopButton().setText("停止计划任务"); PushForm.pushForm.getPushStopButton().setEnabled(true); + PushForm.pushForm.getScheduleDetailLabel().setVisible(true); PushForm.pushForm.getScheduleDetailLabel().setText("计划任务执行中,下一次执行时间:" + latest5RunTimeList.get(0)); // 支持秒级别定时任务 @@ -425,68 +455,4 @@ static void refreshPushInfo() { PushForm.pushForm.getJvmMemoryLabel().setText("JVM内存占用:" + FileUtil.readableFileSize(Runtime.getRuntime().totalMemory()) + "/" + FileUtil.readableFileSize(Runtime.getRuntime().maxMemory())); } - /** - * 推送前检查 - * - * @return boolean - */ - private static boolean checkBeforePush() { - if (StringUtils.isEmpty(MessageEditForm.messageEditForm.getMsgNameField().getText())) { - JOptionPane.showMessageDialog(pushPanel, "请先选择一条消息!", "提示", - JOptionPane.INFORMATION_MESSAGE); - MainWindow.mainWindow.getTabbedPane().setSelectedIndex(2); - - return false; - } - if (PushData.allUser == null || PushData.allUser.size() == 0) { - JOptionPane.showMessageDialog(pushPanel, "请先准备目标用户!", "提示", - JOptionPane.INFORMATION_MESSAGE); - - return false; - } - if ("0".equals(PushForm.pushForm.getMaxThreadPoolTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getMaxThreadPoolTextField().getText())) { - JOptionPane.showMessageDialog(pushPanel, "请设置每页分配用户数!", "提示", - JOptionPane.INFORMATION_MESSAGE); - - return false; - } - if ("0".equals(PushForm.pushForm.getThreadCountTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getThreadCountTextField().getText())) { - JOptionPane.showMessageDialog(pushPanel, "请设置每个线程分配的页数!", "提示", - JOptionPane.INFORMATION_MESSAGE); - - return false; - } - return true; - } - - private static int getDayOfWeek(String week) { - int dayOfWeek; - switch (week) { - case "一": - dayOfWeek = 2; - break; - case "二": - dayOfWeek = 3; - break; - case "三": - dayOfWeek = 4; - break; - case "四": - dayOfWeek = 5; - break; - case "五": - dayOfWeek = 6; - break; - case "六": - dayOfWeek = 7; - break; - case "日": - dayOfWeek = 1; - break; - default: - dayOfWeek = 0; - } - return dayOfWeek; - } - } From b2d517316e3279110bb3e59db8b535f5dd8009ca Mon Sep 17 00:00:00 2001 From: duoduo Date: Fri, 12 Jul 2019 23:38:35 +0800 Subject: [PATCH 07/20] =?UTF-8?q?feature:=E6=80=A7=E8=83=BD=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=81=9C=E6=AD=A2=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tool/push/ui/listener/BoostListener.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java index fd821f2e..df51a4b7 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java @@ -8,6 +8,8 @@ import cn.hutool.cron.pattern.CronPattern; import cn.hutool.cron.pattern.CronPatternUtil; import cn.hutool.cron.task.Task; +import cn.hutool.log.Log; +import cn.hutool.log.LogFactory; import com.fangxuele.tool.push.App; import com.fangxuele.tool.push.logic.BoostPushRunThread; import com.fangxuele.tool.push.logic.PushControl; @@ -45,6 +47,8 @@ */ public class BoostListener { + private static final Log logger = LogFactory.get(); + private static ScheduledExecutorService serviceStartAt; private static ScheduledExecutorService serviceStartPerDay; @@ -269,6 +273,70 @@ public void mouseExited(MouseEvent e) { } } }))); + + // 停止按钮事件 + BoostForm.boostForm.getStopButton().addActionListener((e) -> { + ThreadUtil.execute(() -> { + if (PushData.scheduling) { + BoostForm.boostForm.getScheduledTaskLabel().setText(""); + if (serviceStartAt != null) { + serviceStartAt.shutdownNow(); + } + BoostForm.boostForm.getStartButton().setEnabled(true); + BoostForm.boostForm.getScheduledRunButton().setEnabled(true); + BoostForm.boostForm.getStopButton().setText("停止"); + BoostForm.boostForm.getStopButton().setEnabled(false); + BoostForm.boostForm.getStartButton().updateUI(); + BoostForm.boostForm.getScheduledRunButton().updateUI(); + BoostForm.boostForm.getStopButton().updateUI(); + BoostForm.boostForm.getScheduledTaskLabel().setVisible(false); + PushData.scheduling = false; + PushData.running = false; + } + + if (PushData.fixRateScheduling) { + BoostForm.boostForm.getScheduledTaskLabel().setText(""); + if (serviceStartPerDay != null) { + serviceStartPerDay.shutdownNow(); + } + if (serviceStartPerWeek != null) { + serviceStartPerWeek.shutdownNow(); + } + try { + CronUtil.stop(); + } catch (Exception e1) { + logger.warn(e1.toString()); + } + BoostForm.boostForm.getStartButton().setEnabled(true); + BoostForm.boostForm.getScheduledRunButton().setEnabled(true); + BoostForm.boostForm.getStopButton().setText("停止"); + BoostForm.boostForm.getStopButton().setEnabled(false); + BoostForm.boostForm.getStartButton().updateUI(); + BoostForm.boostForm.getScheduledRunButton().updateUI(); + BoostForm.boostForm.getStopButton().updateUI(); + BoostForm.boostForm.getScheduledTaskLabel().setVisible(false); + PushData.fixRateScheduling = false; + PushData.running = false; + } + + if (PushData.running) { + int isStop = JOptionPane.showConfirmDialog(boostForm.getBoostPanel(), + "确定停止当前的推送吗?", "确认停止?", + JOptionPane.YES_NO_OPTION); + if (isStop == JOptionPane.YES_OPTION) { + PushData.running = false; + BoostForm.boostForm.getStartButton().setEnabled(true); + BoostForm.boostForm.getScheduledRunButton().setEnabled(true); + BoostForm.boostForm.getStopButton().setText("停止"); + BoostForm.boostForm.getStopButton().setEnabled(false); + BoostForm.boostForm.getStartButton().updateUI(); + BoostForm.boostForm.getScheduledRunButton().updateUI(); + BoostForm.boostForm.getStopButton().updateUI(); + BoostForm.boostForm.getScheduledTaskLabel().setVisible(false); + } + } + }); + }); } static void refreshPushInfo() { From df29e60dbceb3e02b1a00b665635682c5c8d6ad7 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 13 Jul 2019 17:30:01 +0800 Subject: [PATCH 08/20] =?UTF-8?q?bug=20fix:=E4=BF=AE=E5=A4=8D=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E4=BB=BB=E5=8A=A1=E4=BF=9D=E5=AD=98=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=9C=80=E8=BF=915=E6=AC=A1=E8=BF=90=E8=A1=8C=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=8F=90=E7=A4=BA=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=80=A7=E8=83=BD=E6=A8=A1=E5=BC=8F=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=89=A7=E8=A1=8C=E4=B8=BA=E6=99=AE=E9=80=9A?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tool/push/ui/listener/BoostListener.java | 21 ++++++++++++++----- .../push/ui/listener/ScheduleListener.java | 18 +++++++++------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java index df51a4b7..80d09df2 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java @@ -12,12 +12,13 @@ import cn.hutool.log.LogFactory; import com.fangxuele.tool.push.App; import com.fangxuele.tool.push.logic.BoostPushRunThread; +import com.fangxuele.tool.push.logic.MessageTypeEnum; import com.fangxuele.tool.push.logic.PushControl; import com.fangxuele.tool.push.logic.PushData; -import com.fangxuele.tool.push.logic.PushRunThread; import com.fangxuele.tool.push.ui.UiConsts; import com.fangxuele.tool.push.ui.dialog.CommonTipsDialog; import com.fangxuele.tool.push.ui.form.BoostForm; +import com.fangxuele.tool.push.ui.form.MainWindow; import com.fangxuele.tool.push.ui.form.MessageEditForm; import com.fangxuele.tool.push.ui.form.ScheduleForm; import com.fangxuele.tool.push.util.ComponentUtil; @@ -95,6 +96,11 @@ public void mouseExited(MouseEvent e) { // 开始按钮事件 BoostForm.boostForm.getStartButton().addActionListener((e) -> ThreadUtil.execute(() -> { + if (App.config.getMsgType() != MessageTypeEnum.MP_TEMPLATE_CODE) { + JOptionPane.showMessageDialog(MainWindow.mainWindow.getMainPanel(), "性能模式目前仅支持微信模板消息,后续逐步增加对其他消息类型的支持!", "提示", + JOptionPane.INFORMATION_MESSAGE); + return; + } if (PushControl.pushCheck()) { int isPush = JOptionPane.showConfirmDialog(boostForm.getBoostPanel(), "确定开始推送吗?\n\n推送消息:" + @@ -111,6 +117,11 @@ public void mouseExited(MouseEvent e) { // 按计划执行按钮事件 BoostForm.boostForm.getScheduledRunButton().addActionListener((e -> ThreadUtil.execute(() -> { + if (App.config.getMsgType() != MessageTypeEnum.MP_TEMPLATE_CODE) { + JOptionPane.showMessageDialog(MainWindow.mainWindow.getMainPanel(), "性能模式目前仅支持微信模板消息,后续逐步增加对其他消息类型的支持!", "提示", + JOptionPane.INFORMATION_MESSAGE); + return; + } if (PushControl.pushCheck()) { // 看是否存在设置的计划任务 @@ -148,7 +159,7 @@ public void mouseExited(MouseEvent e) { "开始推送"); serviceStartAt = Executors.newSingleThreadScheduledExecutor(); - serviceStartAt.schedule(new PushRunThread(), startAtMills - System.currentTimeMillis(), TimeUnit.MILLISECONDS); + serviceStartAt.schedule(new BoostPushRunThread(), startAtMills - System.currentTimeMillis(), TimeUnit.MILLISECONDS); } existScheduleTask = true; } @@ -182,7 +193,7 @@ public void mouseExited(MouseEvent e) { serviceStartPerDay = Executors.newSingleThreadScheduledExecutor(); long millisBetween = startPerDayMills - System.currentTimeMillis(); long delay = millisBetween < 0 ? millisBetween + 24 * 60 * 60 * 1000 : millisBetween; - serviceStartPerDay.scheduleAtFixedRate(new PushRunThread(), delay, 24 * 60 * 60 * 1000, TimeUnit.MILLISECONDS); + serviceStartPerDay.scheduleAtFixedRate(new BoostPushRunThread(), delay, 24 * 60 * 60 * 1000, TimeUnit.MILLISECONDS); } existScheduleTask = true; } @@ -221,7 +232,7 @@ public void mouseExited(MouseEvent e) { serviceStartPerWeek = Executors.newSingleThreadScheduledExecutor(); long millisBetween = startPerWeekMills + todaySetMills - System.currentTimeMillis(); long delay = millisBetween < 0 ? millisBetween + 7 * 24 * 60 * 60 * 1000 : millisBetween; - serviceStartPerWeek.scheduleAtFixedRate(new PushRunThread(), delay, 7 * 24 * 60 * 60 * 1000, TimeUnit.MILLISECONDS); + serviceStartPerWeek.scheduleAtFixedRate(new BoostPushRunThread(), delay, 7 * 24 * 60 * 60 * 1000, TimeUnit.MILLISECONDS); } existScheduleTask = true; } @@ -261,7 +272,7 @@ public void mouseExited(MouseEvent e) { // 支持秒级别定时任务 CronUtil.setMatchSecond(true); - CronUtil.schedule(App.config.getTextCron(), (Task) () -> new PushRunThread().start()); + CronUtil.schedule(App.config.getTextCron(), (Task) () -> new BoostPushRunThread().start()); CronUtil.start(); } existScheduleTask = true; diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/ScheduleListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/ScheduleListener.java index 7d683e62..c416ed42 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/ScheduleListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/ScheduleListener.java @@ -108,15 +108,17 @@ public static void addListeners() { JOptionPane.ERROR_MESSAGE); return; } - List latest5RunTimeList = Lists.newArrayList(); - Date now = new Date(); - for (int i = 0; i < 5; i++) { - Date date = CronPatternUtil.nextDateAfter(new CronPattern(textCron), DateUtils.addDays(now, i), true); - latest5RunTimeList.add(DateFormatUtils.format(date, "yyyy-MM-dd HH:mm:ss")); + if (isCron) { + List latest5RunTimeList = Lists.newArrayList(); + Date now = new Date(); + for (int i = 0; i < 5; i++) { + Date date = CronPatternUtil.nextDateAfter(new CronPattern(textCron), DateUtils.addDays(now, i), true); + latest5RunTimeList.add(DateFormatUtils.format(date, "yyyy-MM-dd HH:mm:ss")); + } + JOptionPane.showMessageDialog(MainWindow.mainWindow.getSchedulePanel(), + "最近5次运行时间:\n" + String.join("\n", latest5RunTimeList), "提示", + JOptionPane.INFORMATION_MESSAGE); } - JOptionPane.showMessageDialog(MainWindow.mainWindow.getSchedulePanel(), - "最近5次运行时间:\n" + String.join("\n", latest5RunTimeList), "提示", - JOptionPane.INFORMATION_MESSAGE); App.config.setRadioCron(isCron); App.config.setTextCron(textCron); } else if (isCron) { From 07237becb41922006e169513d0e217cb09e8aeef Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 13 Jul 2019 17:38:29 +0800 Subject: [PATCH 09/20] =?UTF-8?q?bug=20fix:=E4=BF=AE=E5=A4=8D=E6=80=A7?= =?UTF-8?q?=E8=83=BD=E6=A8=A1=E5=BC=8F=E6=8E=A7=E5=88=B6=E5=8F=B0log?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=9C=89=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tool/push/logic/BoostPushRunThread.java | 10 +++---- .../tool/push/logic/PushControl.java | 15 +++++++++++ .../fangxuele/tool/push/logic/PushData.java | 5 ++++ .../tool/push/ui/listener/BoostListener.java | 2 ++ .../tool/push/ui/listener/PushListener.java | 26 ++----------------- 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java index edd42423..84236b63 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java @@ -80,10 +80,10 @@ private void preparePushRun() { BoostForm.boostForm.getMemberCountLabel().setText("消息总数:" + PushData.totalRecords); BoostForm.boostForm.getProcessedProgressBar().setMaximum((int) PushData.totalRecords); BoostForm.boostForm.getCompletedProgressBar().setMaximum((int) PushData.totalRecords); - ConsoleUtil.consoleWithLog("消息总数:" + PushData.totalRecords); + ConsoleUtil.boostConsoleWithLog("消息总数:" + PushData.totalRecords); // 可用处理器核心数量 BoostForm.boostForm.getProcessorCountLabel().setText("可用处理器核心:" + Runtime.getRuntime().availableProcessors()); - ConsoleUtil.consoleWithLog("可用处理器核心:" + Runtime.getRuntime().availableProcessors()); + ConsoleUtil.boostConsoleWithLog("可用处理器核心:" + Runtime.getRuntime().availableProcessors()); // 准备消息构造器 PushControl.prepareMsgMaker(); @@ -100,7 +100,7 @@ private static void shardingAndMsgThread() { msgAsyncSendThread = new MsgAsyncSendThread(msgSender); ThreadUtil.execute(msgAsyncSendThread); - ConsoleUtil.consoleWithLog("线程启动完毕……"); + ConsoleUtil.boostConsoleWithLog("线程启动完毕……"); } /** @@ -135,13 +135,13 @@ private void timeMonitor() { // 保存停止前的数据 try { - ConsoleUtil.consoleWithLog("正在保存结果数据……"); + ConsoleUtil.boostConsoleWithLog("正在保存结果数据……"); BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(true); // 空跑控制 if (!BoostForm.boostForm.getDryRunCheckBox().isSelected()) { PushControl.savePushData(); } - ConsoleUtil.consoleWithLog("结果数据保存完毕!"); + ConsoleUtil.boostConsoleWithLog("结果数据保存完毕!"); } catch (IOException e) { logger.error(e); } finally { diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java index 6b652c49..eb540b65 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java @@ -21,6 +21,7 @@ import com.fangxuele.tool.push.logic.msgsender.SendResult; import com.fangxuele.tool.push.ui.form.MainWindow; import com.fangxuele.tool.push.ui.form.MessageEditForm; +import com.fangxuele.tool.push.ui.form.PushForm; import com.fangxuele.tool.push.ui.form.PushHisForm; import com.fangxuele.tool.push.ui.form.ScheduleForm; import com.fangxuele.tool.push.ui.form.SettingForm; @@ -112,6 +113,20 @@ public static boolean pushCheck() { return false; } + if (!PushData.boostMode) { + if ("0".equals(PushForm.pushForm.getMaxThreadPoolTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getMaxThreadPoolTextField().getText())) { + JOptionPane.showMessageDialog(PushForm.pushForm.getPushPanel(), "请设置每页分配用户数!", "提示", + JOptionPane.INFORMATION_MESSAGE); + + return false; + } + if ("0".equals(PushForm.pushForm.getThreadCountTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getThreadCountTextField().getText())) { + JOptionPane.showMessageDialog(PushForm.pushForm.getPushPanel(), "请设置每个线程分配的页数!", "提示", + JOptionPane.INFORMATION_MESSAGE); + + return false; + } + } int msgType = App.config.getMsgType(); switch (msgType) { diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushData.java b/src/main/java/com/fangxuele/tool/push/logic/PushData.java index bca45d1d..77600c78 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushData.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushData.java @@ -119,6 +119,11 @@ public static void increaseStopedThread() { */ public static long endTime = 0; + /** + * 是否为性能模式 + */ + public static boolean boostMode = false; + /** * 重置推送数据 */ diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java index 80d09df2..22f8bdc4 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java @@ -96,6 +96,7 @@ public void mouseExited(MouseEvent e) { // 开始按钮事件 BoostForm.boostForm.getStartButton().addActionListener((e) -> ThreadUtil.execute(() -> { + PushData.boostMode = true; if (App.config.getMsgType() != MessageTypeEnum.MP_TEMPLATE_CODE) { JOptionPane.showMessageDialog(MainWindow.mainWindow.getMainPanel(), "性能模式目前仅支持微信模板消息,后续逐步增加对其他消息类型的支持!", "提示", JOptionPane.INFORMATION_MESSAGE); @@ -117,6 +118,7 @@ public void mouseExited(MouseEvent e) { // 按计划执行按钮事件 BoostForm.boostForm.getScheduledRunButton().addActionListener((e -> ThreadUtil.execute(() -> { + PushData.boostMode = true; if (App.config.getMsgType() != MessageTypeEnum.MP_TEMPLATE_CODE) { JOptionPane.showMessageDialog(MainWindow.mainWindow.getMainPanel(), "性能模式目前仅支持微信模板消息,后续逐步增加对其他消息类型的支持!", "提示", JOptionPane.INFORMATION_MESSAGE); diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/PushListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/PushListener.java index 79785af9..ef4ad54e 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/listener/PushListener.java +++ b/src/main/java/com/fangxuele/tool/push/ui/listener/PushListener.java @@ -20,7 +20,6 @@ import com.fangxuele.tool.push.ui.form.PushForm; import com.fangxuele.tool.push.ui.form.ScheduleForm; import org.apache.commons.compress.utils.Lists; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateUtils; @@ -60,20 +59,8 @@ public class PushListener { public static void addListeners() { // 开始按钮事件 PushForm.pushForm.getPushStartButton().addActionListener((e) -> ThreadUtil.execute(() -> { + PushData.boostMode = false; if (PushControl.pushCheck()) { - if ("0".equals(PushForm.pushForm.getMaxThreadPoolTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getMaxThreadPoolTextField().getText())) { - JOptionPane.showMessageDialog(pushPanel, "请设置每页分配用户数!", "提示", - JOptionPane.INFORMATION_MESSAGE); - - return; - } - if ("0".equals(PushForm.pushForm.getThreadCountTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getThreadCountTextField().getText())) { - JOptionPane.showMessageDialog(pushPanel, "请设置每个线程分配的页数!", "提示", - JOptionPane.INFORMATION_MESSAGE); - - return; - } - int isPush = JOptionPane.showConfirmDialog(pushPanel, "确定开始推送吗?\n\n推送消息:" + MessageEditForm.messageEditForm.getMsgNameField().getText() + @@ -153,17 +140,8 @@ public static void addListeners() { // 按计划执行按钮事件 PushForm.pushForm.getScheduleRunButton().addActionListener((e -> ThreadUtil.execute(() -> { + PushData.boostMode = false; if (PushControl.pushCheck()) { - if ("0".equals(PushForm.pushForm.getMaxThreadPoolTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getMaxThreadPoolTextField().getText())) { - JOptionPane.showMessageDialog(pushPanel, "请设置每页分配用户数!", "提示", - JOptionPane.INFORMATION_MESSAGE); - return; - } - if ("0".equals(PushForm.pushForm.getThreadCountTextField().getText()) || StringUtils.isEmpty(PushForm.pushForm.getThreadCountTextField().getText())) { - JOptionPane.showMessageDialog(pushPanel, "请设置每个线程分配的页数!", "提示", - JOptionPane.INFORMATION_MESSAGE); - return; - } // 看是否存在设置的计划任务 boolean existScheduleTask = false; From 25646564d22efc25dd14c9a51e921793655b9f9a Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 13 Jul 2019 17:41:35 +0800 Subject: [PATCH 10/20] =?UTF-8?q?bug=20fix:=E7=A9=BA=E8=B7=91=E6=97=B6?= =?UTF-8?q?=E4=B8=8D=E5=BA=94=E8=AF=A5=E6=8F=90=E7=A4=BA=E6=AD=A3=E5=9C=A8?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fangxuele/tool/push/logic/BoostPushRunThread.java | 6 +++--- .../java/com/fangxuele/tool/push/logic/PushRunThread.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java index 84236b63..02503df5 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java @@ -135,13 +135,13 @@ private void timeMonitor() { // 保存停止前的数据 try { - ConsoleUtil.boostConsoleWithLog("正在保存结果数据……"); - BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(true); // 空跑控制 if (!BoostForm.boostForm.getDryRunCheckBox().isSelected()) { + ConsoleUtil.boostConsoleWithLog("正在保存结果数据……"); + BoostForm.boostForm.getCompletedProgressBar().setIndeterminate(true); PushControl.savePushData(); + ConsoleUtil.boostConsoleWithLog("结果数据保存完毕!"); } - ConsoleUtil.boostConsoleWithLog("结果数据保存完毕!"); } catch (IOException e) { logger.error(e); } finally { diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java index a022a740..906b5ffa 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushRunThread.java @@ -186,13 +186,13 @@ private void timeMonitor() { // 保存停止前的数据 try { - ConsoleUtil.consoleWithLog("正在保存结果数据……"); - PushForm.pushForm.getPushTotalProgressBar().setIndeterminate(true); // 空跑控制 if (!PushForm.pushForm.getDryRunCheckBox().isSelected()) { + ConsoleUtil.consoleWithLog("正在保存结果数据……"); + PushForm.pushForm.getPushTotalProgressBar().setIndeterminate(true); PushControl.savePushData(); + ConsoleUtil.consoleWithLog("结果数据保存完毕!"); } - ConsoleUtil.consoleWithLog("结果数据保存完毕!"); } catch (IOException e) { logger.error(e); } finally { From 3a8081e4955c497aec804947990d069c9b6af124 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 13 Jul 2019 21:11:45 +0800 Subject: [PATCH 11/20] =?UTF-8?q?feature:=E6=A8=A1=E6=9D=BF=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=80=A7=E8=83=BD=E6=A8=A1=E5=BC=8F=E5=88=9D=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../msgsender/WxMpTemplateMsgSender.java | 85 +++++++++++++++---- 1 file changed, 67 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java index 1a225fee..09d2eec1 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java @@ -8,15 +8,19 @@ import com.fangxuele.tool.push.ui.form.BoostForm; import com.fangxuele.tool.push.util.ConsoleUtil; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.util.http.apache.DefaultApacheHttpClientBuilder; import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; +import org.apache.http.Consts; +import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpPost; import org.apache.http.concurrent.FutureCallback; +import org.apache.http.entity.StringEntity; import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; import org.apache.http.impl.nio.client.HttpAsyncClients; import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager; @@ -26,7 +30,6 @@ import org.apache.http.nio.reactor.IOReactorException; import org.apache.http.util.EntityUtils; -import java.io.IOException; import java.util.concurrent.Future; /** @@ -94,14 +97,33 @@ public SendResult asyncSend(String[] msgData) { WxMpTemplateMessage wxMessageTemplate = wxMpTemplateMsgMaker.makeMsg(msgData); wxMessageTemplate.setToUser(openId); - String url = "http://localhost:9000/qian/api/test/lucky?msg=" + openId; - // TODO - Future httpResponseFuture = getCloseableHttpAsyncClient().execute(new HttpPost(url), new Back(msgData)); + String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + wxMpService.getAccessToken(); + HttpPost httpPost = new HttpPost(url); + StringEntity entity = new StringEntity(wxMessageTemplate.toJson(), Consts.UTF_8); + httpPost.setEntity(entity); + if (wxMpService.getRequestHttp().getRequestHttpProxy() != null) { + RequestConfig config = RequestConfig.custom().setProxy((HttpHost) wxMpService.getRequestHttp().getRequestHttpProxy()).build(); + httpPost.setConfig(config); + } + Future httpResponseFuture = getCloseableHttpAsyncClient().execute(httpPost, new CallBack(msgData)); if (!PushData.running) { + // TODO httpResponseFuture.cancel(true); } } } catch (Exception e) { + // 总发送失败+1 + PushData.increaseFail(); + BoostForm.boostForm.getFailCountLabel().setText(String.valueOf(PushData.failRecords)); + + // 保存发送失败 + PushData.sendFailList.add(msgData); + + // 失败异常信息输出控制台 + ConsoleUtil.boostConsoleOnly("发送失败:" + e.toString() + ";msgData:" + JSONUtil.toJsonPrettyStr(msgData)); + // 总进度条 + BoostForm.boostForm.getCompletedProgressBar().setValue(PushData.successRecords.intValue() + PushData.failRecords.intValue()); + sendResult.setSuccess(false); sendResult.setInfo(e.getMessage()); log.error(e.toString()); @@ -208,31 +230,58 @@ public static CloseableHttpAsyncClient getCloseableHttpAsyncClient() throws IORe return closeableHttpAsyncClient; } - static class Back implements FutureCallback { + static class CallBack implements FutureCallback { String[] msgData; - Back(String[] msgData) { + CallBack(String[] msgData) { this.msgData = msgData; } @Override public void completed(HttpResponse httpResponse) { try { - String response = EntityUtils.toString(httpResponse.getEntity()); - ConsoleUtil.boostConsoleOnly(response); - } catch (IOException e) { - e.printStackTrace(); - } + String response = EntityUtils.toString(httpResponse.getEntity(), Consts.UTF_8); + if (response.isEmpty()) { + // 总发送失败+1 + PushData.increaseFail(); + BoostForm.boostForm.getFailCountLabel().setText(String.valueOf(PushData.failRecords)); - // 已成功+1 - PushData.increaseSuccess(); - BoostForm.boostForm.getSuccessCountLabel().setText(String.valueOf(PushData.successRecords)); + // 保存发送失败 + PushData.sendFailList.add(msgData); - // 保存发送成功 - PushData.sendSuccessList.add(msgData); - // 总进度条 - BoostForm.boostForm.getCompletedProgressBar().setValue(PushData.successRecords.intValue() + PushData.failRecords.intValue()); + // 失败异常信息输出控制台 + ConsoleUtil.boostConsoleOnly("发送失败:" + WxError.builder().errorCode(9999).errorMsg("无响应内容").build() + ";msgData:" + JSONUtil.toJsonPrettyStr(msgData)); + // 总进度条 + BoostForm.boostForm.getCompletedProgressBar().setValue(PushData.successRecords.intValue() + PushData.failRecords.intValue()); + } else { + WxError error = WxError.fromJson(response); + if (error.getErrorCode() != 0) { + // 总发送失败+1 + PushData.increaseFail(); + BoostForm.boostForm.getFailCountLabel().setText(String.valueOf(PushData.failRecords)); + + // 保存发送失败 + PushData.sendFailList.add(msgData); + + // 失败异常信息输出控制台 + ConsoleUtil.boostConsoleOnly("发送失败:" + error + ";msgData:" + JSONUtil.toJsonPrettyStr(msgData)); + // 总进度条 + BoostForm.boostForm.getCompletedProgressBar().setValue(PushData.successRecords.intValue() + PushData.failRecords.intValue()); + } else { + // 已成功+1 + PushData.increaseSuccess(); + BoostForm.boostForm.getSuccessCountLabel().setText(String.valueOf(PushData.successRecords)); + + // 保存发送成功 + PushData.sendSuccessList.add(msgData); + // 总进度条 + BoostForm.boostForm.getCompletedProgressBar().setValue(PushData.successRecords.intValue() + PushData.failRecords.intValue()); + } + } + } catch (Exception e) { + e.printStackTrace(); + } } @Override From 94abd0e905ddfb4e8dacd447a0615707ba5e032d Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 13 Jul 2019 21:40:14 +0800 Subject: [PATCH 12/20] =?UTF-8?q?feature:=E9=82=AE=E4=BB=B6=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E8=A1=A8=E5=A2=9E=E5=8A=A0=E6=8A=84=E9=80=81=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fangxuele/tool/push/domain/TMsgMail.java | 10 +++++++++ src/main/resources/db_init.sql | 1 + src/main/resources/generatorConfig.xml | 2 +- src/main/resources/mapper/TMsgMailMapper.xml | 21 +++++++++++++++---- src/main/resources/upgrade/.gitkeep | 0 src/main/resources/upgrade/28.sql | 2 ++ 6 files changed, 31 insertions(+), 5 deletions(-) delete mode 100644 src/main/resources/upgrade/.gitkeep create mode 100644 src/main/resources/upgrade/28.sql diff --git a/src/main/java/com/fangxuele/tool/push/domain/TMsgMail.java b/src/main/java/com/fangxuele/tool/push/domain/TMsgMail.java index 625516f3..8fed4bf5 100644 --- a/src/main/java/com/fangxuele/tool/push/domain/TMsgMail.java +++ b/src/main/java/com/fangxuele/tool/push/domain/TMsgMail.java @@ -19,6 +19,8 @@ public class TMsgMail implements Serializable { private String modifiedTime; + private String cc; + private static final long serialVersionUID = 1L; public Integer getId() { @@ -84,4 +86,12 @@ public String getModifiedTime() { public void setModifiedTime(String modifiedTime) { this.modifiedTime = modifiedTime == null ? null : modifiedTime.trim(); } + + public String getCc() { + return cc; + } + + public void setCc(String cc) { + this.cc = cc == null ? null : cc.trim(); + } } \ No newline at end of file diff --git a/src/main/resources/db_init.sql b/src/main/resources/db_init.sql index 519cd7de..4a79faa2 100644 --- a/src/main/resources/db_init.sql +++ b/src/main/resources/db_init.sql @@ -155,6 +155,7 @@ create table if not exists t_msg_mail msg_type integer, msg_name text, title text, + Cc text, files text, content text, create_time datetime, diff --git a/src/main/resources/generatorConfig.xml b/src/main/resources/generatorConfig.xml index a3ceba79..ddeade99 100644 --- a/src/main/resources/generatorConfig.xml +++ b/src/main/resources/generatorConfig.xml @@ -45,7 +45,7 @@ + tableName="t_msg_mail" domainObjectName="TMsgMail">
diff --git a/src/main/resources/mapper/TMsgMailMapper.xml b/src/main/resources/mapper/TMsgMailMapper.xml index 915470c2..1751636b 100644 --- a/src/main/resources/mapper/TMsgMailMapper.xml +++ b/src/main/resources/mapper/TMsgMailMapper.xml @@ -10,9 +10,10 @@ + - id, msg_type, msg_name, title, files, content, create_time, modified_time + id, msg_type, msg_name, title, files, content, create_time, modified_time, Cc @@ -135,6 +147,7 @@ update t_msg_mail set title = #{title,jdbcType=VARCHAR}, + Cc = #{cc,jdbcType=VARCHAR}, files = #{files,jdbcType=VARCHAR}, content = #{content,jdbcType=VARCHAR}, modified_time = #{modifiedTime,jdbcType=VARCHAR} diff --git a/src/main/resources/upgrade/.gitkeep b/src/main/resources/upgrade/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/resources/upgrade/28.sql b/src/main/resources/upgrade/28.sql new file mode 100644 index 00000000..dc03007c --- /dev/null +++ b/src/main/resources/upgrade/28.sql @@ -0,0 +1,2 @@ +alter table t_msg_mail + add Cc text; \ No newline at end of file From 82cf4abfe97e1537f1cda746f89a10b447e32b3f Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 13 Jul 2019 21:53:02 +0800 Subject: [PATCH 13/20] =?UTF-8?q?feature:e-mail=E6=B6=88=E6=81=AF=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=8A=84=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fangxuele/tool/push/bean/MailMsg.java | 5 ++++ .../tool/push/logic/PushControl.java | 11 ++++++- .../push/logic/msgmaker/MailMsgMaker.java | 4 +++ .../push/logic/msgsender/MailMsgSender.java | 13 ++++++-- .../tool/push/ui/form/msg/MailMsgForm.form | 30 ++++++++++++++----- .../tool/push/ui/form/msg/MailMsgForm.java | 24 ++++++++++----- 6 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/bean/MailMsg.java b/src/main/java/com/fangxuele/tool/push/bean/MailMsg.java index ebd40946..5d3a3ecc 100644 --- a/src/main/java/com/fangxuele/tool/push/bean/MailMsg.java +++ b/src/main/java/com/fangxuele/tool/push/bean/MailMsg.java @@ -24,6 +24,11 @@ public class MailMsg implements Serializable { */ private String mailTitle; + /** + * 抄送 + */ + private String mailCc; + /** * 附件 */ diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java index eb540b65..03232129 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java @@ -70,7 +70,7 @@ public class PushControl { */ public static List preview() { List sendResultList = new ArrayList<>(); - if (!pushCheck()) { + if (!configCheck()) { return null; } List msgDataList = new ArrayList<>(); @@ -128,6 +128,15 @@ public static boolean pushCheck() { } } + return configCheck(); + } + + /** + * 配置检查 + * + * @return + */ + public static boolean configCheck() { int msgType = App.config.getMsgType(); switch (msgType) { case MessageTypeEnum.MP_TEMPLATE_CODE: diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MailMsgMaker.java b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MailMsgMaker.java index 77a554d0..913519b3 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MailMsgMaker.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/MailMsgMaker.java @@ -16,6 +16,7 @@ public class MailMsgMaker extends BaseMsgMaker implements IMsgMaker { public static String mailTitle; + public static String mailCc; public static String mailFiles; public static String mailContent; @@ -24,6 +25,7 @@ public class MailMsgMaker extends BaseMsgMaker implements IMsgMaker { */ public static void prepare() { mailTitle = MailMsgForm.mailMsgForm.getMailTitleTextField().getText(); + mailCc = MailMsgForm.mailMsgForm.getMailCcTextField().getText(); mailFiles = MailMsgForm.mailMsgForm.getMailFilesTextField().getText(); mailContent = MailMsgForm.mailMsgForm.getMailContentPane().getText(); } @@ -39,9 +41,11 @@ public MailMsg makeMsg(String[] msgData) { MailMsg mailMsg = new MailMsg(); VelocityContext velocityContext = getVelocityContext(msgData); String title = TemplateUtil.evaluate(mailTitle, velocityContext); + String cc = TemplateUtil.evaluate(mailCc, velocityContext); String files = TemplateUtil.evaluate(mailFiles, velocityContext); String content = TemplateUtil.evaluate(mailContent, velocityContext); mailMsg.setMailTitle(title); + mailMsg.setMailCc(cc); mailMsg.setMailFiles(files); mailMsg.setMailContent(content); return mailMsg; diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/MailMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/MailMsgSender.java index dca0713a..9e5e70f1 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/MailMsgSender.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/MailMsgSender.java @@ -8,6 +8,7 @@ import com.fangxuele.tool.push.logic.PushControl; import com.fangxuele.tool.push.logic.msgmaker.MailMsgMaker; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.StringUtils; import java.io.File; @@ -39,15 +40,21 @@ public SendResult send(String[] msgData) { try { MailMsg mailMsg = mailMsgMaker.makeMsg(msgData); - String tos = msgData[0]; + List tos = Lists.newArrayList(); + tos.add(msgData[0]); if (PushControl.dryRun) { sendResult.setSuccess(true); return sendResult; } else { + List ccList = null; + if (StringUtils.isNotBlank(mailMsg.getMailCc())) { + ccList = Lists.newArrayList(); + ccList.add(mailMsg.getMailCc()); + } if (StringUtils.isEmpty(mailMsg.getMailFiles())) { - MailUtil.send(mailAccount, tos, mailMsg.getMailTitle(), mailMsg.getMailContent(), true); + MailUtil.send(mailAccount, tos, ccList, null, mailMsg.getMailTitle(), mailMsg.getMailContent(), true); } else { - MailUtil.send(mailAccount, tos, mailMsg.getMailTitle(), mailMsg.getMailContent(), true, FileUtil.file(mailMsg.getMailFiles())); + MailUtil.send(mailAccount, tos, ccList, null, mailMsg.getMailTitle(), mailMsg.getMailContent(), true, FileUtil.file(mailMsg.getMailFiles())); } sendResult.setSuccess(true); } diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/MailMsgForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/msg/MailMsgForm.form index 60dbfdf5..90f60202 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/msg/MailMsgForm.form +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/MailMsgForm.form @@ -1,6 +1,6 @@

- + @@ -20,7 +20,7 @@ - + @@ -36,7 +36,7 @@ - + @@ -48,7 +48,7 @@ - + @@ -56,7 +56,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -73,12 +73,28 @@ - + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/MailMsgForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/msg/MailMsgForm.java index 7de6c553..26c3ddc0 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/msg/MailMsgForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/MailMsgForm.java @@ -39,6 +39,7 @@ public class MailMsgForm { private JEditorPane mailContentPane; private JButton fileExploreButton; private JLabel uEditorLabel; + private JTextField mailCcTextField; private static TMsgMailMapper msgMailMapper = MybatisUtil.getSqlSession().getMapper(TMsgMailMapper.class); @@ -84,6 +85,7 @@ public static void init(String msgName) { if (tMsgMailList.size() > 0) { TMsgMail tMsgMail = tMsgMailList.get(0); mailMsgForm.getMailTitleTextField().setText(tMsgMail.getTitle()); + mailMsgForm.getMailCcTextField().setText(tMsgMail.getCc()); mailMsgForm.getMailFilesTextField().setText(tMsgMail.getFiles()); mailMsgForm.getMailContentPane().setText(tMsgMail.getContent()); } @@ -94,6 +96,7 @@ public static void init(String msgName) { */ public static void clearAllField() { mailMsgForm.getMailTitleTextField().setText(""); + mailMsgForm.getMailCcTextField().setText(""); mailMsgForm.getMailFilesTextField().setText(""); mailMsgForm.getMailContentPane().setText(""); } @@ -114,6 +117,7 @@ public static void save(String msgName) { } if (!existSameMsg || isCover == JOptionPane.YES_OPTION) { String mailTitle = mailMsgForm.getMailTitleTextField().getText(); + String mailCc = mailMsgForm.getMailCcTextField().getText(); String mailFiles = mailMsgForm.getMailFilesTextField().getText(); String mailContent = mailMsgForm.getMailContentPane().getText(); @@ -123,6 +127,7 @@ public static void save(String msgName) { tMsgMail.setMsgType(MessageTypeEnum.EMAIL_CODE); tMsgMail.setMsgName(msgName); tMsgMail.setTitle(mailTitle); + tMsgMail.setCc(mailCc); tMsgMail.setFiles(mailFiles); tMsgMail.setContent(mailContent); tMsgMail.setCreateTime(now); @@ -155,33 +160,38 @@ public static void save(String msgName) { */ private void $$$setupUI$$$() { mailPanel = new JPanel(); - mailPanel.setLayout(new GridLayoutManager(4, 4, new Insets(8, 8, 8, 8), -1, -1)); + mailPanel.setLayout(new GridLayoutManager(5, 4, new Insets(8, 8, 8, 8), -1, -1)); mailPanel.setMinimumSize(new Dimension(-1, -1)); final JLabel label1 = new JLabel(); label1.setText("邮件标题"); mailPanel.add(label1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final JLabel label2 = new JLabel(); label2.setText("附件"); - mailPanel.add(label2, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + mailPanel.add(label2, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); mailTitleTextField = new JTextField(); mailPanel.add(mailTitleTextField, new GridConstraints(0, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); mailContentPane = new JEditorPane(); mailContentPane.setBackground(new Color(-12236470)); mailContentPane.setContentType("text/html"); mailContentPane.setText("\r\n \r\n \r\n \r\n \r\n \r\n\r\n"); - mailPanel.add(mailContentPane, new GridConstraints(3, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, new Dimension(150, 50), null, 0, false)); + mailPanel.add(mailContentPane, new GridConstraints(4, 0, 1, 4, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, new Dimension(150, 50), null, 0, false)); final JLabel label3 = new JLabel(); label3.setText("邮件正文(HTML)"); - mailPanel.add(label3, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + mailPanel.add(label3, new GridConstraints(3, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); uEditorLabel = new JLabel(); uEditorLabel.setText("使用UEditor编辑HTML"); - mailPanel.add(uEditorLabel, new GridConstraints(2, 1, 1, 3, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + mailPanel.add(uEditorLabel, new GridConstraints(3, 1, 1, 3, GridConstraints.ANCHOR_EAST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); fileExploreButton = new JButton(); fileExploreButton.setHorizontalAlignment(0); fileExploreButton.setText("浏览"); - mailPanel.add(fileExploreButton, new GridConstraints(1, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, 1, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + mailPanel.add(fileExploreButton, new GridConstraints(2, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, 1, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); mailFilesTextField = new JTextField(); - mailPanel.add(mailFilesTextField, new GridConstraints(1, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + mailPanel.add(mailFilesTextField, new GridConstraints(2, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + mailCcTextField = new JTextField(); + mailPanel.add(mailCcTextField, new GridConstraints(1, 1, 1, 3, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); + final JLabel label4 = new JLabel(); + label4.setText("抄送"); + mailPanel.add(label4, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); } /** From 76590a274a4639ab75308a193434f486cee12de7 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 13 Jul 2019 22:02:50 +0800 Subject: [PATCH 14/20] =?UTF-8?q?optimization:=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7=EF=BC=8C=E4=BC=98=E5=8C=96=E5=B9=B3=E6=BB=91?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E6=97=B6sql=E6=89=A7=E8=A1=8C=E5=B9=82?= =?UTF-8?q?=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/fangxuele/tool/push/ui/UiConsts.java | 2 +- .../java/com/fangxuele/tool/push/util/UpgradeUtil.java | 4 +++- src/main/resources/version_summary.json | 10 ++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java b/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java index 1cf6fd37..a26cde5c 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java +++ b/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java @@ -16,7 +16,7 @@ public class UiConsts { * 软件名称,版本 */ public final static String APP_NAME = "WePush"; - public final static String APP_VERSION = "v_3.4.2_190630"; + public final static String APP_VERSION = "v_3.5.0_190713"; /** * 主窗口图标-大 diff --git a/src/main/java/com/fangxuele/tool/push/util/UpgradeUtil.java b/src/main/java/com/fangxuele/tool/push/util/UpgradeUtil.java index 083be93c..5c857147 100644 --- a/src/main/java/com/fangxuele/tool/push/util/UpgradeUtil.java +++ b/src/main/java/com/fangxuele/tool/push/util/UpgradeUtil.java @@ -130,7 +130,9 @@ public static void smoothUpgrade() { MybatisUtil.executeSql(sql); } catch (SQLException e) { log.error("执行索引为{}的版本对应的sql时异常", i, e); - return; + if (!e.getMessage().contains("duplicate column")) { + return; + } } } upgrade(i); diff --git a/src/main/resources/version_summary.json b/src/main/resources/version_summary.json index d0f5f88e..190c85db 100644 --- a/src/main/resources/version_summary.json +++ b/src/main/resources/version_summary.json @@ -1,5 +1,5 @@ { - "currentVersion": "v_3.4.2_190630", + "currentVersion": "v_3.5.0_190713", "versionIndex": { "v_1.1.0_170701": "0", "v_1.2.0_170831": "1", @@ -28,7 +28,8 @@ "v_3.3.0_190608": "24", "v_3.4.0_190619": "25", "v_3.4.1_190624": "26", - "v_3.4.2_190630": "27" + "v_3.4.2_190630": "27", + "v_3.5.0_190713": "28" }, "versionDetailList": [ { @@ -170,6 +171,11 @@ "version": "v_3.4.2_190630", "title": "新增支持微信企业号/企业微信类型消息", "log": "● feature:新增支持发送微信企业号/企业微信类型消息\n● feature:支持按标签按部门导入企业通讯录员工\n● optimization:低分辨率下自动最大化窗口\n● feature:企业号支持应用管理\n● optimization:外观设置中支持从系统可用字体列表中选择字体+默认字体调整为:微软雅黑\n● fix:修复NICK_NAME变量失效的bug\n" + }, + { + "version": "v_3.5.0_190713", + "title": "新增性能模式", + "log": "● feature:新增性能模式(目前仅支持微信模板消息)\n● feature:e-mail消息支持抄送\n● feature:企业号消息新增支持……\n● fix:修复NICK_NAME变量失效的bug\n" } ] } \ No newline at end of file From 511b7a9fe4d99376ac2b4e35d421cab667b8a125 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 13 Jul 2019 22:47:33 +0800 Subject: [PATCH 15/20] =?UTF-8?q?feature:=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=B6=88=E6=81=AF=E5=A2=9E=E5=8A=A0=E5=AF=B9=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E5=8D=A1=E7=89=87=E5=92=8Cmarkdown=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81=20bug=20fix:=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=B6=88=E6=81=AF=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC=E9=93=BE=E6=8E=A5=E4=B8=8D=E6=AD=A3=E7=A1=AE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fangxuele/tool/push/domain/TMsgWxCp.java | 10 +++++ .../push/logic/msgmaker/WxCpMsgMaker.java | 17 ++++++- .../tool/push/ui/form/msg/WxCpMsgForm.form | 25 ++++++++++- .../tool/push/ui/form/msg/WxCpMsgForm.java | 45 ++++++++++++++++--- src/main/resources/db_init.sql | 1 + src/main/resources/generatorConfig.xml | 2 +- src/main/resources/mapper/TMsgWxCpMapper.xml | 22 +++++++-- src/main/resources/upgrade/28.sql | 2 + 8 files changed, 109 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/domain/TMsgWxCp.java b/src/main/java/com/fangxuele/tool/push/domain/TMsgWxCp.java index ee86a317..378fb471 100644 --- a/src/main/java/com/fangxuele/tool/push/domain/TMsgWxCp.java +++ b/src/main/java/com/fangxuele/tool/push/domain/TMsgWxCp.java @@ -27,6 +27,8 @@ public class TMsgWxCp implements Serializable { private String modifiedTime; + private String btnTxt; + private static final long serialVersionUID = 1L; public Integer getId() { @@ -124,4 +126,12 @@ public String getModifiedTime() { public void setModifiedTime(String modifiedTime) { this.modifiedTime = modifiedTime == null ? null : modifiedTime.trim(); } + + public String getBtnTxt() { + return btnTxt; + } + + public void setBtnTxt(String btnTxt) { + this.btnTxt = btnTxt == null ? null : btnTxt.trim(); + } } \ No newline at end of file diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/WxCpMsgMaker.java b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/WxCpMsgMaker.java index 3a2633a0..f8697bb2 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgmaker/WxCpMsgMaker.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgmaker/WxCpMsgMaker.java @@ -29,6 +29,8 @@ public class WxCpMsgMaker extends BaseMsgMaker implements IMsgMaker { public static String url; + public static String btnTxt; + public static String msgContent; /** @@ -40,7 +42,8 @@ public static void prepare() { msgTitle = WxCpMsgForm.wxCpMsgForm.getTitleTextField().getText(); picUrl = WxCpMsgForm.wxCpMsgForm.getPicUrlTextField().getText().trim(); desc = WxCpMsgForm.wxCpMsgForm.getDescTextField().getText(); - url = WxCpMsgForm.wxCpMsgForm.getPicUrlTextField().getText().trim(); + url = WxCpMsgForm.wxCpMsgForm.getUrlTextField().getText().trim(); + btnTxt = WxCpMsgForm.wxCpMsgForm.getBtnTxtTextField().getText().trim(); msgContent = WxCpMsgForm.wxCpMsgForm.getContentTextArea().getText(); WxCpMsgSender.wxCpConfigStorage = null; WxCpMsgSender.wxCpService = null; @@ -78,6 +81,18 @@ public WxCpMessage makeMsg(String[] msgData) { } else if ("文本消息".equals(msgType)) { String content = TemplateUtil.evaluate(msgContent, velocityContext); wxCpMessage = WxCpMessage.TEXT().agentId(Integer.valueOf(agentId)).toUser(msgData[0]).content(content).build(); + } else if ("markdown消息".equals(msgType)) { + String content = TemplateUtil.evaluate(msgContent, velocityContext); + wxCpMessage = WxCpMessage.MARKDOWN().agentId(Integer.valueOf(agentId)).toUser(msgData[0]).content(content).build(); + } else if ("文本卡片消息".equals(msgType)) { + // 标题 + String title = TemplateUtil.evaluate(msgTitle, velocityContext); + // 描述 + String description = TemplateUtil.evaluate(desc, velocityContext); + // 跳转url + String urlLink = TemplateUtil.evaluate(url, velocityContext); + wxCpMessage = WxCpMessage.TEXTCARD().agentId(Integer.valueOf(agentId)).toUser(msgData[0]).title(title) + .description(description).url(urlLink).btnTxt(btnTxt).build(); } return wxCpMessage; diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/WxCpMsgForm.form b/src/main/java/com/fangxuele/tool/push/ui/form/msg/WxCpMsgForm.form index 9bd34592..e894c81b 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/msg/WxCpMsgForm.form +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/WxCpMsgForm.form @@ -8,7 +8,7 @@ - + @@ -29,7 +29,7 @@
- + @@ -40,6 +40,8 @@ + + @@ -150,6 +152,25 @@
+ + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/fangxuele/tool/push/ui/form/msg/WxCpMsgForm.java b/src/main/java/com/fangxuele/tool/push/ui/form/msg/WxCpMsgForm.java index 7e111e13..ed107a1e 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/form/msg/WxCpMsgForm.java +++ b/src/main/java/com/fangxuele/tool/push/ui/form/msg/WxCpMsgForm.java @@ -48,6 +48,8 @@ public class WxCpMsgForm { private JComboBox appNameComboBox; private JButton appManageButton; private JTextArea contentTextArea; + private JTextField btnTxtTextField; + private JLabel btnTxtLabel; public static WxCpMsgForm wxCpMsgForm = new WxCpMsgForm(); @@ -82,14 +84,12 @@ public static void init(String msgName) { String cpMsgType = tMsgWxCp.getCpMsgType(); wxCpMsgForm.getAppNameComboBox().setSelectedItem(agentIdToAppNameMap.get(tMsgWxCp.getAgentId())); wxCpMsgForm.getMsgTypeComboBox().setSelectedItem(cpMsgType); - if ("文本消息".equals(cpMsgType)) { - wxCpMsgForm.getContentTextArea().setText(tMsgWxCp.getContent()); - } else if ("图文消息".equals(cpMsgType)) { - wxCpMsgForm.getTitleTextField().setText(tMsgWxCp.getTitle()); - } + wxCpMsgForm.getContentTextArea().setText(tMsgWxCp.getContent()); + wxCpMsgForm.getTitleTextField().setText(tMsgWxCp.getTitle()); wxCpMsgForm.getPicUrlTextField().setText(tMsgWxCp.getImgUrl()); wxCpMsgForm.getDescTextField().setText(tMsgWxCp.getDescribe()); wxCpMsgForm.getUrlTextField().setText(tMsgWxCp.getUrl()); + wxCpMsgForm.getBtnTxtTextField().setText(tMsgWxCp.getBtnTxt()); switchCpMsgType(cpMsgType); } else { @@ -118,6 +118,7 @@ public static void initAppNameList() { public static void switchCpMsgType(String msgType) { switch (msgType) { case "文本消息": + case "markdown消息": wxCpMsgForm.getContentTextArea().setVisible(true); wxCpMsgForm.getDescLabel().setVisible(false); wxCpMsgForm.getDescTextField().setVisible(false); @@ -127,10 +128,14 @@ public static void switchCpMsgType(String msgType) { wxCpMsgForm.getUrlTextField().setVisible(false); wxCpMsgForm.getTitleLabel().setVisible(false); wxCpMsgForm.getTitleTextField().setVisible(false); + wxCpMsgForm.getBtnTxtLabel().setVisible(false); + wxCpMsgForm.getBtnTxtTextField().setVisible(false); break; case "图文消息": wxCpMsgForm.getContentLabel().setVisible(false); wxCpMsgForm.getContentTextArea().setVisible(false); + wxCpMsgForm.getBtnTxtLabel().setVisible(false); + wxCpMsgForm.getBtnTxtTextField().setVisible(false); wxCpMsgForm.getDescLabel().setVisible(true); wxCpMsgForm.getDescTextField().setVisible(true); wxCpMsgForm.getPicUrlLabel().setVisible(true); @@ -140,6 +145,20 @@ public static void switchCpMsgType(String msgType) { wxCpMsgForm.getTitleLabel().setVisible(true); wxCpMsgForm.getTitleTextField().setVisible(true); break; + case "文本卡片消息": + wxCpMsgForm.getContentLabel().setVisible(false); + wxCpMsgForm.getContentTextArea().setVisible(false); + wxCpMsgForm.getPicUrlLabel().setVisible(false); + wxCpMsgForm.getPicUrlTextField().setVisible(false); + wxCpMsgForm.getDescLabel().setVisible(true); + wxCpMsgForm.getDescTextField().setVisible(true); + wxCpMsgForm.getBtnTxtLabel().setVisible(true); + wxCpMsgForm.getBtnTxtTextField().setVisible(true); + wxCpMsgForm.getUrlLabel().setVisible(true); + wxCpMsgForm.getUrlTextField().setVisible(true); + wxCpMsgForm.getTitleLabel().setVisible(true); + wxCpMsgForm.getTitleTextField().setVisible(true); + break; default: break; } @@ -154,6 +173,7 @@ public static void clearAllField() { wxCpMsgForm.getPicUrlTextField().setText(""); wxCpMsgForm.getDescTextField().setText(""); wxCpMsgForm.getUrlTextField().setText(""); + wxCpMsgForm.getBtnTxtTextField().setText(""); } public static void save(String msgName) { @@ -184,6 +204,7 @@ public static void save(String msgName) { String picUrl = wxCpMsgForm.getPicUrlTextField().getText(); String desc = wxCpMsgForm.getDescTextField().getText(); String url = wxCpMsgForm.getUrlTextField().getText(); + String btnTxt = wxCpMsgForm.getBtnTxtTextField().getText(); String now = SqliteUtil.nowDateForSqlite(); @@ -197,6 +218,7 @@ public static void save(String msgName) { tMsgWxCp.setImgUrl(picUrl); tMsgWxCp.setDescribe(desc); tMsgWxCp.setUrl(url); + tMsgWxCp.setBtnTxt(btnTxt); tMsgWxCp.setModifiedTime(now); if (existSameMsg) { @@ -229,18 +251,20 @@ public static void save(String msgName) { final JPanel panel1 = new JPanel(); panel1.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1)); wxCpMsgPanel = new JPanel(); - wxCpMsgPanel.setLayout(new GridLayoutManager(8, 3, new Insets(10, 8, 0, 8), -1, -1)); + wxCpMsgPanel.setLayout(new GridLayoutManager(9, 3, new Insets(10, 8, 0, 8), -1, -1)); panel1.add(wxCpMsgPanel, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); wxCpMsgPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, this.$$$getFont$$$(null, Font.BOLD, -1, wxCpMsgPanel.getFont()))); msgTypeLabel = new JLabel(); msgTypeLabel.setText("消息类型"); wxCpMsgPanel.add(msgTypeLabel, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); final Spacer spacer1 = new Spacer(); - wxCpMsgPanel.add(spacer1, new GridConstraints(7, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); + wxCpMsgPanel.add(spacer1, new GridConstraints(8, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_VERTICAL, 1, GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false)); msgTypeComboBox = new JComboBox(); final DefaultComboBoxModel defaultComboBoxModel1 = new DefaultComboBoxModel(); defaultComboBoxModel1.addElement("图文消息"); defaultComboBoxModel1.addElement("文本消息"); + defaultComboBoxModel1.addElement("文本卡片消息"); + defaultComboBoxModel1.addElement("markdown消息"); msgTypeComboBox.setModel(defaultComboBoxModel1); wxCpMsgPanel.add(msgTypeComboBox, new GridConstraints(1, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); titleLabel = new JLabel(); @@ -276,6 +300,13 @@ public static void save(String msgName) { wxCpMsgPanel.add(titleTextField, new GridConstraints(3, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, new Dimension(380, -1), new Dimension(380, -1), null, 0, false)); contentTextArea = new JTextArea(); wxCpMsgPanel.add(contentTextArea, new GridConstraints(2, 1, 1, 2, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_WANT_GROW, null, new Dimension(150, 50), null, 0, false)); + btnTxtLabel = new JLabel(); + btnTxtLabel.setText("按钮文字"); + btnTxtLabel.setToolTipText("可不填。默认为“详情”, 不超过4个文字,超过自动截断"); + wxCpMsgPanel.add(btnTxtLabel, new GridConstraints(7, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false)); + btnTxtTextField = new JTextField(); + btnTxtTextField.setToolTipText("可不填。默认为“详情”, 不超过4个文字,超过自动截断"); + wxCpMsgPanel.add(btnTxtTextField, new GridConstraints(7, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false)); msgTypeLabel.setLabelFor(msgTypeComboBox); titleLabel.setLabelFor(titleTextField); picUrlLabel.setLabelFor(picUrlTextField); diff --git a/src/main/resources/db_init.sql b/src/main/resources/db_init.sql index 4a79faa2..d6052594 100644 --- a/src/main/resources/db_init.sql +++ b/src/main/resources/db_init.sql @@ -194,6 +194,7 @@ create table if not exists t_msg_wx_cp img_url text, describe text, url text, + btn_txt text, create_time datetime, modified_time datetime ); diff --git a/src/main/resources/generatorConfig.xml b/src/main/resources/generatorConfig.xml index ddeade99..a3ceba79 100644 --- a/src/main/resources/generatorConfig.xml +++ b/src/main/resources/generatorConfig.xml @@ -45,7 +45,7 @@ + tableName="t_msg_wx_cp" domainObjectName="TMsgWxCp">
diff --git a/src/main/resources/mapper/TMsgWxCpMapper.xml b/src/main/resources/mapper/TMsgWxCpMapper.xml index 6186250f..247f69a5 100644 --- a/src/main/resources/mapper/TMsgWxCpMapper.xml +++ b/src/main/resources/mapper/TMsgWxCpMapper.xml @@ -14,10 +14,11 @@ + id, msg_type, msg_name, cp_msg_type, agent_id, content, title, img_url, describe, - url, create_time, modified_time + url, create_time, modified_time, btn_txt @@ -189,6 +202,7 @@ img_url = #{imgUrl,jdbcType=VARCHAR}, describe = #{describe,jdbcType=VARCHAR}, url = #{url,jdbcType=VARCHAR}, + btn_txt = #{btnTxt,jdbcType=VARCHAR}, create_time = #{createTime,jdbcType=VARCHAR}, modified_time = #{modifiedTime,jdbcType=VARCHAR} where msg_type = #{msgType,jdbcType=INTEGER} diff --git a/src/main/resources/upgrade/28.sql b/src/main/resources/upgrade/28.sql index dc03007c..818d9b41 100644 --- a/src/main/resources/upgrade/28.sql +++ b/src/main/resources/upgrade/28.sql @@ -1,2 +1,4 @@ +alter table t_msg_wx_cp + add btn_txt text; alter table t_msg_mail add Cc text; \ No newline at end of file From 50b5144dd35d791cdfe06b1307cf72ee6176de79 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sat, 13 Jul 2019 23:05:10 +0800 Subject: [PATCH 16/20] release:v_3.5.0_190713 --- src/main/resources/version_summary.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/version_summary.json b/src/main/resources/version_summary.json index 190c85db..44fbc608 100644 --- a/src/main/resources/version_summary.json +++ b/src/main/resources/version_summary.json @@ -175,7 +175,7 @@ { "version": "v_3.5.0_190713", "title": "新增性能模式", - "log": "● feature:新增性能模式(目前仅支持微信模板消息)\n● feature:e-mail消息支持抄送\n● feature:企业号消息新增支持……\n● fix:修复NICK_NAME变量失效的bug\n" + "log": "● feature:新增性能模式(目前仅支持微信模板消息)\n● feature:计划任务增加可以按Cron表达式触发\n● feature:e-mail消息支持抄送\n● feature:企业微信消息新增对文本卡片类型的支持\n● feature:企业微信消息新增对markdown类型的支持\n● optimization:优化平滑升级时sql执行的幂等\n● bug fix:修复普通计划任务保存时误提示最近5次运行时间的问题\n● fix:修复推送总进度条状态异常问题\n● 其他细节调整\n" } ] } \ No newline at end of file From f2f4ef26dc253acfdd594f8fcbd9f79a923fe644 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sun, 14 Jul 2019 13:47:05 +0800 Subject: [PATCH 17/20] =?UTF-8?q?optimization:=E4=BF=AE=E6=94=B9=E5=8F=91?= =?UTF-8?q?=E9=80=81=E7=BB=93=E6=9E=9C=E6=8A=A5=E5=91=8A=E9=82=AE=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E4=BA=8C=E7=BB=B4=E7=A0=81=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fangxuele/tool/push/logic/PushControl.java | 3 ++- .../com/fangxuele/tool/push/ui/UiConsts.java | 5 +++++ .../resources/icon/introduce-wepush-qrcode.png | Bin 0 -> 4325 bytes 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/icon/introduce-wepush-qrcode.png diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java index 03232129..57af3c8d 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushControl.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushControl.java @@ -19,6 +19,7 @@ import com.fangxuele.tool.push.logic.msgsender.MailMsgSender; import com.fangxuele.tool.push.logic.msgsender.MsgSenderFactory; import com.fangxuele.tool.push.logic.msgsender.SendResult; +import com.fangxuele.tool.push.ui.UiConsts; import com.fangxuele.tool.push.ui.form.MainWindow; import com.fangxuele.tool.push.ui.form.MessageEditForm; import com.fangxuele.tool.push.ui.form.PushForm; @@ -332,7 +333,7 @@ static void savePushData() throws IOException { contentBuilder.append("
"); contentBuilder.append("
"); contentBuilder.append("

来自WePush,一款专注于批量推送的小而美的工具

"); - contentBuilder.append("\"WePush\""); + contentBuilder.append("\"WePush\""); File[] files = new File[fileList.size()]; fileList.toArray(files); diff --git a/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java b/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java index a26cde5c..a8986c25 100644 --- a/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java +++ b/src/main/java/com/fangxuele/tool/push/ui/UiConsts.java @@ -69,4 +69,9 @@ public class UiConsts { */ public final static String QR_CODE_URL = "http://download.zhoubochina.com/file/wepush_qrcode.json"; + /** + * 介绍二维码URL + */ + public final static String INTRODUCE_QRCODE_URL = "http://download.zhoubochina.com/qrcode/introduce-wepush-qrcode.png"; + } diff --git a/src/main/resources/icon/introduce-wepush-qrcode.png b/src/main/resources/icon/introduce-wepush-qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..54e221c30919ffeecbd3c17ff82ee8601be57a16 GIT binary patch literal 4325 zcmX|_cRZWj+rYJyTCJk0X8WjFrIc7Py3|fzvDbT z^~oKuol2d~_!vIAM^iJ*w@h8oIp5X4OG8ti%zOksM_n_*v@CpRXfB}t9cM6}=(^dE!-sDqOonr!Kahc(tu#rWD_fjfGy=?E#-UVWFzRd;LJ zepMcfza0V$?C(r+S2fxYot{R5H_iR0TQ0y7=w?JJI9ICDBcX0}`FtPrd2M{GtS0-# z9$1+{hl!G>LhyV|fKsLwI6&7W z&}CtZTgmyR2PjEV}%mEw}`hjJ3XrAm6IyCGG$_-AK2)=E#SWmcfshPJ;2bo~t?uC0q8*}$X6OCnx8DxD@$H_-M6jy994`-$)C{5S`cM&B_CqS@9ElFjGOAXELGx4dyX|OUkdtX&5Igl5ds=7L!@sNgmi3psq@ZV zLJxjVnqREwB^aLhV8>DrHHydg?%K`1!X*>%y?|m#eW3lHO@DOxWtBzh&0Yl3m4s~n zzN7+WR_wT$r`Btuy!JW}cyTBu>cvJjWI0v}FY5+zAHVCWuj%V40b^l)d@D}VAT-+r zW!)^}((qIME-!*0XAWurUmof&UndyF{mI&MmPO?Ad-N5Bx}Zv!iMxJxpf{-Jxccm* zNXy_c%gSItMhd0h11v4$a~LG<-tgEyCbRgiK5Q?HmDocJA=) zQI7$@P48hATTfX(1OO^vX~pq3s6gMvY|h(8>>?BS=_2!)so=&N(6yH6HTN;U)!bY0 zF8&{3{{!~bYz;s>sFKaR%Wb#iN(vpp<#6pfR<}WV^hfQqLQzHtUc89h`Q}Lm`iFN$ z1q;_sst4pQFB+QQ6w29{*Tt#1QkMD^RG9iT*2SGztdIULIz-3-WFx{d%7^cu9Q8Sj z&+0znO3|8;4l0;CxB#!#+vdl;jnnRgHI#+PYROP$W2^{EiDK(3HX38jX zBr#AcT@+mH{?CMZSvtoQ)@bmh|G{$E(358YZ}-;RIQ;KAXn%AO*W|ToP@ig)ck`x< z?sgL1X1r&&nFxo3aVxlO0^(S15pkx}{P9{f>u2`GUy-(GbQw)kKiPu}_C_;j9g!z& zeLs&mb5e!?#V*w;6^kviAvce0glewOZvdL#&!15$`S?_RNO@vJM|3TOG? z-?je(5i69W_>V`|@vfV>Q_dId4+;VoCv*YG3Y{PTEyRi+%_P!Go3@`inPmrz&oi@y z%M)MB!skf^p*6K~kcp=+SnoJ}IqzPBa)Os6_!?+faa0Ly^SBQQC&7XmnnzC#|luENbJNHXF$Dqm^+{wUgE&t6P2K2DX2A|-nzQQzT zlG2aty7?I1U4f7Thxd0D)sVI!`;M(knO42jEg#!1OFhJBxb%F#0cJ~UO?((5@vNb6 z>JcKt%qBn>_p>WXzMN(#hq(i=Yw$8_F9<0>HPQRE{ zwf38GoPTX(z-Z;!;rmT@AX=B1S?y>Oy*UX<9^YuwcIKxYX8`1&Km!=TP`-5(DIYc@ zKk<>t@xxj(Gbuml*=zn6L>aw2ko$VboUxm0Q8PQ_k~oqWLc?%3sT# z9PMBgvzEV>O_-g~PUxyTq`5##8pU-#dySB|WfivX*QpunwHjB-*Y_w$@kf$`@2mN* zHBEdEIje;U3u((dIo`quqT2&@dKZ$_1$JkGHelUn7@{~pK$(17Ao-io=pffEOHSW6 zSvG;HF;*{Bj`j|!Rn()EC? zzAI<|!Gl9^n|gk}Qhfv$jvDs1Cc$FHRn?l#gI_QzhS3{cr)tXdyEiZbK^|BX8>8C( zV)|a2J10NwGL6EFvBp884pQuwRKU7keyg=cyTu&B%AUxL@FZ8lKt-~ska((P)U(5uE68#9! zQSB79u~MJ;-sr8_8tQ4ogx(S*!*>$_crgzuB{CV;pzX)I1lkBz@!^|uY|CGpahC4n zgJUX!TWv&tzv#}&Vq<}D!;gRpL5HJ_c(0jDM0~yQ_%E(=*?Fy+jPEkvVc|2Tr(PMyBJY{EMEDYDbQi5a@BJZJG zv6?lIErJPSMU!TO=Q#zy7wuFgwY|B>gK0YFTrbU|#?X^}(tM)A%*zN>T0>BrK49vG zK*2^mMqqS)22Ppw?+mXLMPlAK=U=@zz#UM4$Jf`iw~Pf^kTnP-9Lo6Y*cL$g6PK08 zC51F<`kp3m!gAA$JWxxS^NZ=A3sksVC*5m13OT?V;S0~(4gAcW`i|F4IU)Kco))Di zg?k!qiKi9Z@X*mMxVEah3CV51s;OA}&qsq}`TfpIw{PC7)>v;{NZLF(+?dEY4QG`w zG`_Oz!y;+Pev6_#c0X(YPS;}5GYQNpy{4>@J+=pXIqgTdbyB?X`zt89YcgU0BT z@#+ujZ8Ck<-h;whUua`3HKd-MU8d)qsu|P9&}cD#SbeX1{OtP~A>}#Z*;p&BOM4Xp z-Jla#O*qpz%y-7$sRfeO=-Tci>Xq=Wpl#`mX{cEQh$kxn7sB#MLJFzqD_<||dll$l zEVj3FdG~@9w8?}B`^R!_5(tlc#bF>qVq?j@cgW66aXj|R$P9gJEAFVJs%dqxS_m7B z$;=LAscw?N^&s@pQjZ%^VYOW+$^y=ilSll%#tA%%T$mn{N}b!yU?GVJ6 z6a_a^3iaF*x#k9e;X+KhFFGMvY7=cvfGvA9rkS?xt(BN6qIuTbm4MA(-IyDO@ zFZIMFHTz9^+}Tft#k7*wBrY8p@}(}$MP5vrEtvx`!-7MO$rBi##5_NI1?9G+TpsrQ zCngd%V=yILoqy5?s|vZHbnvrip@5t3`N-Y+Z_uDZi%PCcg>S~a;8=79r{*pM{1yW+ z2kDxG`Ck9b1RJyFnMb)%MEaNr3`$lhBI1G3lffr~-QxZA3YM17Kgo=t_tkfTc{tSf z57jaJ3VrFIwcnSRA6wEz8D7XL0i`ykGWRe(L+AS20J&C6_-coqG=%SO`{UcW^^-GO zJ(Jj#NNGb}Ktwo)k)ozi!8ONL9;cagJBd4V-$nm)adq(KFW#PyKE8W%mS& z-Oluy-OJRqX7{Ry+J1T1RATI{eQ4<_LVA+ZaCvh5=J87r%243XtnLHvL4x0j@L{S1 z#i2s^x;Qz?b*x|Z!lYWi6nNY{$Wt=s_{oSvQUXq7%lP{r^-+qEbgXOhBGM~iU+HBAri94z2ViMc1O#g>zS-*&q-hXD^7YRL_+ z8f%+e{r|d9|2nsc@h6?jIJd-k^TT(@3V{cax_95yqVyv%hC6LxhpxSIGu1oxssWw? zR0~+=HpnzRy&Ba#Ao~j4!F3>CoG2F~dFxTQsoQpk{8cL}4g(Gkqv89ySMhC`IH|K3 zt+_SD=n9dv@v9;~F)mQy#mNL5j;mQTx_(%9MwF7;t92+jR!Vgr-7WRp!n{WLciSHi zOqMcFS>@TDS%B=J=oPP0_BcISuG`XD5hQ7X&dT_W3>WudmRu*a47)#~I0pvz^{&%r z#ijS!*--TeJ5|Y04K>WR4r13tWO3d^b!y|kSA6_eNgQNUG?lOOiY!P4$XDK;Mlh8B zV-KpXV?9sM;DwBT9XY6n>sQZBnI8uHZM-$NUkF1-bVM1;M5Ra?;vPju_Qf+|hBoQ1 zQ@h(+3&=AgA_SiS2z@}o4<$1cl7VWWEZ@vT=K%VRAuPXJk;uk(gOdrXX1$dR<{&0W z-ksmv$p3G@-|H!BUfyPVq~8lu67i{${Hg<3oU~Mb1_@`4A!ydOjCM}~1+Z6Oh?u`N z(s$HVQWvAKhEV6Je1fX%@o_-lfr}j$8$sDa>_m~z+KFQwgJT(M?ojq-_5YcOwnQX( ze6RY4iWL!JIj*zF17QQnUCIE5*z77a`r3N zHt!PB8VJS?IsbX4WK-A8(YY}e^Fxc&U3nd0A+ez<6?G}mW|q! aW|(#;3mSBkq5hhn(SB&~pyr-k#Qy<4#h`Bh literal 0 HcmV?d00001 From a70faca09d300a62173f4deed6f34adfc65beec0 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sun, 14 Jul 2019 14:28:28 +0800 Subject: [PATCH 18/20] =?UTF-8?q?feature:=E6=80=A7=E8=83=BD=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=20=E5=81=9C=E6=AD=A2=E5=8A=9F=E8=83=BD=20=E7=AC=AC?= =?UTF-8?q?=E4=B8=80=E9=98=B6=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fangxuele/tool/push/logic/BoostPushRunThread.java | 3 ++- src/main/java/com/fangxuele/tool/push/logic/PushData.java | 5 +++++ .../tool/push/logic/msgthread/BaseMsgThread.java | 2 +- .../tool/push/logic/msgthread/MsgAsyncSendThread.java | 8 +++++--- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java index 02503df5..eb7eb2cc 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java @@ -74,6 +74,7 @@ private void preparePushRun() { // 拷贝准备的目标用户 PushData.toSendList.addAll(PushData.allUser); + PushData.toSendCount = PushData.allUser.size(); // 总记录数 PushData.totalRecords = PushData.toSendList.size(); @@ -110,7 +111,7 @@ private void timeMonitor() { long startTimeMillis = System.currentTimeMillis(); // 计时 while (true) { - if (PushData.totalRecords == PushData.successRecords.longValue() + PushData.failRecords.longValue()) { + if (PushData.toSendCount <= PushData.successRecords.longValue() + PushData.failRecords.longValue()) { if (!PushData.fixRateScheduling) { BoostForm.boostForm.getStopButton().setEnabled(false); BoostForm.boostForm.getStopButton().updateUI(); diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushData.java b/src/main/java/com/fangxuele/tool/push/logic/PushData.java index 77600c78..e024b112 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/PushData.java +++ b/src/main/java/com/fangxuele/tool/push/logic/PushData.java @@ -46,6 +46,11 @@ public class PushData { */ public static List toSendList; + /** + * 准备发送的数量 + */ + public static volatile int toSendCount; + /** * 发送成功的列表 */ diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgthread/BaseMsgThread.java b/src/main/java/com/fangxuele/tool/push/logic/msgthread/BaseMsgThread.java index 8ce30ce1..87c443f8 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgthread/BaseMsgThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgthread/BaseMsgThread.java @@ -88,7 +88,7 @@ public void run() { */ public void initCurrentThread() { ConsoleUtil.consoleWithLog("线程" + this.getName() + "负责处理第:" + startIndex + "-" + - endIndex + "条的数据"); + endIndex + "条数据"); list = PushData.toSendList.subList(startIndex, endIndex); diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java b/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java index fc951658..4e6f1a35 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java @@ -2,7 +2,6 @@ import com.fangxuele.tool.push.logic.PushData; import com.fangxuele.tool.push.logic.msgsender.IMsgSender; -import com.fangxuele.tool.push.logic.msgsender.SendResult; import com.fangxuele.tool.push.ui.form.BoostForm; /** @@ -25,10 +24,13 @@ public MsgAsyncSendThread(IMsgSender msgSender) { public void run() { for (int i = 0; i < PushData.toSendList.size(); i++) { - + if (!PushData.running) { + PushData.toSendCount = i; + return; + } // 本条消息所需的数据 String[] msgData = PushData.toSendList.get(i); - SendResult sendResult = iMsgSender.asyncSend(msgData); + iMsgSender.asyncSend(msgData); // 已处理+1 PushData.increaseProcessed(); BoostForm.boostForm.getProcessedCountLabel().setText(String.valueOf(PushData.processedRecords)); From 4a5f83932421e5f2ea5791711bf0aebd839e5695 Mon Sep 17 00:00:00 2001 From: duoduo Date: Sun, 14 Jul 2019 14:45:15 +0800 Subject: [PATCH 19/20] =?UTF-8?q?feature:=E6=80=A7=E8=83=BD=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=20=E5=81=9C=E6=AD=A2=E5=8A=9F=E8=83=BD=20=E5=AE=8C?= =?UTF-8?q?=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fangxuele/tool/push/logic/BoostPushRunThread.java | 10 ++++++++-- .../java/com/fangxuele/tool/push/logic/PushData.java | 3 ++- .../push/logic/msgsender/WxMpTemplateMsgSender.java | 8 +++----- .../tool/push/logic/msgthread/MsgAsyncSendThread.java | 2 +- .../fangxuele/tool/push/ui/listener/BoostListener.java | 5 +++++ 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java index eb7eb2cc..55acdd71 100644 --- a/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java +++ b/src/main/java/com/fangxuele/tool/push/logic/BoostPushRunThread.java @@ -14,11 +14,15 @@ import com.fangxuele.tool.push.logic.msgthread.MsgAsyncSendThread; import com.fangxuele.tool.push.ui.form.BoostForm; import com.fangxuele.tool.push.util.ConsoleUtil; +import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.http.HttpResponse; import javax.swing.*; import java.io.IOException; import java.util.Date; +import java.util.List; +import java.util.concurrent.Future; /** *
@@ -32,6 +36,8 @@ public class BoostPushRunThread extends Thread {
 
     private static final Log logger = LogFactory.get();
 
+    public static List> futureList = Lists.newArrayList();
+
     @Override
     public void run() {
         BoostForm.boostForm.getProcessedProgressBar().setIndeterminate(true);
@@ -74,7 +80,7 @@ private void preparePushRun() {
 
         // 拷贝准备的目标用户
         PushData.toSendList.addAll(PushData.allUser);
-        PushData.toSendCount = PushData.allUser.size();
+        PushData.toSendCount.set(PushData.allUser.size());
         // 总记录数
         PushData.totalRecords = PushData.toSendList.size();
 
@@ -111,7 +117,7 @@ private void timeMonitor() {
         long startTimeMillis = System.currentTimeMillis();
         // 计时
         while (true) {
-            if (PushData.toSendCount <= PushData.successRecords.longValue() + PushData.failRecords.longValue()) {
+            if (PushData.toSendCount.get() <= PushData.successRecords.longValue() + PushData.failRecords.longValue()) {
                 if (!PushData.fixRateScheduling) {
                     BoostForm.boostForm.getStopButton().setEnabled(false);
                     BoostForm.boostForm.getStopButton().updateUI();
diff --git a/src/main/java/com/fangxuele/tool/push/logic/PushData.java b/src/main/java/com/fangxuele/tool/push/logic/PushData.java
index e024b112..75000343 100644
--- a/src/main/java/com/fangxuele/tool/push/logic/PushData.java
+++ b/src/main/java/com/fangxuele/tool/push/logic/PushData.java
@@ -4,6 +4,7 @@
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.LongAdder;
 
 /**
@@ -49,7 +50,7 @@ public class PushData {
     /**
      * 准备发送的数量
      */
-    public static volatile int toSendCount;
+    public static final AtomicInteger toSendCount = new AtomicInteger();
 
     /**
      * 发送成功的列表
diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java
index 09d2eec1..44c6efdb 100644
--- a/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java
+++ b/src/main/java/com/fangxuele/tool/push/logic/msgsender/WxMpTemplateMsgSender.java
@@ -2,6 +2,7 @@
 
 import cn.hutool.json.JSONUtil;
 import com.fangxuele.tool.push.App;
+import com.fangxuele.tool.push.logic.BoostPushRunThread;
 import com.fangxuele.tool.push.logic.PushControl;
 import com.fangxuele.tool.push.logic.PushData;
 import com.fangxuele.tool.push.logic.msgmaker.WxMpTemplateMsgMaker;
@@ -106,10 +107,7 @@ public SendResult asyncSend(String[] msgData) {
                     httpPost.setConfig(config);
                 }
                 Future httpResponseFuture = getCloseableHttpAsyncClient().execute(httpPost, new CallBack(msgData));
-                if (!PushData.running) {
-                    // TODO
-                    httpResponseFuture.cancel(true);
-                }
+                BoostPushRunThread.futureList.add(httpResponseFuture);
             }
         } catch (Exception e) {
             // 总发送失败+1
@@ -301,7 +299,7 @@ public void failed(Exception e) {
 
         @Override
         public void cancelled() {
-
+            PushData.toSendCount.getAndDecrement();
         }
     }
 }
diff --git a/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java b/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java
index 4e6f1a35..a3dd0041 100644
--- a/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java
+++ b/src/main/java/com/fangxuele/tool/push/logic/msgthread/MsgAsyncSendThread.java
@@ -25,7 +25,7 @@ public void run() {
 
         for (int i = 0; i < PushData.toSendList.size(); i++) {
             if (!PushData.running) {
-                PushData.toSendCount = i;
+                PushData.toSendCount.set(i);
                 return;
             }
             // 本条消息所需的数据
diff --git a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java
index 22f8bdc4..d72fa674 100644
--- a/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java
+++ b/src/main/java/com/fangxuele/tool/push/ui/listener/BoostListener.java
@@ -25,6 +25,7 @@
 import org.apache.commons.compress.utils.Lists;
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.apache.commons.lang3.time.DateUtils;
+import org.apache.http.HttpResponse;
 
 import javax.swing.*;
 import java.awt.*;
@@ -33,6 +34,7 @@
 import java.util.Date;
 import java.util.List;
 import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
@@ -348,6 +350,9 @@ public void mouseExited(MouseEvent e) {
                         BoostForm.boostForm.getScheduledTaskLabel().setVisible(false);
                     }
                 }
+                for (Future httpResponseFuture : BoostPushRunThread.futureList) {
+                    httpResponseFuture.cancel(true);
+                }
             });
         });
     }

From 44a32f3a1b5c44343864f7dcb7e661bf583f66b1 Mon Sep 17 00:00:00 2001
From: duoduo 
Date: Sun, 14 Jul 2019 15:15:58 +0800
Subject: [PATCH 20/20] =?UTF-8?q?update:=E6=9B=B4=E6=96=B0=E4=B8=8B?=
 =?UTF-8?q?=E8=BD=BD=E5=9C=B0=E5=9D=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 download.md | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/download.md b/download.md
index 96b32fc2..e1d42d80 100644
--- a/download.md
+++ b/download.md
@@ -3,6 +3,8 @@
 
Windows +[WePush-v3.5.0_190713-x64-Setup.exe](http://download.zhoubochina.com/exe/WePush-v3.5.0_190713-x64-Setup.exe) +[WePush-with-jre-v3.5.0_190713-x64-Setup.exe](http://download.zhoubochina.com/exe/WePush-with-jre-v3.5.0_190713-x64-Setup.exe) [WePush-v3.4.2_190630-x64-Setup.exe](http://download.zhoubochina.com/exe/WePush-v3.4.2_190630-x64-Setup.exe) [WePush-with-jre-v3.4.2_190630-x64-Setup.exe](http://download.zhoubochina.com/exe/WePush-with-jre-v3.4.2_190630-x64-Setup.exe) [WePush-v3.4.1_190624-x64-Setup.exe](http://download.zhoubochina.com/exe/WePush-v3.4.1_190624-x64-Setup.exe) @@ -59,6 +61,7 @@
Mac OS +[v_3.5.0_190713.app](http://download.zhoubochina.com/mac/3.5.0.zip) [v_3.4.1_190624.app](http://download.zhoubochina.com/mac/3.4.1.zip) [v_3.4.2_190630.app](http://download.zhoubochina.com/mac/3.4.2.zip) [v_3.4.0_190619.app](http://download.zhoubochina.com/mac/3.4.0.zip) @@ -95,6 +98,7 @@
Linux +[v3.5.0_190713](http://download.zhoubochina.com/linux/WePush-3.5.0.zip) [v3.4.2_190630](http://download.zhoubochina.com/linux/WePush-3.4.2.zip) [v3.4.1_190624](http://download.zhoubochina.com/linux/WePush-3.4.1.zip) [v3.4.0_190619](http://download.zhoubochina.com/linux/WePush-3.4.0.zip)