FTPC远程打印,使用ActiveMq序列化传输打印数据Ireport,reportdesign

2 篇文章 0 订阅
2 篇文章 0 订阅

基础

JMS通讯组件,参考JMS通讯组件DEMO
1.生产者,由客户端业务,产生打印Message,向目标服务器发送消息
2.消费者,可以部署在目标服务器上,参考SOS服务部署,相应服务器产生的消息
3.ActiveMQ服务器,生产者产生的消息,经由该服务器,路由到设定的目标消费者
在这里插入图片描述
代码打印基础原理,依赖FTPC组件环境
构建对象,参考FTPC打印文档demo

方案 一

关键点在于打印消息的产生,传递,消费
1.构建发送客户端,

在这里插入代码片

2.构建消息体,产生一个可序列化的消息体
已知,构建一个可以打印的对象Report需要,打印设计对象ReportDesign(包含ireport的jrxml文件),和ReportDataSet(包含jrxml渲染所需要数据)
存在问题,com.datasweep.compatibility.client.Report 该对象催在依赖com.datasweep.compatibility.ui.Form,com.rockwell.operationalreporting.ReportDataSet数据集对象者两个对象均未实现Serializable接口,所以进行对象序列化传递时会产生错误,所以不能直接进行Report对象的序列化传输。
所以采取序列化传输的中转方案
1.ReportDesign构建,在FTPC中只需要ReportDesign对象名和版本号就可以进行构建,所以,只需要传递一下2个参数

 // 1. create and fill report data set
    reportDataSetUserList = getUserDataSet()

    // 2. create User report,接收ReportDesign名称和版本号
    rptUserList = createReport("exRpt_User", "1")
    if (null == rptUserList) {
      quit()
    }
    
    // 3. combine user report with user data set
    rptUserList.setReportDataSet(reportDataSetUserList)
    rptUserList.setDescription("User Item List")

    // 4. validate data against definition and generate
    responseRpt = rptUserList.generate()
    if (responseRpt.isError()) {
      checkAndDisplayResponse(responseRpt)
      quit()
    }
    // 5. preview/print
    configuredPrinter = null // means default printer
    withPrintDialog = true
    responseRpt = rptUserList.printWithPreview(configuredPrinter, withPrintDialog, formCurrent)
    if (responseRpt.isError()) {
      checkAndDisplayResponse(responseRpt)
      quit()
    }

2.ReportDataSet构建


  // 1. Get a vector with all users
    vecUsers = getAllUsers()
    // 2. create a report data set
    reportDataSetUserList = createReportDataSet()
    // 3. Define the global reporting variables in the report data set
    reportDataSetUserList.setGlobalVariable("LBLFIRSTNAME", "First name")
    reportDataSetUserList.setGlobalVariable("LBLLASTNAME", "Last name")
    // 4. Put the Users to a report data set
    // Make sure the locale reporting variable is defined for each row in
    // the table with a value from the report data set
    foreach itemUser (vecUsers.elements()){
        mapUserRow = reportDataSetUserList.createRow()
        mapUserRow.put("OBJUSER", itemUser)
        reportDataSetUserList.appendRow(mapUserRow)
    }

3.构建可序列化的ReportDataSetEx,将ReportDataSet中的信息先传递给ReportDataSetEx,反序化后在转化成ReportDataSet
代码依赖《相对强大的反射工具类》问题来了,怎么快速引用之前的博文超链接呢

/**
     * FTPC报表数据集转换成可序列化报表数据集
     * @author xuweijun
     * @date 2022/7/23 13:34
     * @param reportDataSet
     * @return com.mes.print.model.dataset.ReportDataSetEx
     */
    public static ReportDataSetEx covertReportDataSetEx(ReportDataSet reportDataSet){
        Object globalVariableValues = ReflectUtilsEx.getObjByField(reportDataSet, reportDataSet.getClass(), "globalVariableValues");
        Object dynamicVariableValues = ReflectUtilsEx.getObjByField(reportDataSet, reportDataSet.getClass(), "dynamicVariableValues");
        Object dynamicVariableNames = ReflectUtilsEx.getObjByField(reportDataSet, reportDataSet.getClass(), "dynamicVariableNames");

        ReportDataSetEx reportDataSetEx = new ReportDataSetEx();
        reportDataSetEx.setGlobalVariableValues(ReflectUtilsEx.convertValue(globalVariableValues,HashMap.class));
        reportDataSetEx.setDynamicVariableValues(ReflectUtilsEx.convertValue(dynamicVariableValues,List.class));
        reportDataSetEx.setDynamicVariableNames(ReflectUtilsEx.convertValue(dynamicVariableNames,HashMap.class));
        return reportDataSetEx;
    }

3.构建响应端,反序列化打印消息,进行打印
反序列化后转化

 /**
     * 可序列化报表数据集转换成FTPC报表数据集
     * @author xuweijun
     * @date 2022/7/23 13:39
     * @param reportDataSetEx
     * @return com.rockwell.operationalreporting.ReportDataSet
     */
    public static ReportDataSet covertReportDataSet(ReportDataSetEx reportDataSetEx){
        ReportDataSet reportDataSet = PCContext.getFunctions().createReportDataSet();
        HashMap dynamicVariableNames = reportDataSetEx.getDynamicVariableNames();
        List dynamicVariableValues = reportDataSetEx.getDynamicVariableValues();
        HashMap globalVariableValues = reportDataSetEx.getGlobalVariableValues();
        ReflectUtilsEx.setObjFieldValue(reportDataSet, reportDataSet.getClass(), "globalVariableValues", globalVariableValues);
        ReflectUtilsEx.setObjFieldValue(reportDataSet, reportDataSet.getClass(), "dynamicVariableValues", dynamicVariableValues);
        ReflectUtilsEx.setObjFieldValue(reportDataSet, reportDataSet.getClass(), "dynamicVariableNames", dynamicVariableNames);
        return reportDataSet;
    }

方案 二

方案一的缺点在于,消息体中存在多媒体对象,或者占用控件大的对象,会影响传输效率和打印稳定性
1.构建Report对象,持久化到数据库,实际上FTPC也是这样做的,配置报表对象属性Capture后,会将整个对象信息持久化到数据库,包含已经渲染好的xml信息
2.这时,只需要传递Report对象的key,在反序列化时,按key从数据库中索引出Report对象,在进行打印操作

该方案较方案一更好,好在传输效率和稳定性,并且能够充分使用组件的其他功能,比如重打印等,建议使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JerryLXu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值