java 钉钉机器人定时发送禅道bug以表格形式发送

        对于测试人员来说,有时候对线上问题的跟踪解决,缺乏一定意识,有时因禅道bug过多,导致没有重点根据线上问题。若通过钉钉机器人,设置定时任务发送,提醒相关人员按时处理禅道bug,就会让人关注重点。

实现步骤:通过java代码实现

1、找到对应消息接收群,设置钉钉机器人,拷贝关键信息Webhook地址

2、在java代码中编写代码实现发送钉钉机器人信息,以表格形式发送

3、在java代码中,连接收集禅道bug的数据库连接方式,并编写对应sql获取关键统计信息

4、在java代码中,编写定时器代码,触发钉钉机器人发送信息

5、将java代码打成jar包,放在服务器上,根据java代码中设置的定时器时间,进行触发任务

具体实现代码:

发送钉钉机器人代码

package Timer;
import org.json.JSONObject;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class SendMessageDing {
    private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    private static final String DB_URL = "jdbc:mysql://XXXX:ip/zentao";
    private static final String DB_USER = "root";
    private static final String DB_PASS = "123456";
    private static final String DINGTALK_WEBHOOK_URL = "你的机器人webhook地址";


//    public static void main(String[] args) {
        sendMessage();
//    }



    public static void sendMessage(){
//        SpringApplication.run(ZentaoSentMessageApplication.class, args);
        Connection conn = null;
        Statement stmt = null;
        try {
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
            stmt = conn.createStatement();

//            String sql = "SELECT b.id as ID,p.`name` as 产品名称, b.title as BUG标题, b.deadline as 截止时间, u1.realname as  指派给 "
//                    + "FROM zt_bug b JOIN zt_project p ON b.project = p.id "
//                    + "JOIN zt_user u1 ON b.assignedTo = u1.account "
//                    + "WHERE b.title LIKE '%线上问题%' AND b.status = 'active' AND b.deadline != '0000-00-00' AND b.deadline<NOW()";;

            String sql = "SELECT b.id as ID,p.`name` as 产品名称, b.title as BUG标题, b.deadline as 截止时间, u1.realname as  指派给 "
                    + "FROM zt_bug b JOIN zt_project p ON b.project = p.id "
                    + "JOIN zt_user u1 ON b.assignedTo = u1.account "
                    + "WHERE b.title LIKE '%线上问题%' AND b.status = 'active'";;

            ResultSet rs = stmt.executeQuery(sql);

            StringBuilder message = new StringBuilder();
            message.append("| 产品名称 | BUG标题  | 截止时间 |  指派给 |\n");
            message.append("| :-:       | :-:       | :-:       |:-:       |\n");

            boolean hasContent = false; // 是否有内容

            while (rs.next()) {
                int id = rs.getInt("ID");
                String productName = rs.getString("产品名称");
                String bugTitle = String.format("<a href=\"http://zentao.datac.com/zentao/bug-view-%d.html\">%s</a>", id, rs.getString("BUG标题"));
                String deadline = rs.getString("截止时间");
                String assignedTo = rs.getString("指派给");
                message.append("| " + productName + " | " + bugTitle +  " | " + deadline +  " | " + assignedTo + " |\n");
                hasContent = true;
            }

            if (hasContent) {
                JSONObject json = new JSONObject();
                json.put("msgtype", "markdown");
                JSONObject markdown = new JSONObject();
                markdown.put("title", "线上超时未解决问题列表");
                markdown.put("text", message.toString());
                json.put("markdown", markdown);
                post(DINGTALK_WEBHOOK_URL, json.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (stmt != null)
                    stmt.close();
            } catch (Exception e) {
            }
            try {
                if (conn != null)
                    conn.close();
            } catch (Exception e) {
            }
        }
    }


    private static void post(String url, String body) {
        try {
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
            con.setDoOutput(true);
            OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), StandardCharsets.UTF_8);
            writer.write(body);
            writer.flush();
            writer.close();
            int responseCode = con.getResponseCode();
            System.out.println("DingTalkBot: HTTP POST request to " + url + " returned " + responseCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

};

定时器代码,每天早上9点执行

package Timer;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class TimeScheduled {

    private static Timer timer;

    public static void main(String[] args) {
        setScheduledTask(9, 0, 0); // 设置每天早上9点执行任务
    }

    /**
     * 设置定时任务,每天在指定时间执行一次
     * @param hour 小时数(24小时制)
     * @param minute 分钟数
     * @param second 秒数
     */
    public static void setScheduledTask(int hour, int minute, int second) {
        Calendar currentTime = Calendar.getInstance();
        Calendar scheduledTime = (Calendar)currentTime.clone();
        scheduledTime.set(Calendar.HOUR_OF_DAY, hour);
        scheduledTime.set(Calendar.MINUTE, minute);
        scheduledTime.set(Calendar.SECOND, second);

        // 如果当前时间已经超过了设定的时间,则将任务执行时间加1天,避免立即执行
        if (scheduledTime.before(currentTime)) {
            scheduledTime.add(Calendar.DAY_OF_MONTH, 1);
        }

        long delayMillis = scheduledTime.getTimeInMillis() - currentTime.getTimeInMillis();

        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                // 在这里编写定时任务需要执行的操作,例如打印日志或发送邮件等。
                SendMessageDing sendMessageDing = new SendMessageDing();
                sendMessageDing.sendMessage();
                System.out.println("定时任务执行了!");
            }
        };

        timer = new Timer();
        timer.scheduleAtFixedRate(task, delayMillis, 24 * 60 * 60 * 1000);
        System.out.println("定时任务已启动,每天" + hour + ":" + minute + ":" + second + "执行一次。");
    }
}

pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.14</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>ZentaoSentMessage</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ZentaoSentMessage</name>
    <description>ZentaoSentMessage</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

将代码进行打包

打包完成后在target中查找jar包文件

打开需要放入jar的服务器地址,将jar包扔进去

修改配置文件docker-compose.yml【可手动增加该文件】

version: '3'
services:
  xxl-job:
    container_name: xxl-job
    restart: always
    image: java8:latest
    volumes:
    #jar文件目录
      - /root/TimerData/data:/data
    expose:
       - "9999"
    ports:
      - "8099:8099"
    command: [
          '/data/ZentaoSentMessage-0.0.1-SNAPSHOT.jar',
          '--server.port=8099'
        ]

 随后在服务器执行docker命令

docker-compose up -d 执行代码jar中的main方法

docker ps -a 查看进程信息
docker logs --tail 500 bec66e81fb44 查看日志信息

 然后观察到点是否触发任务

 若要关闭该定时任务,需要在服务器上执行docker命令

docker-compose down
docker stop bec66e81fb44
以上两种都是终止定时器任务

到此,通过钉钉机器人定时发送禅道bug消息,并且以表格的形式发送,就完成了~~~~

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用Java发送群消息可以通过调用开放平台的机器人API实现。 首先,需要创建一个机器人。在群里找到你想要发送消息的群,点击群设置,选择机器人管理,然后添加一个自定义机器人。选择自定义机器人之后,可以获得该机器人的Webhook地址,这个地址就是我们调用机器人API发送消息的接口。 接下来,在Java中,我们可以使用HTTP请求库,如HttpClient或OkHttp,来发送HTTP POST请求到该Webhook地址。 示例代码如下: ```java import okhttp3.*; import java.io.IOException; public class DingTalkRobot { public static void main(String[] args) { String webhook = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxx"; String content = "Hello, 机器人!"; // 消息内容 OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.parse("application/json"); // JSON格式的消息体 String jsonBody = "{\"msgtype\": \"text\", \"text\": {\"content\": \"" + content + "\"}}"; RequestBody body = RequestBody.create(jsonBody, mediaType); Request request = new Request.Builder() .url(webhook) .post(body) .build(); try { Response response = client.newCall(request).execute(); System.out.println(response.body().string()); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码通过构造JSON格式的消息体,包括消息类型和消息内容,然后将其POST到机器人的Webhook地址。在try-catch块中,通过调用`response.body().string()`方法可打印出机器人的响应结果。 注意,代码中的`webhook`需要替换成你自己创建的机器人的Webhook地址。而且,你可能需要引入OkHttp库或HttpClient库,这取决于你选择使用的HTTP请求库。 通过上述方式,就可以使用Java发送机器人的群消息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值