GWT-RPC方法成功返回空列表

时间:2013-07-25 11:49:41

标签: gwt hbase gwt-rpc

我正在创建一个包含CellTable的网页。我需要使用hbase表中的数据提供此表。

我编写了一个从hbase表中检索数据并对其进行测试的方法。

但是当我将该方法称为GWT异步RPC方法时,则rpc调用成功,但它不返回任何内容。在我的情况下,它返回空列表。警告框显示列表的大小为0。

以下是相关代码。

请帮忙。

greetingService.getDeviceIDData(new AsyncCallback<List<DeviceDriverBean>>(){
                    public void onFailure(Throwable caught) {
                        // Show the RPC error message to the user
                        System.out.println("RPC Call failed");
                        Window.alert("Data : RPC call failed");

                    }

                    public void onSuccess(List<DeviceDriverBean> result) {                      
                        //on success do something
                        Window.alert("Data : RPC call successful");
                        //deviceDataList.addAll(result);                    
                        Window.alert("Result size: " +result.size());                       


                        // Add a text column to show the driver name.
                        TextColumn<DeviceDriverBean> nameColumn = new TextColumn<DeviceDriverBean>() {
                            @Override
                            public String getValue(DeviceDriverBean object) {
                                Window.alert(object.getName());
                                return object.getName();

                            }
                        };
                        table.addColumn(nameColumn, "Name");

                        // Add a text column to show the device id      
                        TextColumn<DeviceDriverBean> deviceidColumn = new TextColumn<DeviceDriverBean>() {
                            @Override
                            public String getValue(DeviceDriverBean object) {
                                return object.getDeviceId();
                            }
                        };
                        table.addColumn(deviceidColumn, "Device ID");
                        table.setRowCount(result.size(), true);

// more code here to add columns in celltable
                        // Push the data into the widget.
                        table.setRowData(0, result);
                        SimplePager pager = new SimplePager();
                        pager.setDisplay(table);
                        VerticalPanel vp = new VerticalPanel();
                        vp.add(table);
                        vp.add(pager);      

                        // Add it to the root panel.
                        RootPanel.get("datagridContainer").add(vp);
                    }                   
                }); 

从hbase(服务器端代码)检索数据的代码

public List<DeviceDriverBean> getDeviceIDData()
            throws IllegalArgumentException {

        List<DeviceDriverBean> deviceidList = new ArrayList<DeviceDriverBean>();

        // Escape data from the client to avoid cross-site script
        // vulnerabilities.
        /*
         * input = escapeHtml(input); userAgent = escapeHtml(userAgent);
         * 
         * return "Hello, " + input + "!<br><br>I am running " + serverInfo +
         * ".<br><br>It looks like you are using:<br>" + userAgent;
         */

        try {
            Configuration config = HbaseConnectionSingleton.getInstance()
                    .HbaseConnect();
            HTable testTable = new HTable(config, "driver_details");
            byte[] family = Bytes.toBytes("details");
            Scan scan = new Scan();
            int cnt = 0;
            ResultScanner rs = testTable.getScanner(scan);
            for (Result r = rs.next(); r != null; r = rs.next()) {

                DeviceDriverBean deviceDriverBean = new DeviceDriverBean();
                byte[] rowid = r.getRow(); // Category, Date, Sentiment
                NavigableMap<byte[], byte[]> map = r.getFamilyMap(family);
                Iterator<Entry<byte[], byte[]>> itrt = map.entrySet()
                        .iterator();

                deviceDriverBean.setDeviceId(Bytes.toString(rowid));

                while (itrt.hasNext()) {

                    Entry<byte[], byte[]> entry = itrt.next();
                    //cnt++;
                    //System.out.println("Count : " + cnt);

                    byte[] qual = entry.getKey();
                    byte[] val = entry.getValue();

                    if (Bytes.toString(qual).equalsIgnoreCase("account_number")) {
                        deviceDriverBean.setAccountNo(Bytes.toString(val));
                    } else if (Bytes.toString(qual).equalsIgnoreCase("make")) {
                        deviceDriverBean.setMake(Bytes.toString(val));
                    } else if (Bytes.toString(qual).equalsIgnoreCase("model")) {
                        deviceDriverBean.setModel(Bytes.toString(val));
                    } else if (Bytes.toString(qual).equalsIgnoreCase("driver_name")) {
                        deviceDriverBean.setName(Bytes.toString(val));
                    } else if (Bytes.toString(qual).equalsIgnoreCase("premium")) {
                        deviceDriverBean.setPremium(Bytes.toString(val));
                    } else if (Bytes.toString(qual).equalsIgnoreCase("year")) {
                        deviceDriverBean.setYear(Bytes.toString(val));
                    } else {
                        System.out.println("No match found");
                    }
                    /*
                     * System.out.println(Bytes.toString(rowid) + " " +
                     * Bytes.toString(qual) + " " + Bytes.toString(val));
                     */
                }

                deviceidList.add(deviceDriverBean);
            }
        }

        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        catch (Exception e) {
            // System.out.println("Message: "+e.getMessage());
            e.printStackTrace();
        }

        return deviceidList;

    }

2 个答案:

答案 0 :(得分:0)

这可能是hbase在服务器端的延迟获取。这意味着如果你返回列表,hbase将无法获得实际读取列表的触发器,你将很容易获得一个空列表。我不知道一个正确的解决方案,过去我在GAE上看到过类似的问题。这可以通过在将其返回给客户端之前简单地询问列表的大小来解决。

答案 1 :(得分:0)

我没有确切的答案,但我有一个建议。在类似的情况下,我自己跟踪检查我的程序中的每一步。 在返回put之前的服务器端:System.out.println(“size of table =”+ deviceidList.size()); 您可以将此跟踪放在deviceidList;

的循环中