SpringBoot多环境+docker集成企业微信会话存档sdk

news2024/11/16 16:03:19

SpringBoot多环境+docker集成企业微信会话存档sdk

文章来自于 https://developer.work.weixin.qq.com/community/article/detail?content_id=16529801754907176021

SpringBoot多环境+docker集成企业微信会话存档sdk

对于现在基本流行的springboot环境,官方文档真是比较坑的,基本都要自己摸索。

以下代码大家根据自己项目调整,无需生搬硬套,代码不重要,主要了解到其中的思路和坑点。

一. 主要目录结构
hell
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │   ├─ft
│ │ │   │ └─qb
│ │ │   │   └─job
│ │ │   │     └─biz
│ │ │   │       └─employee
│ │ │   │        └─qywx
│ │ │   │          └─QywxMessageWinJob.java		# 业务主入口,定时任务执行入口
│ │ │   └─tencent
│ │ │     └─wework
│ │ │       └─Finance.java								# 企业微信sdk中的Finance.java文件copy过来(切记,包名不能错)
│ │ └─resources
│ │   ├─config
│ │   └─lib
│ │     └─qywx
│ │       └─linux
│ │       	 └─libWeWorkFinanceSdk_Java.so				# 企业微信linux sdk中的同名文件
│ │       	 └─libWeWorkFinanceSdk.so				# copy自libWeWorkFinanceSdk_Java.so,改名
│ │       └─win
│ │       	 └─libcrypto-1_1-x64.dll				# 企业微信linux sdk中的同名文件
│ │       	 └─libcurl-x64.dll						# 企业微信linux sdk中的同名文件
│ │       	 └─libssl-1_1-x64.dll					# 企业微信linux sdk中的同名文件
│ │       	 └─WeWorkFinanceSdk.dll					# 企业微信linux sdk中的同名文件

注意:

  • Finance.java文件的包名千万不能错,一定要是com.tencent.wework。

- linux下的sdk中libWeWorkFinanceSdk_Java.so要改名为libWeWorkFinanceSdk.so,后面都是使用这个libWeWorkFinanceSdk.so。别TM问为什么,我也想知道为什么,腾讯的程序员不出来解释一下么?文档中没有提及,完全的大坑,我也是看了某个老兄的帖子才改的。

实际项目截图:

在这里插入图片描述

二. 改造Finance.java文件

因为sdk是分win和linux环境的,所以我们需要对Finance.java进行一些改造,使之可以判断win和linux环境,自动切换加载的dll或so文件。

修改static部分的代码:

ava
  static {
    if (isWindows()) {
      // win。获取4个dll的实际位置,下边使用System.load来加载dll。
      String path = System.getProperty("user.dir") + "\\src\\main\\resources\\lib\\qywx\\win\\";
      path = path.replaceAll("%20", " ").replaceFirst("/", "").replace("/", "\\\\");

      //加载顺序不能变
      System.load(path.concat("libcrypto-1_1-x64.dll"));
      System.load(path.concat("libssl-1_1-x64.dll"));
      System.load(path.concat("libcurl-x64.dll"));
      System.load(path.concat("WeWorkFinanceSdk.dll"));

    } else {
      // linux。加载指定so文件在linux系统下的位置。
      // docker的话这行也可以不要。这里有点小坑,后文会讲。
      System.load("/usr/lib/libWeWorkFinanceSdk.so");

    }
     
    //这行是本身Finance.java就有的,别丢掉。
    System.loadLibrary("WeWorkFinanceSdk");
  }

  public static boolean isWindows() {
    String osName = System.getProperties().getProperty("os.name");
    return osName.toUpperCase().indexOf("WINDOWS") != -1;
  }

自建一个isWindows()方法来判断当前的运行环境。然后在static中根据环境加载不同的dll和so就可以了。

三、win & linux

在win或linux运行,看一下主程序调用入口文件QywxMessageWinJob.java。

package com.ft.qb.job.biz.employee.job;

import com.tencent.wework.Finance;

import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.lang.reflect.Field;

/**
 * 用于调用企业微信接口,获取会话存到内容,持久化到数据库
 */
@Component
@Slf4j
public class QywxMessageWinJob {

  @Value("${project.qywx.session-message.corpid}")
  private String corpid;
  @Value("${project.qywx.session-message.secret}")
  private String secret;


  @XxlJob("QywxMessageJob_syncMessage")
  public void syncMessage() {

    try {
      long ret = 0;

      //使用sdk前需要初始化,初始化成功后的sdk可以一直使用。
      //如需并发调用sdk,建议每个线程持有一个sdk实例。
      //初始化时请填入自己企业的corpid与secrectkey。
      long sdk = Finance.NewSdk();

      ret = Finance.Init(sdk, this.corpid, this.secret);


    }catch(Exception e){
      log.error("企业微信会话sdk初始化失败:", e);
      throw e;
    }

    log.info("sdk加载成功了,继续!!!");
  }

}

