起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5452|回复: 7

BusinessServer中调用biz-client传Table参数

  [复制链接]

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
发表于 2014-12-8 18:45:02 | 显示全部楼层 |阅读模式
本帖最后由 hecr 于 2014-12-8 18:46 编辑

基本思路: 将BusinessServer的Table对象序列化XML或JSON格式数据,调用biz-client的api请求另一个BusinessServer.
代码类似:
1. 发送端的代码:
        private static void test() {
                String query = "select p, p.sName, p.sPhoto from SA_OPPerson p where p.sCode='test'";
                Table table = KSQL.select(query, null, "/system/data", null);
                table.getProperties().put(Table.PROP_NAME_ROWID, "p");
                try {
                        Iterator<Row> it = table.iterator();
                        while (it.hasNext()) {
                                Row r = it.next();

                                for (String key : table.getColumnNames()) {
                                        Object value = r.getValue(key);
                                        if (value instanceof Clob) {
                                                Clob clob = (Clob) value;
                                                value = clob.getSubString(1, (int) clob.length());
                                        } else if (value instanceof Blob) {
                                                Blob blob = (Blob) value;
                                                value = new String(blob.getBytes(1, (int) blob.length()));
                                        }

                                        System.out.print(key + "=" + value + ",");
                                }
                                System.out.println();
                        }
                } catch (Exception e) {
                        throw new RuntimeException(e.getMessage() + "", e);
                }
               
                ActionEngine.init("http://192.168.1.89:8080/BusinessServer");
                String name = "system";
                String password = "123456";
                String ip = "127.0.0.1";
                ActionResult ar = ActionEngine.login2(name, ActionUtils.md5(password), ip, null, new Date(System.currentTimeMillis()), new HashMap<String, Object>(), ActionUtils.JSON_CONTENT_TYPE, null);
                if (ar.isSuccess()){
                        String bsessionID = ar.getBSessionID();
                        try{
                                Action action = new Action();
                                action.setProcess("/demo/process/process/and/andProcess");
                                action.setActivity("mainActivity");
                                action.setName("testTableWrapperAction");
                                TableWrapper tw = new TableWrapper();
                                tw.setTable(table);
                                Element e = tw.writer(null);
                                System.out.println(e.asXML());
                                action.setParameter("table", e);
                                
                                ActionResult ar2 = ActionEngine.invokeAction(action, ActionUtils.JSON_CONTENT_TYPE, bsessionID, null, null);
                                if (ar2.isSuccess()){
                                        JSONObject json = (JSONObject)ar2.getDatas().get(0);
                                        System.out.println(json);
                                }else{
                                        throw new RuntimeException(ar2.getMessage());
                                }
                        }catch(Exception e){
                                throw new RuntimeException(e.getMessage(), e);
                        }finally{
                                ActionEngine.logout(bsessionID);
                        }
                        
                        
                }else{
                        throw new RuntimeException(ar.getMessage());
                }

        }

2. 接收端的代码:
<action name="testTableWrapperAction" global="true" procedure="testTableWrapperProcedure">
     <public type="Xml" name="table"></public>
</action>

  <procedure name="testTableWrapperProcedure" code-model="/demo/process/logic/code" code="Process.testTableWrapper">
    <parameter name="table" type="Xml"/>
  </procedure>

        public static void testTableWrapper(Document table){
                try{
                        TableWrapper tw = new TableWrapper();
                        tw.reader(table.getRootElement(), null);
                        Table tobj = tw.getTable();
                        Iterator<Row> it = tobj.iterator();
                        while (it.hasNext()){
                                Row r = it.next();
                                
                                for (String name : tobj.getColumnNames()){
                                        Object value = r.getValue(name);
                                        if (value instanceof Clob){
                                                Clob clob = (Clob)value;
                                                value = clob.getSubString(1, (int)clob.length());
                                        }else if (value instanceof Blob){
                                                Blob blob = (Blob)value;
                                                value = new String(blob.getBytes(1, (int) blob.length()));
                                        }
                                       
                                        System.out.print(name + "=" + value + ",");
                                }
                                System.out.println();
                        }
                }catch(Exception e){
                        throw new RuntimeException(e.getMessage()+"", e);
                }
        }


