最近公司服务器做迁移,原R3 PRE需要迁到另外的地方,迁移后一段时间内,需要两套PRE环境同时运行,过一段时间后才将传输路线切换到新的PRE。在切换前,要求新PRE环境也要正常同步发布请求,但传输路线只有一条,这需要在发原PRE时,同时手工发布新PRE,这样每次手工很麻烦(手工导入传输请求过程参考这篇文章)。本文就是来通过程序实现这种手工全过程,实现同步自动发布新PRE。实现过程也算简单,通过一台中间Java Web服务器进行传输请求的中转,将DEV上的传输请求文件下载后,上传到新PRE服务器上,然后在新PRE服务器上导入新的请求即可。这就需要在DEV上写个远程RFS接口,将需要传输的请求所对应的数据与配置文件下载下来;在新PRE上写个远程接口,将从DEV上下载下来的传输请求文件上传到新PRE服务器上,其后通过调用发布函数进行请求发布。代码涉及到三台机器:SAP DEV  ——>  Java Web中转服务器  ——>  SAP PRE,之间采用JCO进行连接。最新的SAP JCO包请点击这里下载,Linux上So动态链接库以及Windows的Dll部署请百度

1、DEV远程接口:

 

.
"传输请求所对应的数据文件
CONCATENATE `/usr/sap/trans/data/R` .
lv_total_len = lv_total_len + lv_binary_len.
APPEND lt_data_binary.
lw_files-last_line_size = lv_binary_len.
ELSE.
lw_files-total_size = lv_total_len.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET v_filename.
lw_files-data = lt_data_binary[].

APPEND lw_files TO files.
ENDDO.
ENDLOOP.
"返回给Java Web服务器
requestnos = requestno.
ENDFUNCTION.

 
2、新PRE远程接口:

 此服务器上的ZXG_PRE_TABLE_TYPE类型与DEV上是一样的,这里就不再截图

FUNCTION zxg_pre_fuc.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(FILES) TYPE  ZXG_PRE_TABLE_TYPE
*"     VALUE(REQUESTNOS) TYPE  STRING
*"----------------------------------------------------------------------

DATA: lw_files TYPE zxg_pre_strc_type.
DATA: lw_data TYPE sdokcntbin.
DATA: lines TYPE i.
DATA: indx TYPE i .

LOOP AT files INTO lw_files .
    indx = 0.
OPEN DATASET lw_files-filename FOR OUTPUT IN BINARY MODE.

DESCRIBE TABLE lw_files-data LINES lines.
LOOP AT lw_files-data INTO lw_data.
      indx = indx + 1.
IF indx <> lines.
TRANSFER lw_data-line TO lw_files-filename.
ELSE.
TRANSFER lw_data-line+(lw_files-last_line_size) TO lw_files-filename.
ENDIF.
ENDLOOP.
CLOSE DATASET lw_files-filename.
ENDLOOP.

DATA: result_tab TYPE TABLE OF string WITH HEADER LINE.
SPLIT requestnos AT ',' INTO TABLE  result_tab IN CHARACTER MODE.

DATA: req TYPE tmsbuffer-trkorr.

LOOP AT result_tab.
    req =  result_tab.
PERFORM frm_stms USING req.
ENDLOOP.
ENDFUNCTION.

 

FORM frm_stms USING requestno TYPE tmsbuffer-trkorr.
CALL FUNCTION 'TMS_MGR_FORWARD_TR_REQUEST'
EXPORTING
      iv_request = requestno
      iv_target  = 'PRE'
      iv_tardom  = 'DOMAIN_PRE'.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

CALL FUNCTION 'TMS_MGR_IMPORT_TR_REQUEST'
EXPORTING
      iv_system  = 'PRE'
      iv_domain  = 'DOMAIN_PRE'
      iv_request = requestno.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.  

3、Java Web

 
import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
import com.sap.conn.jco.AbapException;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoParameterList;
import com.sap.conn.jco.JCoTable;
import com.sap.conn.jco.ext.DestinationDataProvider;
 
public class ConnectPooled {// 连接池
    private static Log log = LogFactory.getLog(ConnectPooled.class);
 
    static String ABAP_AS_POOLED_XG_PRE = "ABAP_AS_POOLED_XG_PRE";
    static String ABAP_AS_POOLED_R3_DEV = "ABAP_AS_POOLED_R3_DEV";
    static {
        config("192.168.118.xx");// dev
        config("10.242.6.xxx");// pre
    }
 
