在 Alfresco 3.3.0 上使用 CMISQL 查询的随机失败

发布于 2024-09-08 07:14:55 字数 3084 浏览 2 评论 0原文

[已解决,似乎存在一些影响 Alfresco 3.3.0 的错误,该错误在 Alfresco 3.3.0g 上已不再存在]

嗨,

我正在使用 OpenCMIS 从 Alfresco 3.3 检索数据,但它在 CMISQL 查询上有非常奇怪的行为。我用谷歌搜索了其他有同样问题的人,但似乎我是世界上第一个:),所以我想这是我的错,而不是 OpenCMIS 的错。

这就是我查询 Alfresco 的方式:

public Class CmisTest {
    private static Session sesion;

    private static final String QUERY = "select cmis:objectid, cmis:name from cmis:folder where cmis:name='MyFolder'";

    public static void main(String[] args) {
        // Open a CMIS session with Alfresco
        Map<String, String> params = new HashMap<String, String>();
        params.put(SessionParameter.USER, "admin");
        params.put(SessionParameter.PASSWORD, "admin");
        params.put(SessionParameter.ATOMPUB_URL, "http://localhost:8080/alfresco/s/api/cmis");
        params.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
        params.put(SessionParameter.REPOSITORY_ID, "fa9d2553-1e4d-491b-87fd-3de894dc7ca9");
        sesion = SessionFactoryImpl.newInstance().createSession(params);

        // Ugly bug in Alfresco which raises an exception if we request more data than it's available
        // See https://issues.alfresco.com/jira/browse/ALF-2859
        sesion.getDefaultContext().setMaxItemsPerPage(1);

        // We repeat the same query 20 times and count the number of elements retrieved each time
        for (int i = 0; i < 20; i++) {
            List<QueryResult> result = doQuery();
            System.out.println(result.size() + " folders retrieved");
        }
    }

    public static List<QueryResult> doQuery() {
        List<QueryResult> result = new LinkedList<QueryResult>();
        try {
            int page = 0;
            while (true) {
                ItemIterable<QueryResult> iterable = sesion.query(QUERY, false).skipTo(page);
                page++;
                for (QueryResult qr : iterable) {
                    result.add(qr);
                }
            }
        } catch (Exception e) {
            // We will always get an exception when Alfresco has no more data to retrieve... :(
            // See https://issues.alfresco.com/jira/browse/ALF-2859
        }
        return result;
    }

}

如您所见,我们只是执行相同的查询,最多连续执行 20 次。您每次都会期望相同的结果,不是吗?不幸的是,这是我们得到的一个示例:

1 folders retrieved
1 folders retrieved
1 folders retrieved
0 folders retrieved
0 folders retrieved
0 folders retrieved
0 folders retrieved
0 folders retrieved
1 folders retrieved
1 folders retrieved

有时我们连续得到 20 个 1,有时全是 0。不过,我们从未得到过 10 的“混合”;我们总是会“围观”他们。

如果我们在每个查询之前创建会话并不重要,我们仍然会遇到随机问题。我们尝试了两个不同的 Alfresco 服务器(都是 3.3 Community),全新安装,但它们都随机失败。我们还尝试测量每个查询的时间,但它似乎与结果错误(检索到 0 个文件夹)或正确(检索到 1 个文件夹 >)。

Alfresco 似乎工作正常:如果我们转到“管理 --> 节点浏览器”并从那里启动 CMISQL 查询,它总是检索一个文件夹,这是正确的。所以,这一定是我们的代码,或者是 OpenCMIS 错误......

有什么想法吗?

[Solved, it seems that there was some bug affecting Alfresco 3.3.0, which is no longer present on Alfresco 3.3.0g]

Hi,

I'm using OpenCMIS to retrieve data from Alfresco 3.3, but it's having a very weird behaviour on CMISQL queries. I've googled somebody else with the same problems, but it seems I'm the first one all over the world :), so I guess it's my fault, not OpenCMIS'.

This is how I'm querying Alfresco:

public Class CmisTest {
    private static Session sesion;

    private static final String QUERY = "select cmis:objectid, cmis:name from cmis:folder where cmis:name='MyFolder'";

    public static void main(String[] args) {
        // Open a CMIS session with Alfresco
        Map<String, String> params = new HashMap<String, String>();
        params.put(SessionParameter.USER, "admin");
        params.put(SessionParameter.PASSWORD, "admin");
        params.put(SessionParameter.ATOMPUB_URL, "http://localhost:8080/alfresco/s/api/cmis");
        params.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
        params.put(SessionParameter.REPOSITORY_ID, "fa9d2553-1e4d-491b-87fd-3de894dc7ca9");
        sesion = SessionFactoryImpl.newInstance().createSession(params);

        // Ugly bug in Alfresco which raises an exception if we request more data than it's available
        // See https://issues.alfresco.com/jira/browse/ALF-2859
        sesion.getDefaultContext().setMaxItemsPerPage(1);

        // We repeat the same query 20 times and count the number of elements retrieved each time
        for (int i = 0; i < 20; i++) {
            List<QueryResult> result = doQuery();
            System.out.println(result.size() + " folders retrieved");
        }
    }

    public static List<QueryResult> doQuery() {
        List<QueryResult> result = new LinkedList<QueryResult>();
        try {
            int page = 0;
            while (true) {
                ItemIterable<QueryResult> iterable = sesion.query(QUERY, false).skipTo(page);
                page++;
                for (QueryResult qr : iterable) {
                    result.add(qr);
                }
            }
        } catch (Exception e) {
            // We will always get an exception when Alfresco has no more data to retrieve... :(
            // See https://issues.alfresco.com/jira/browse/ALF-2859
        }
        return result;
    }

}

As you can see, we just execute the same query, up to 20 times in a row. You would expect the same result each time, wouldn't you? Unfortunately, this is a sample of what we get:

1 folders retrieved
1 folders retrieved
1 folders retrieved
0 folders retrieved
0 folders retrieved
0 folders retrieved
0 folders retrieved
0 folders retrieved
1 folders retrieved
1 folders retrieved

Sometimes we get 20 1 in a row, sometimes it's all 0. We have never get a "mix" of 1 and 0, though; we always get "a run" of them.

It does not matter if we create the session before each query, we still have the random issue. We have tried against two different Alfresco servers (both of them 3.3 Community), clean installation, and they both fail randomly. We also tried to measure the time for each query, but it doesn't seem to have any relation with the result being wrong (0 folders retrieved) or right (1 folders retrieved).

Alfresco seems to be working fine: if we go to "Administration --> Node browser" and launch the CMISQL query from there, it always retrieves one folder, which is right. So, it must be our code, or an OpenCMIS bug...

Any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦在深巷 2024-09-15 07:14:55

I can't reproduce this behavior. It's running fine against http://cmis.alfresco.com . The issue https://issues.alfresco.com/jira/browse/ALF-2859 states that there have been bug fixes. Are you running the latest Alfresco version?

Florian

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文