基础
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对象,在进行打印操作
该方案较方案一更好,好在传输效率和稳定性,并且能够充分使用组件的其他功能,比如重打印等,建议使用