0

我正在创建一个具有 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;

    }
4

2 回答 2

0

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

于 2013-07-25T20:26:44.253 回答
0

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

于 2014-01-04T18:52:26.510 回答