3. TableWrapper实现(参考附件)








TableWrapper.java

4.35 KB, 下载次数: 462

480

主题

1283

帖子

4468

积分

论坛元老

Rank: 8Rank: 8

积分
4468
QQ
发表于 2014-12-13 22:54:39 | 显示全部楼层
接收的时候报错如下
ava.lang.RuntimeException: 编码: JUSTEP150109; 提示: "RequestContext"不存在
        at TableWrapper.reader(TableWrapper.java:96)
        at Receiver$1.onMessage(Receiver.java:83)
        at org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1390)
        at org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)
        at org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)
        at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)
        at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:662)
Caused by: com.justep.exception.BusinessException: 编码: JUSTEP150109; 提示: "RequestContext"不存在
        at com.justep.exception.BusinessException.create(Unknown Source)
        at com.justep.util.Utils.checkNotExist(Unknown Source)
        at com.justep.model.ModelUtils.getRequestContext(Unknown Source)
        at com.justep.model.ModelUtils.getRootModel(Unknown Source)
        at com.justep.model.impl.ModelImpl.getModel(Unknown Source)
        at com.justep.model.impl.ModelImpl.getModel(Unknown Source)
        at com.justep.model.impl.UtilImplementInstance.getModel(Unknown Source)
        at com.justep.model.ModelUtils.getModel(Unknown Source)
        at com.justep.system.transform.Row2Table.createTable(Unknown Source)
        at com.justep.system.transform.Row2Table.transform(Unknown Source)
        at TableWrapper.reader(TableWrapper.java:60)
        ... 9 more

480

主题

1283

帖子

4468

积分

论坛元老

Rank: 8Rank: 8

积分
4468
QQ
发表于 2014-12-14 11:40:12 | 显示全部楼层
这一行出错,this.table = new Row2Table().transform(rows);
错误信息 Caused by: com.justep.exception.BusinessException: 编码: JUSTEP150109; 提示: "RequestContext"不存在

rows 变量的值如下

