MENU

国产化服务端(SpringBoot)适配注意事项

November 12, 2020 • 技术分享

摘要

本文通过实际的实践经验,总结出了服务端 SpringBoot 国产化适配的注意事项。

中间件清单

  • 金蝶AAS(代替Tomcat)V9.0
  • 达梦DM8(代替MySQL)V8.1.1.126

金蝶AAS适配

WebSocket的处理

  1. 对原有 Socket 进行改造,首先是 WebSocketConfig.java

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    
        /**
        * 配置 WebSocket 进入点,及开启使用 SockJS,这些配置主要用配置连接端点,用于 WebSocket 连接
        *
        * @param registry STOMP 端点
        */
        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {
            registry.addEndpoint("/ws")
                    .setAllowedOrigins("*")
                    .withSockJS();
        }
    
        /**
        * 配置消息代理选项
        *
        * @param registry 消息代理注册配置
        */
        @Override
        public void configureMessageBroker(MessageBrokerRegistry registry) {
            // 设置一个或者多个代理前缀,在 Controller 类中的方法里面发生的消息,会首先转发到代理从而发送到对应广播或者队列中。
            registry.enableSimpleBroker("/topic");
            // 配置客户端发送请求消息的一个或多个前缀,该前缀会筛选消息目标转发到 Controller 类中注解对应的方法里
            registry.setApplicationDestinationPrefixes("/im");
        }
    
    }
  2. 查找全项目中包含注解 @ServerEndpoint 的代码,进行注释。
  3. 新建一个 Controller 进行实际收发 WebSocket 的消息处理。

    @Controller
    @Slf4j
    public class MessageController {
    
        private static final String PDF = "01";
    
        private static final String OFD = "02";
    
        @Autowired
        private ConvertServiceImpl convertService;
    
        @Autowired
        private UnionConvertService unionConvertService;
    
        /**
        * 消息发送工具对象
        */
        @Autowired
        private SimpMessageSendingOperations simpMessageSendingOperations;
    
        /**
        * 广播发送消息,将消息发送到指定的目标地址 普通发文转版
        */
        @MessageMapping("/doc")
        @AuthIgnore
        public void sendTopicMessageToDoc(MessageBody messageBody) {
            // 将消息发送到 WebSocket 配置类中配置的代理中(/topic)进行消息转发
            Long fileId = messageBody.getFileId();
            String fileType = messageBody.getFileType();
    
            if (PDF.equals(fileType)) {
                ResponseDocFileInfoDTO responseDocFileInfo = convertService.convertToPdf(null, fileId);
                messageBody.setContent(JSONUtil.toJsonStr(responseDocFileInfo));
            }
            if (OFD.equals(fileType)) {
                ResponseDocFileInfoDTO responseDocFileInfo = convertService.convertToOfd(null, fileId);
                messageBody.setContent(JSONUtil.toJsonStr(responseDocFileInfo));
            }
            simpMessageSendingOperations.convertAndSend(messageBody.getDestination(), messageBody);
        }
    
    }
  4. 整体的改造完成就可以正常使用 WebSocket 了。

金蝶AAS配置的修改

金蝶AAS默认是将 DELETE,PUT,TRACE,OPTIONS 这四个请求方式禁用了。

如果项目中暴露了使用这些方法的接口,那么触发请求时都会出现 net::ERR_EMPTY_RESPONSE

我们需要找到 AAS目录/domains/mydomain/config/vm.options 此文件。对其 32 行代码进行修改。

下面贴出部分代码:

#
# This is the default sytem configurations . You can modify any server side
# configurations in this file.
#

#io types:nio,bio,nb.
#nio:non block io,bio:blocking io,nb:use non block io api,release thread on keep alive wait,but block read and write
apusic.web.io.type=nio

#listen to file modification to reload application
apusic.web.listener.reload=true