只要上一步Finance.java别改错,基本上就run通了。

四、docker

docker环境比较特殊。

  1. 一定要注意不要使用alpine版本的java镜像做基础镜像,会丢失一些基础的so文件,导致sdk加载失败。
 基础镜像

 FROM openjdk:17-jdk-alpine

比如我一开始是openjdk:17-jdk-alpine镜像,当Finance.java执行到System.loadLibrary(“WeWorkFinanceSdk”)的时候,会报错找不到ld-linux-x86-64.so.2

java.lang.UnsatisfiedLinkError: /usr/lib/libWeWorkFinanceSdk.so: Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /usr/lib/libWeWorkFinanceSdk.so)
  1. 将libWeWorkFinanceSdk.so放入docker镜像中。在DockerFile中加一行copy libWeWorkFinanceSdk_Java.so
# 基础镜像

 FROM openjdk:17-jdk

 

# copy libWeWorkFinanceSdk_Java.so

COPY src/main/resources/lib/qywx/linux/libWeWorkFinanceSdk.so /usr/lib/libWeWorkFinanceSdk.so

 

 ADD target/app.jar app.jar

 

# 更改为中国时区

 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

 RUN echo 'Asia/Shanghai' >/etc/timezone

 

# 启动容器时执行

 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Ddruid.mysql.usePingMethod=false","-jar","app.jar"]

# 使用端口80

 EXPOSE 29202 29203

这里如果加了这行copy,因为jdk容器中,/usr/lib属于java的运行时目录,所以Finance.java文件中的 System.load(“/usr/lib/libWeWorkFinanceSdk.so”); 这行加不加是无所谓的。

下边执行的System.loadLibrary(“WeWorkFinanceSdk”);会自动在/usr/lib目录中加载到WeWorkFinanceSdk的。

如上,根据自己的项目改改,基本都是可以run通的。

使用端口80

EXPOSE 29202 29203



 这里如果加了这行copy,因为jdk容器中,/usr/lib属于java的运行时目录,所以**Finance.java**文件中的**System.load("/usr/lib/libWeWorkFinanceSdk.so");**这行加不加是无所谓的。

 

 下边执行的**System.loadLibrary("WeWorkFinanceSdk");**会自动在/usr/lib目录中加载到**WeWorkFinanceSdk**的。



如上,根据自己的项目改改,基本都是可以run通的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2241599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DAY64||dijkstra(堆优化版)精讲 ||Bellman_ford 算法精讲

dijkstra(堆优化版)精讲 题目如上题47. 参加科学大会(第六期模拟笔试) 邻接表 本题使用邻接表解决问题。 邻接表的优点: 对于稀疏图的存储,只需要存储边,空间利用率高遍历节点链接情况相对容…

在openi平台 基于华为顶级深度计算平台 openmind 动手实践

大家可能一直疑问,到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列(蛋白质、有机物、rna、dna、mrna)的多模态…

Figma汉化:提升设计效率,降低沟通成本

在UI设计领域,Figma因其强大的功能而广受欢迎,但全英文界面对于国内设计师来说是一个不小的挑战。幸运的是,通过Figma汉化插件,我们可以克服语言障碍。以下是两种获取和安装Figma汉化插件的方法,旨在帮助国内的UI设计师…

深度学习-卷积神经网络CNN

案例-图像分类 网络结构: 卷积BN激活池化 数据集介绍 CIFAR-10数据集5万张训练图像、1万张测试图像、10个类别、每个类别有6k个图像,图像大小32323。下图列举了10个类,每一类随机展示了10张图片: 特征图计算 在卷积层和池化层结束后, 将特征…

关于adb shell登录开发板后terminal显示不完整

现象 今天有个同事跟我说,adb shell 登录开发板后,终端显示不完整,超出边界后就会出现奇怪的问题,比如字符覆盖显示等。如下图所示。 正常情况下应该如下图所示: 很明显,第一张图的显示区域只有完整区域…

【论文分享】三维景观格局如何影响城市居民的情绪

城市景观对居民情绪的影响是近些年来讨论的热门话题之一,现有的研究主要以遥感影像为数据来源,进行二维图像-数据分析,其量化结果精确度有限。本文引入了三维景观格局的研究模型,通过街景图片及网络发帖信息补充图像及数据来源&am…

ChatGPT学术专用版,一键润色纠错+中英互译+批量翻译PDF

ChatGPT academic项目是由中科院团队基于ChatGPT专属定制。论文润色、语法检查、中英互译、代码解释等可一键搞定,堪称科研神器。 功能介绍 我们以3.5版本为例,ChatGPT学术版总共分为五个区域:输入控制区、输出对话区、基础功能区、函数插件…