<rows><userdata name="model">/obs/obs/data</userdata><userdata name="id-column-name">samplemaster</userdata><userdata name="id-column-type">String</userdata><userdata name="id-column-define">samplemaster</userdata><userdata name="userdata">whereVersion</userdata><userdata name="relations">samplemaster.version,samplemaster.fSerialNo,samplemaster.fStatus,samplemaster.fMakeUser,samplemaster.fMakeDate,samplemaster.fConfirm_User,samplemaster.fConfirm_Date,samplemaster.fCheck_User,samplemaster.fCheck_Date,samplemaster.fShoestree_Code,samplemaster.fSample_Code,samplemaster.fSample_Name,samplemaster.fCustomer_Code,samplemaster.fSupplier_Code,samplemaster.fCsample_Code,samplemaster.fSubCategoryCode1001,samplemaster.fSubCategoryCode2000,samplemaster.fSubCategoryCode2001,samplemaster.fSubCategoryCode2002,samplemaster.fSubCategoryCode2003,samplemaster.fSubCategoryCode2004,samplemaster.fSubCategoryCode2005,samplemaster.fSubCategoryCode2006,samplemaster.fSubCategoryCode2007,samplemaster.fSubCategoryCode2008,samplemaster.fSubCategoryCode2009,samplemaster.fSubCategoryCode2010,samplemaster.fSubCategoryCode2011,samplemaster.fSubCategoryCode2012,samplemaster.fSubCategoryCode2013,samplemaster.fPicture_Path,samplemaster.fPicture,samplemaster.fMemo,samplemaster.fConfirmConclusion,samplemaster.fAuditConclusion,samplemaster.fFactory,samplemaster.fFile,samplemaster.fTemplate,samplemaster.fStatusDesc,samplemaster.fSubCategoryCode1001Desc,samplemaster.fSubCategoryCode2000Desc,samplemaster.fSubCategoryCode2001Desc,samplemaster.fSubCategoryCode2002Desc,samplemaster.fSubCategoryCode2003Desc,samplemaster.fSubCategoryCode2004Desc,samplemaster.fSubCategoryCode2005Desc,samplemaster.fSubCategoryCode2006Desc,samplemaster.fSubCategoryCode2007Desc,samplemaster.fSubCategoryCode2008Desc,samplemaster.fSubCategoryCode2009Desc,samplemaster.fSubCategoryCode2010Desc,samplemaster.fSubCategoryCode2011Desc,samplemaster.fSubCategoryCode2012Desc,samplemaster.fSubCategoryCode2013Desc,samplemaster.fSubmitUnit</userdata><userdata name="relation-types">Integer,String,String,String,DateTime,String,DateTime,String,DateTime,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,Blob,String,String,String,String,Text,Text,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String,String</userdata><userdata name="relation-alias">version,fSerialNo,fStatus,fMakeUser,fMakeDate,fConfirm_User,fConfirm_Date,fCheck_User,fCheck_Date,fShoestree_Code,fSample_Code,fSample_Name,fCustomer_Code,fSupplier_Code,fCsample_Code,fSubCategoryCode1001,fSubCategoryCode2000,fSubCategoryCode2001,fSubCategoryCode2002,fSubCategoryCode2003,fSubCategoryCode2004,fSubCategoryCode2005,fSubCategoryCode2006,fSubCategoryCode2007,fSubCategoryCode2008,fSubCategoryCode2009,fSubCategoryCode2010,fSubCategoryCode2011,fSubCategoryCode2012,fSubCategoryCode2013,fPicture_Path,fPicture,fMemo,fConfirmConclusion,fAuditConclusion,fFactory,fFile,fTemplate,fStatusDesc,fSubCategoryCode1001Desc,fSubCategoryCode2000Desc,fSubCategoryCode2001Desc,fSubCategoryCode2002Desc,fSubCategoryCode2003Desc,fSubCategoryCode2004Desc,fSubCategoryCode2005Desc,fSubCategoryCode2006Desc,fSubCategoryCode2007Desc,fSubCategoryCode2008Desc,fSubCategoryCode2009Desc,fSubCategoryCode2010Desc,fSubCategoryCode2011Desc,fSubCategoryCode2012Desc,fSubCategoryCode2013Desc,fSubmitUnit</userdata><userdata name="sys.rowid">samplemaster</userdata><row id="36CE49F4F5824E138F1B3A2E5F09319A"><userdata name="recordState"/><cell><![CDATA[6]]></cell><cell><![CDATA[2014120600007]]></cell><cell><![CDATA[1005005]]></cell><cell><![CDATA[user1]]></cell><cell><![CDATA[2014-12-06T15:40:07.470Z]]></cell><cell><![CDATA[user1]]></cell><cell><![CDATA[2014-12-06T15:42:36.357Z]]></cell><cell><![CDATA[user1]]></cell><cell><![CDATA[2014-12-06T15:42:50.060Z]]></cell><cell><![CDATA[123]]></cell><cell><![CDATA[2014120600006]]></cell><cell/><cell/><cell/><cell/><cell><![CDATA[1001001]]></cell><cell><![CDATA[2000001]]></cell><cell><![CDATA[2001001]]></cell><cell><![CDATA[2002001]]></cell><cell><![CDATA[2003001]]></cell><cell><![CDATA[2004001]]></cell><cell><![CDATA[2005001]]></cell><cell><![CDATA[2006001]]></cell><cell><![CDATA[2007001]]></cell><cell><![CDATA[2008001]]></cell><cell><![CDATA[2009001]]></cell><cell><![CDATA[2010001]]></cell><cell><![CDATA[2011001]]></cell><cell><![CDATA[2012001]]></cell><cell><![CDATA[2013001]]></cell><cell/><cell/><cell/><cell><![CDATA[Y]]></cell><cell><![CDATA[Y]]></cell><cell><![CDATA[/维科贸易公司/鞋厂A]]></cell><cell/><cell/><cell/><cell><![CDATA[自产/国内]]></cell><cell><![CDATA[223]]></cell><cell><![CDATA[卡迪娜]]></cell><cell><![CDATA[春鞋]]></cell><cell><![CDATA[休闲系列]]></cell><cell><![CDATA[正装]]></cell><cell><![CDATA[18-25]]></cell><cell><![CDATA[欧美]]></cell><cell><![CDATA[高跟]]></cell><cell><![CDATA[片底]]></cell><cell><![CDATA[男]]></cell><cell><![CDATA[欧码]]></cell><cell><![CDATA[邓从于]]></cell><cell><![CDATA[无]]></cell><cell><![CDATA[无]]></cell><cell><![CDATA[鞋厂A]]></cell></row></rows>