    private static void config(String ip) {
        Properties connectProperties = new Properties();
        connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, ip);
        connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");
        connectProperties
                .setProperty(DestinationDataProvider.JCO_CLIENT, "200");
        connectProperties.setProperty(DestinationDataProvider.JCO_USER,
                "1504xxxx");
        // 注:密码是区分大小写的,要注意大小写
        connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD,
                "axxxxxx");
        connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "en");
 
        // *********连接池方式与直接不同的是设置了下面两个连接属性
        // JCO_PEAK_LIMIT - 同时可创建的最大活动连接数,0表示无限制,默认为JCO_POOL_CAPACITY的值
        // 如果小于JCO_POOL_CAPACITY的值,则自动设置为该值,在没有设置JCO_POOL_CAPACITY的情况下为0
        connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT,
                "10");
        // JCO_POOL_CAPACITY - 空闲连接数,如果为0,则没有连接池效果,默认为1
        connectProperties.setProperty(
                DestinationDataProvider.JCO_POOL_CAPACITY, "3");
 
        createDataFile(ABAP_AS_POOLED_XG_PRE, "jcoDestination",
                connectProperties);
    }
 
    static void createDataFile(String name, String suffix, Properties properties) {
        File cfg = new File(name + "." + suffix);
        if (!cfg.exists()) {
            try {
                FileOutputStream fos = new FileOutputStream(cfg, false);
                properties.store(fos, "for tests only !");
                fos.close();
            } catch (Exception e) {
                log.error("", e);
            }
        }
    }
 
    /**
     * 根据输入的传输请求号,从DEV上获取传输请求所对应的传输文件
     * @param REQUESTNO
     * @return
     * @throws JCoException
     */
    public static JCoTable getTransRequestFiles(String REQUESTNO)
            throws JCoException {
        JCoDestination destination = JCoDestinationManager
                .getDestination(ABAP_AS_POOLED_R3_DEV);
        JCoFunction function = destination.getRepository().getFunction(
                "ZXG_PRE_FUC");// 从对象仓库中获取 RFM 函数
        if (function == null)
            throw new RuntimeException("ZXG_PRE_FUC not found in SAP.");
 
        JCoParameterList jpl = function.getImportParameterList();
        jpl.setValue("REQUESTNO", REQUESTNO);
        try {
            function.execute(destination);
        } catch (AbapException e) {
            log.error("", e);
            return null;
        }
 
        jpl = function.getExportParameterList();
        JCoTable jt = jpl.getTable("FILES");
 
        return jt;
    }
 
    /**
     * 将DEV上的传输请求文件上传到PRE上去,并实现后继的自动发布过程
     * @param jt
     * @param req
     * @throws JCoException
     */
    public static void sendTransReqFiles2xgpre(JCoTable jt, String req)
            throws JCoException {
        JCoDestination destination = JCoDestinationManager
                .getDestination(ABAP_AS_POOLED_XG_PRE);
        JCoFunction function = destination.getRepository().getFunction(
                "ZXG_PRE_FUC");// 从对象仓库中获取 RFM 函数
        if (function == null)
            throw new RuntimeException("ZXG_PRE_FUC not found in SAP.");
 
        function.getImportParameterList().setValue("FILES", jt);
        function.getImportParameterList().setValue("REQUESTNOS", req);
 
        try {
            function.execute(destination);
        } catch (AbapException e) {
            log.error("", e);
        }
    }
}
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
import com.sap.conn.jco.JCoException;
 
@Controller
@RequestMapping("/xgpresync")
public class XGPRECtrl {
 
    private static Log log = LogFactory.getLog(XGPRECtrl.class);
 
    @RequestMapping("/gettransreq")
    public void gettransreq(HttpServletRequest request,
            HttpServletResponse response, String transreq) throws JCoException {
        log.info("reqs:" + transreq);
        try {
            ConnectPooled.sendTransReqFiles2xgpre(
                    ConnectPooled.getTransRequestFiles(transreq), transreq);
            JsonPrintUtil.printJson(response, true, "", "");
        } catch (Exception e) {
            log.error("", e);
            JsonPrintUtil.printJson(response, false, e.getMessage(), "");
        }
    }

}

 
然后再将该链接集成到我司发布平台上去,实现自动发布
 
 
 
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

附件列表

