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

server/2024/11/18 0:45:38/

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

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

dockersdk_7">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部分的代码:

avastatic {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_214">四、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.soCOPY src/main/resources/lib/qywx/linux/libWeWorkFinanceSdk.so /usr/lib/libWeWorkFinanceSdk.soADD target/app.jar app.jar# 更改为中国时区RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo 'Asia/Shanghai' >/etc/timezone# 启动容器时执行ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Ddruid.mysql.usePingMethod=false","-jar","app.jar"]# 使用端口80EXPOSE 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.ppmy.cn/server/142765.html

相关文章

uni-app快速入门(四)--maninfest.json及pages.json配置

一、manifest.jaon设置 manifest.json有很多配置项,见下图: 包括基础配置、App图标配置、App启动界面配置、App模块配置、App权限配置、App原生插件配置、App常用其他设置、Web配置、微信小程序配置等。微信小程序需要配置小程序的AppId,可以…

sql server 查看io资源使用

USE AdventureWorks2022; GO SET STATISTICS IO ON; GO SELECT * FROM Production.ProductCostHistory WHERE StandardCost < 500.00; GO SET STATISTICS IO OFF; GO 如果输出physical reads 或者 read-ahead reads 大于0 &#xff0c;则表示有物…

热点更新场景,OceanBase如何实现性能优化

案例背景 这个案例来自一个保险行业的客户&#xff1a;他们的核心系统底层采用了OceanBase数据库作为存储解决方案&#xff0c;然而&#xff0c;在系统上线运行后&#xff0c;出现了一个异常情况&#xff0c;执行简单的主键更新语句时SQL执行时间出现了显著的波动。为了迅速定…

vue elementui el-dropdown-item设置@click无效的解决方案

如图&#xff0c;直接在el-dropdown-item上面设置click&#xff0c;相应的method并没有被触发&#xff0c;查找资料发现需要在它的上级 el-dropdown 处使用 command 方法触发。 【template】 <el-dropdown placement"bottom-end" command"handleCommand&quo…

elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明

前言 在使用el-table 表格中有些表格的表头需要加入一些提示&#xff0c;鼠标移入则出现提示&#xff0c;非常实用&#xff0c;我是通过el-table中的el-tooltip实现的&#xff0c;以下的效果预览 代码实现 <el-table ref"multipleTable" :data"data"…

想租用显卡训练自己的网络?AutoDL保姆级使用教程(PyCharm版)

各位小伙伴们大家好~ 不知道各位同学在科研过程中是否有这样的苦恼 电脑无显卡。难不成我要用CPU跑实验吗&#xff1f;救救我吧电脑显卡算力太低。训练过程慢慢慢慢慢&#xff0c;等半天都出不来结果电脑显卡显存不够&#xff0c;batchsize稍微高一点点&#xff0c;就要爆显存…

(不看后悔系列二)python网络爬虫爬取网络视频

提示&#xff1a;接上篇文章 记录时间&#xff1a;2024-11-12&#xff0c;预计代码到2026年均有效。 先看演示视频 再看图片 文章目录 前言一、爬取思路1. 主要流程2. 代码实现思路 二、功能分析1. 视频网站分析&#xff0c;寻找m3u8文件2. playlist.m3u8视频清晰度3. 寻找秘钥…

【Java Web】Ajax 介绍及 jQuery 实现

文章目录 AJAX介绍XMLHttpRequestjQuery实现Ajax$.ajax()$().load()$.get()$.post() AJAX介绍 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种创建高效、动态网页应用的网页开发技术。它允许在不重新加载整个页面的情况下进行异步数据更新和交互&#xf…