480

主题

1283

帖子

4468

积分

论坛元老

Rank: 8Rank: 8

积分
4468
QQ
发表于 2014-12-14 20:34:23 | 显示全部楼层
可能是因为在action起了一个线程来处理接收到的table造成出错,
我现在情况如下, 我想用active mq来发送和接收 table 对象, 因为在接受端 是异步监听的,需要另起一个线程,但是另起一个线程,好像x5的一些api就报错,怎么处理呢

connection = connectionFactory.createConnection();
           
            connection.start();
           
            session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
            
            destination = session.createQueue("test-persistence");
            consumer = session.createConsumer(destination);
            
            consumer.setMessageListener(new MessageListener() {
                public void onMessage(Message arg0) {
                    
                        try {
                        Thread.sleep(50);
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                    System.out.println("==================");
                    
                    try {
                        
                        if (arg0 instanceof TextMessage) {
                                System.out.println("RECEIVE1��һ�������:" + ((TextMessage) arg0).getText());
                        }else if (arg0 instanceof ObjectMessage ) {
                                ObjectMessage objectMessage = (ObjectMessage)arg0;
                               
                                SampleMaster sampleMaster = (SampleMaster)objectMessage.getObject();
                                String value = sampleMaster.getfPicture();
                               

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
 楼主| 发表于 2014-12-15 10:02:14 | 显示全部楼层
X5的action中不支持启多线程(每次请求结束后,会将RequestContext清除), activemq客户端应该写在另一个程序中,在那个程序中登录X5后, 调用相应的action

480

主题

1283

帖子

4468

积分

论坛元老

Rank: 8Rank: 8

积分
4468
QQ
发表于 2014-12-16 15:16:04 | 显示全部楼层
本帖最后由 davidhuang 于 2014-12-16 15:42 编辑

接收到的table对象, 不能用table.save()保存到 数据库,也不报错,估计是table里面的记录状态不对,请问要怎么改状态,才能保存接收到的table对象

我已经把每一行的状态设置为新增状态,还是不行

如果传过来主从表,先保存哪个呢?



保存Table到数据库,只有有语义信息的Table才能保存。       tab.save("/system/data");
何为语义信息

480

主题

1283

帖子

4468

积分

论坛元老

Rank: 8Rank: 8

积分
4468
QQ
发表于 2014-12-17 11:43:20 | 显示全部楼层
保存的时候,报错,unable to convert between javax.sql.rowset.serial.SerialBlob and JAVA_OBJECT.

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
 楼主| 发表于 2014-12-17 14:15:15 | 显示全部楼层
原因是sql使用setBlob时,不支持javax.sql.rowset.serial.SerialBlob,当前版本中,可以不使用table.save,自己遍历table中的数据,之后使用ksql修改数据库中数据,其中blob和clob的值转换成inputstream
高级模式
B Color Image Link Quote Code Smilies

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-4-20 00:28 , Processed in 0.105718 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表