SAP传输请求自动发布的更多相关文章

  1. SAP传输系统TMS、开发类、传输请求

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. SVN利用Hooks自动发布网站

    出于管理需要,也需要在公司内部实现自动发布流程.当开发机提交SVN代码之后,自动同步到测试服务器进行测试. 网络的拓扑简化为: 1台核心SVN服务器,使用的svn管理软件为Subversion Edg ...

  3. 测试开发Python培训:自动发布新浪微博-技术篇

    测试开发Python培训:自动发布新浪微博-技术篇   在前面我们教大家如何登陆,大家需要先看自动登陆新浪微博(http://www.cnblogs.com/laoli0201/articles/48 ...

  4. Jenkins持续集成(下)-Jenkins部署Asp.Net网站自动发布

    环境:Windows 2008 R2.Jenkins2.235.1.Visual Studio 2017: 概要 前面写过一篇文章,<自动发布-asp.net自动发布.IIS站点自动发布(集成S ...

  5. 使用 Promise 实现请求自动重试

    使用 Promise 实现请求自动重试 "use strict"; /** * * @author xgqfrms * @license MIT * @copyright xgqf ...

  6. eclipse项目自动发布到tomcat目录,缺文件。

    eclipse项目自动发布到tomcat目录,缺文件. 解决方案: 项目--Properties-->Deployment Assembly-->Add--> Folder Add- ...

  7. php利用svn hooks将程序自动发布到测试环境

    利用svn hooks将php程序自动发布到测试环境 复制仓库hooks目录下的post-commit.tmpl为post-commit cp post-commit.tmpl post-commit ...

  8. 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)

    一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp) 程序员的生活要一切自动化,更要幸福^_^. 转载请注明出处http: ...

  9. [Eclipse] - 集成JBoss7热加载和自动发布

    使用Eclipse + JBoss开发时,总是要重启项目或JBoss,烦人.下面方法可以很简单的实现Eclipse + JBoss热加载和自动发布. 我的环境是JBoss 7.1.1 Final 1) ...

随机推荐

  1. Flink的广播变量

    Flink支持广播变量,就是将数据广播到具体的taskmanager上,数据存储在内存中,这样可以减缓大量的shuffle操作: 比如在数据join阶段,不可避免的就是大量的shuffle操作,我们可 ...

  2. kudu集成impala

    Kudu 与 Apache Impala (孵化)紧密集成,允许开发人员使用 Impala 使用 Impala 的 SQL 语法从 Kudu tablets 插入,查询,更新和删除数据: 安装impa ...

  3. Codeforces 1017F The Neutral Zone (看题解)

    这题一看就筛质数就好啦, 可是这怎么筛啊, 一看题解, 怎么会有这么骚的操作. #include<bits/stdc++.h> #define LL long long #define f ...

  4. sqlldr的使用

    1,在公司进行预处理的时候,发现文件不能入库,而公司前辈使用的是sqlldr的技术将解析后的文件入库,前辈在测试的时候使用的是本机上的数据库(见图一),没有使用完整的远程连接oracle的正确方式,所 ...

  5. JavaSE | 接口| 枚举| 注释| 异常

    包: 1.包的作用:(1)避免类的同名(区分类):类的全名称:包.类名 回忆:java.util.Scannerjava.util.Arraysjava.lang.Stringj(2)可以限定某些类或 ...

  6. day64 django django零碎知识点整理

    本文转载自紫金葫芦,哪吒,liwenzhou.cnblog博客地址 简单了解mvc框架和MTV框架, mvc是一种简单的软件架构模式: m----model,模型 v---view,视图 c---co ...

  7. 3-6 Vue中的条件渲染

    本次案例讲解:v-if,v-show,v-else,v-else-if和key值的相关用法!!! v-if指令: //通过一个(v-if)指令 ,可以结合js表达式的返回值,决定一个标签是否在页面上展 ...

  8. vue实例属性之el,template,render

    一.el,template,render属性优先性当Vue选项对象中有render渲染函数时,Vue构造函数将直接使用渲染函数渲染DOM树,当选项对象中没有render渲染函数时,Vue构造函数首先通 ...

  9. vue注册和简单使用

      组件的出现就是为了解决页面布局等等一些列的问题. vue中的组件分为两种,全局组件和局部组件. 一  . 注册全局组件 通过Vue.component()创建一个全局组件之后,我们可以在一个通过  ...

  10. JS运算符问题

    以下代码是否报错,如果不报错输出什么,为什么 var x = !!"Hello" + (!"world", !!"from here!!") ...