Go 语言已立足主流,编程语言排行榜24 年 11 月

Go语言概述 Go语言,简称Golang,是由Google的Robert Griesemer、Rob Pike和Ken Thompson在2007年设计,并于2009年11月正式宣布推出的静态类型、编译型开源编程语言。Go语言以其提高编程效率、软件构建速度和运行时性能的设计目标,…

一、HTML

一、基础概念 1、浏览器相关知识 这五个浏览器市场份额都非常大,且都有自己的内核。 什么是内核: 内核是浏览器的核心,用于处理浏览器所得到的各种资源。 例如,服务器发送图片、视频、音频的资源,浏览…

VRRP HSRP GLBP 三者区别

1. VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 标准协议:VRRP 是一种开放标准协议(RFC 5798),因此支持的厂商较多,通常用于多种网络设备中。主备模式:…

Elasticsearch:管理和排除 Elasticsearch 内存故障

作者:来自 Elastic Stef Nestor 随着 Elastic Cloud 提供可观察性、安全性和搜索等解决方案,我们将使用 Elastic Cloud 的用户范围从完整的运营团队扩大到包括数据工程师、安全团队和顾问。作为 Elastic 支持代表,我很乐意与各种各样的用户和…

Java集合(Collection+Map)

Java集合&#xff08;CollectionMap&#xff09; 为什么要使用集合&#xff1f;泛型 <>集合框架单列集合CollectionCollection遍历方式List&#xff1a;有序、可重复、有索引ArrayListLinkedListVector&#xff08;已经淘汰&#xff0c;不会再用&#xff09; Set&#xf…

大数据如何助力干部选拔的公正性

随着社会的发展和进步&#xff0c;干部选拔成为组织管理中至关重要的一环。传统的选拔方式可能存在主观性、不公平性以及效率低下等问题。大数据技术的应用&#xff0c;为干部选拔提供了更加全面、精准、客观的信息支持&#xff0c;显著提升选拔工作的科学性和公正性。以下是大…

EHOME视频平台EasyCVR多品牌摄像机视频平台监控视频编码H.265与Smart 265的区别?

在视频监控领域&#xff0c;技术的不断进步推动着行业向更高效、更智能的方向发展。特别是在编码技术方面&#xff0c;Smart 265作为一种新型的视频编码技术&#xff0c;相较于传统的H.265&#xff0c;有明显优势。这种技术的优势在EasyCVR视频监控汇聚管理平台中得到了充分的体…

Docker:查看镜像里的文件

目录 背景步骤1、下载所需要的docker镜像2、创建并运行临时容器3、停止并删除临时容器 背景 在开发过程中&#xff0c;为了更好的理解和开发程序&#xff0c;有时需要确认镜像里的文件是否符合预期&#xff0c;这时就需要查看镜像内容 步骤 1、下载所需要的docker镜像 可以使…

【Vitepress报错】Error: [vitepress] 8 dead link(s) found.

原因 VitePress 在编译时&#xff0c;发现 死链接(dead links) 会构建失败&#xff01;具体在哪我也找不到… 解决方案 如图第一行蓝色提示信息&#xff0c;设置 Vitepress 属性 ignoredeadlinks 为 true 可忽略报错。 .vuepress/config.js export default defineConfig(…

HTB:Squashed[WriteUP]

目录 连接至HTB服务器并启动靶机 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机开放端口进行脚本、服务扫描 使用浏览器访问靶机80端口页面 使用showmount列出靶机上的NFS共享 新建一个test用户 使用Kali自带的PHP_REVERSE_SHELL并复制到一号挂载点 尝试使用c…

数据分析-48-时间序列变点检测之在线实时数据的CPD

文章目录 1 时间序列结构1.1 变化点的定义1.2 结构变化的类型1.2.1 水平变化1.2.2 方差变化1.3 变点检测1.3.1 离线数据检测方法1.3.2 实时数据检测方法2 模拟数据2.1 模拟恒定方差数据2.2 模拟变化方差数据3 实时数据CPD3.1 SDAR学习算法3.2 Changefinder模块3.3 恒定方差CPD3…

ThriveX 博客管理系统前后端项目部署教程

前端 前端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署&#xff0c;两种方式部署都是一样的&#xff0c;我们以前端项目进行演示 首先我们先…

Seata源码笔记(三)

Seata源码笔记&#xff08;三&#xff09; RPC部分基础接口AbstractNettyRemotinginit方法send方法&#xff08;仅看sendSync&#xff09;sendSync中的钩子 AbstractNettyRemotingClient 基于incubator-seata-2.x RPC部分 基础接口 AbstractNettyRemoting init方法 主要设置…