#We have to send multi request (initialized/destroyed) event,
#to support cdi injection in async servlet listener (onXXX event), dispatch, or start(Runnable) method invoke
apusic.async.servlet.multi.request.event=true

com.apusic.invocation.InheritContext=false

#############################
#classloader options 
#############################
apusic.prefer.war.classes=true
apusic.prefer.war.classes.include=
apusic.prefer.war.classes.exclude=java.,javax.,org.w3c.,org.xml.,com.sun.faces., \
org.hibernate.transaction.TransactionManagerLookup, \
org.hibernate.service.jta.platform.spi.JtaPlatform, \
org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform

#############################
#security options
#############################
#apusic.http.disabledMethods=DELETE,PUT,TRACE,OPTIONS
apusic.http.status.forbiddenToNotFound=true
com.apusic.ciphersuite.exclude=SSL_DHE_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_RSA_WITH_DES_CBC_SHA,SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_RSA_WITH_RC4_128_MD5,SSL_RSA_WITH_RC4_128_SHA

我的第 32 行是直接注释掉此配置,如果需要保留或者新增;直接改动内容即可。

如我只想禁用 DELETE 方法:

#############################
#security options
#############################
apusic.http.disabledMethods=DELETE

如何找到项目生成的文件?

例如我们的项目提供了文件服务,代码中的保存位置为 file/mainBody,那么在 金蝶AAS 中对应的目录为 AAS目录/domains/mydomain/file/mainBody

达梦 DM8 适配

如何平滑迁移MySQL数据至DM8?

我们需要使用到 达梦 自带的 DTS 工具。

DTS.png

打开后界面如下

DTS界面.png

我们点击新建工程

DTS新建工程.png

工程名称可以随意,工程描述也是。

DTS新建工程1.png

新建后可以在左侧看到新建的工程。

DTS新建工程2.png

展开后右键迁移-新建迁移。

DTS新建迁移.png

迁移名称和描述也是随意;启用勾选了新建完就会打开此迁移。

DTS新建迁移1.png

达梦DTS迁移1.gif

我们这里务必确定 MySQL 是可用的;其次需要确保我们的账号密码没有错误。

注意:这里我们务必修改 指定驱动-使用自定义URLURL 中的 <databaseName>,以及修改URL后面的自定义参数,内容如下:

?characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true

达梦DTS指定URL.gif

这里演示一下迁移我们的数据到达梦的 SYSDBA 模式中去(其他模式同理)。

达梦DTS迁移SYSDBA.gif

在达梦的 Manager 看到对应的数据并确保没有中文乱码,完成!

Mybatis的代码处理

使用 SYSDBA 模式我们可以不需要这样写:

INSERT INTO "DOC_EXCHANGE"."BASE_RESOURCE" ("id", "gmt_create", "gmt_modified", "platform_id", "org_id", "is_master") VALUES  (#{item.id,jdbcType=BIGINT}, #{item.gmtCreate,jdbcType=TIMESTAMP}, #{item.gmtModified,jdbcType=TIMESTAMP}, #{item.platformId,jdbcType=INTEGER}, #{item.orgId,jdbcType=INTEGER}, #{item.isMaster,jdbcType=INTEGER})

如果使用了新建模式,例如模式名称为 "DOC_EXCHANGE" 那么就需要像上面一样。

注意事项
  1. 达梦不支持 ` 这样的语法,想要使用可以 "desc",但这样不兼容 MySQL
  2. 达梦如果设置了某个列为主键自增,那么 insert 语句就不能指定主键的内容
  3. 数据库连接务必设置IP(这样能避免防火墙和达梦数据库的隔离策略导致的很多问题)
  4. 语句务必指定表名称,如 SELECT FROM DOC_EXCHANGE.BASE_RESOURCE
  5. 模式与模式间的迁移最好使用 DTS 导出SQL文件然后使用 DTS 导入
ArchivesQR Code
QR Code for this page
Tipping QR Code