一 系统架构二 开发环境三 API接口服务四 AI业务处理服务五 任务处理请求信息发送和接收六 业务处理服务集成Celery任务调度

为什么要跨平台呢?

1,Java + Spring Boot开发Web服务是常用搭配,丰富的组件和易用的功能;

2,Python在AI领域是主流开发语言,实现业务处理更方便,不需要代码移植;

3,招聘工程师组建技术团队有针对性,发挥各自优势。

一,系统架构

ActiveMQ是一个非常流行的消息队列服务中间件,基于JMS(Java Message Service)规范。

Celery是一个灵活可靠的分布式系统,用于异步任务调度,系统通常将一些耗时的操作任务提交给Celery去异步执行,典型系统架构示意图如下:

python跨平台桌面应用开发 python跨平台吗?_java

本文基于Java + Spring Boot,Python + Django,集成ActiveMQ和Celery,搭建起一个跨平台异步任务调度系统。

API接口服务

├── controller│ └── CheckController.java├── mq│ └── MqService.java│ └── MqConsumer.java

AI业务处理服务

├── celery.py├── tasks.py├── mq│ └── mq_service.py│ └── mq_listener.py

二,开发环境

系统依赖ActiveMQ和Redis运行,手动安装配置稍显繁琐,可以使用Docker一键部署,下载资源编排脚本后运行docker-compose up -d

开发环境部署

├── docker-compose.yml├── up.sh

python跨平台桌面应用开发 python跨平台吗?_python跨平台桌面应用开发_02

三,API接口服务

Spring Boot集成ActiveMQ只需简单配置,开发步骤如下:

python跨平台桌面应用开发 python跨平台吗?_python跨平台桌面应用开发_03

1,在application.yml中配置ActiveMQ服务器信息

spring:activemq:broker-url:tcp://127.0.0.1:61616user:adminpassword:adminin-memory:falsepackages:trust-all:truepool:enabled:false

2,MqService封装了消息发送功能,注意Java环境下使用文本消息TextMessage,发送时将Map转换为JSON字符串,和Python环境下STOMP简单文本协议对应。

3,MqConsumer.java接收任务处理状态消息,使用的是发布订阅消息Topic

python跨平台桌面应用开发 python跨平台吗?_python跨平台原理_04

4,配置完成后,启动API服务,运行单元测试验证消息发送接收功能

python跨平台桌面应用开发 python跨平台吗?_API_05

5,API服务接收到的状态信息

python跨平台桌面应用开发 python跨平台吗?_API_06

四,AI业务处理服务

Python集成ActiveMQ使用stomp.py,基于STOMP协议(端口为61613),简单(流)文本消息,开发步骤如下:

python跨平台桌面应用开发 python跨平台吗?_python跨平台原理_07

1,将ActiveMQ服务器地址等信息配置在settings.py中,方便维护管理

MQ_URL = '127.0.0.1'MQ_PORT = 61613MQ_USER = 'admin'MQ_PASSWORD = 'admin'MQ_QUEUE = '/queue/starter.process'MQ_TOPIC = '/topic/starter.status'

2,为了增加代码的兼容和容错能力,封装辅助函数send_msg(), consume_msg(), get_conn(), close_conn(),详见代码文件mq_service.py

3,增加mq_listener.py,声明消息处理类,继承stomp.ConnectionListener,在on_message()函数中将消息字符串解析为JSON,注意STOMP协议只支持简单文本协议,所以此步转换是必须的。

4,根据接收到的消息内容创建一个异步任务

python跨平台桌面应用开发 python跨平台吗?_异步任务_08

5,封装一个Django Command,调用comsume_msg启动消息监听服务,代码在目录management/commands下的mq.py

python跨平台桌面应用开发 python跨平台吗?_java_09

6,运行命令python manage.py mq,看到消息提示,启动监听服务成功

python跨平台桌面应用开发 python跨平台吗?_异步任务_10

7,增加测试test_mq_service.py,发送消息

python跨平台桌面应用开发 python跨平台吗?_java_11

8,运行测试python manage.py test,看到消息发送和接收

python跨平台桌面应用开发 python跨平台吗?_java_12

五,任务处理请求信息发送和接收

现在API服务和AI业务处理服务已经能够发送和接收ActiveMQ消息,将它们连接起来:

1,API服务:REST接口处理客户端请求时,发送业务处理消息,使用点对点消息Queue, CheckController.java

python跨平台桌面应用开发 python跨平台吗?_API_13

2,业务处理服务:消息监听服务接收到请求消息,调用Celery创建一个异步任务,代码mq_listener.py,调用tasks.py中do_task()函数

python跨平台桌面应用开发 python跨平台吗?_python跨平台桌面应用开发_14

3,将异步任务创建功能封装为dispatch_task()函数

python跨平台桌面应用开发 python跨平台吗?_java_15

4,Celery异步任务处理时,发送状态信息到API服务,代码tasks.py,Celery的集成方法见下一章节。

5,API服务接收到信息,更新状态并通知客户端,代码MqConsumer.java

消息格式转换过程:

python跨平台桌面应用开发 python跨平台吗?_python跨平台原理_16

基本时序图如下:

python跨平台桌面应用开发 python跨平台吗?_python跨平台原理_17

六,AI业务处理服务集成Celery

Django集成Celery配置方法步骤如下:

python跨平台桌面应用开发 python跨平台吗?_python跨平台桌面应用开发_18

1. 增加celery.py,配置信息

python跨平台桌面应用开发 python跨平台吗?_API_19

2. 打开settings.py,配置BROKER和BACKEND地址

CELERY_BROKER = 'redis://127.0.0.1:6379/2'CELERY_BACKEND = 'redis://127.0.0.1:6379/3'

3. 打开__init__.py,增加代码

from __future__ import absolute_import, unicode_literalsfrom .celery import app as celery_app__all__ = ['celery_app']

4. 增加tasks.py,声明异步任务。任务处理过程中将调用mq_service发送状态信息到API服务,Topic类型的文本信息

python跨平台桌面应用开发 python跨平台吗?_异步任务_20

5. 正确配置后,运行命令启动celery worker异步任务处理服务:celery -A hello_celery worker -l info -P eventlet,注意Win10环境中需要增加eventlet,Celery成功启动信息:

python跨平台桌面应用开发 python跨平台吗?_python跨平台桌面应用开发_21

6. 增加单元测试test_task_util.py,创建一个任务

python跨平台桌面应用开发 python跨平台吗?_API_22

7. 运行python manage.py test,Celery服务将执行测试函数创建的任务

python跨平台桌面应用开发 python跨平台吗?_异步任务_23