You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-issues@jackrabbit.apache.org by "amin zamani (JIRA)" <ji...@apache.org> on 2016/10/12 18:36:22 UTC

[jira] [Comment Edited] (OAK-4911) Can not read node Property when move code into a Thread (Java)

    [ https://issues.apache.org/jira/browse/OAK-4911?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15569500#comment-15569500 ] 

amin zamani edited comment on OAK-4911 at 10/12/16 6:36 PM:
------------------------------------------------------------

I have now modified the structure of the code:

Now in ONE THREAD A NEW FILE NODE is created but when I try to access the property IN THE SAME THREAD I still get the same error. I access in the same java thread where I have created the file the properties of the node that I just have created before in the same thread. Here the example:

New thread created with following content, it calls only the createDocument(...) method and then I get the exception - without a thread i don't have the exception:

--------------------------------------------------------------------

public Document createDocument(String folderId, CreateDocumentDto createDto) {
        try {
            Node node = jcrSession.getNodeByIdentifier(folderId);

            Binary binary = jcrSession.getValueFactory().createBinary(createDto.getContent());
            try {
                Node file = JcrUtils.getOrCreateByPath(
                    node,
                    "",
                    DO_CREATE_UNIQUE_LEAF,
                    NodeType.NT_FOLDER,
                    NodeType.NT_FILE,
                    DO_AUTO_SAVE);

                file.addMixin(NodeType.MIX_VERSIONABLE);

                file.addMixin(NodeType.MIX_TITLE);
                file.setProperty(Property.JCR_TITLE, createDto.getTitle());
                file.setProperty(Property.JCR_DESCRIPTION, createDto.getDescription());

                file.addMixin(CustomNodeType.NOAH_ENTITY_DOCUMENT);
                if (createDto.getDocumentType() != null) {
                    file.setProperty(CustomProperty.NOAH_DOCUMENT_TYPE_VALUE, createDto.getDocumentType().getValue());
                    file.setProperty(CustomProperty.NOAH_DOCUMENT_TYPE_LABEL, createDto.getDocumentType().getLabel());
                }
                file.setProperty(CustomProperty.NOAH_ENTITY_URL, createDto.getEntityUrl());

                file.addMixin(CustomNodeType.NOAH_AUDITABLE);
                file.setProperty(CustomProperty.NOAH_CREATED_BY, SecurityUtil.getCurrentUserLogin());

                Node content = JcrUtils.getOrAddNode(file, Node.JCR_CONTENT, NodeType.NT_RESOURCE);
                content.setProperty(Property.JCR_DATA, binary);
                content.setProperty(Property.JCR_MIMETYPE, createDto.getContentType());

                String previewFileType="";
                if(createDto.getPreviewType() != null){
                    // Ok, we are creating a preview document, so add the preview type
                    file.addMixin(CustomNodeType.NOAH_PREVIEW_DOCUMENT);
                    System.out.println("Create preview document, set preview type:"+createDto.getPreviewType().name());
                    file.setProperty(CustomProperty.NOAH_PREVIEW_TYPE, createDto.getPreviewType().name());
                    previewFileType = createDto.getPreviewType().name();
                }

                jcrSession.refresh(true);
                jcrSession.save();

                jcrSession.refresh(true);
                System.out.println("Created "+previewFileType+" document,id: "+file.getIdentifier()+" ("+createDto.getTitle()+"),path: "+file.getPath());
                LOG.debug("Created "+previewFileType+" document,id: "+file.getIdentifier()+" ("+createDto.getTitle()+"),path: "+file.getPath());

                Version versionNode = versionFile(file, binary);
                jcrSession.refresh(true);
                return toDocument(versionNode);

            } finally {
                binary.dispose();
            }
        } catch (RepositoryException e) {
            throw new RuntimeRepositoryException(e);
        }
    }
 




was (Author: amin.zamani@westernacher.com):
I have now modified the structure of the code:

Now in a thread a new file node is created but when I try to access the property I still get the same error. I access in the same java thread where I have created the file the properties of the node that I just have created before. Here a little exampe:

new thread created with following content, it calls only the createDocument(...) method and then I get the exception - without a thread i don't have the exception:

--------------------------------------------------------------------

public Document createDocument(String folderId, CreateDocumentDto createDto) {
        try {
            Node node = jcrSession.getNodeByIdentifier(folderId);

            Binary binary = jcrSession.getValueFactory().createBinary(createDto.getContent());
            try {
                Node file = JcrUtils.getOrCreateByPath(
                    node,
                    "",
                    DO_CREATE_UNIQUE_LEAF,
                    NodeType.NT_FOLDER,
                    NodeType.NT_FILE,
                    DO_AUTO_SAVE);

                file.addMixin(NodeType.MIX_VERSIONABLE);

                file.addMixin(NodeType.MIX_TITLE);
                file.setProperty(Property.JCR_TITLE, createDto.getTitle());
                file.setProperty(Property.JCR_DESCRIPTION, createDto.getDescription());

                file.addMixin(CustomNodeType.NOAH_ENTITY_DOCUMENT);
                if (createDto.getDocumentType() != null) {
                    file.setProperty(CustomProperty.NOAH_DOCUMENT_TYPE_VALUE, createDto.getDocumentType().getValue());
                    file.setProperty(CustomProperty.NOAH_DOCUMENT_TYPE_LABEL, createDto.getDocumentType().getLabel());
                }
                file.setProperty(CustomProperty.NOAH_ENTITY_URL, createDto.getEntityUrl());

                file.addMixin(CustomNodeType.NOAH_AUDITABLE);
                file.setProperty(CustomProperty.NOAH_CREATED_BY, SecurityUtil.getCurrentUserLogin());

                Node content = JcrUtils.getOrAddNode(file, Node.JCR_CONTENT, NodeType.NT_RESOURCE);
                content.setProperty(Property.JCR_DATA, binary);
                content.setProperty(Property.JCR_MIMETYPE, createDto.getContentType());

                String previewFileType="";
                if(createDto.getPreviewType() != null){
                    // Ok, we are creating a preview document, so add the preview type
                    file.addMixin(CustomNodeType.NOAH_PREVIEW_DOCUMENT);
                    System.out.println("Create preview document, set preview type:"+createDto.getPreviewType().name());
                    file.setProperty(CustomProperty.NOAH_PREVIEW_TYPE, createDto.getPreviewType().name());
                    previewFileType = createDto.getPreviewType().name();
                }

                jcrSession.refresh(true);
                jcrSession.save();

                jcrSession.refresh(true);
                System.out.println("Created "+previewFileType+" document,id: "+file.getIdentifier()+" ("+createDto.getTitle()+"),path: "+file.getPath());
                LOG.debug("Created "+previewFileType+" document,id: "+file.getIdentifier()+" ("+createDto.getTitle()+"),path: "+file.getPath());

                Version versionNode = versionFile(file, binary);
                jcrSession.refresh(true);
                return toDocument(versionNode);

            } finally {
                binary.dispose();
            }
        } catch (RepositoryException e) {
            throw new RuntimeRepositoryException(e);
        }
    }
 



> Can not read node Property when move code into a Thread (Java)
> --------------------------------------------------------------
>
>                 Key: OAK-4911
>                 URL: https://issues.apache.org/jira/browse/OAK-4911
>             Project: Jackrabbit Oak
>          Issue Type: Bug
>    Affects Versions: 1.3.10
>         Environment: MAC OS X
>            Reporter: amin zamani
>         Attachments: java-code.txt
>
>
> Hallo,
> we develop an application and everything is working as it should. We upload documents and for each document a new preview file (node) should be generated. It works well when we execute the code synchron. But because of the fact that the generation of a preview file (like PDF format) can take very long time we decided to move the preview generation code into a usual java thread so that after the user is upload a document the website is responding very quick and does not wait till the preview file is generated but the preview file is generated parallel. 
> No the problem: As soon as I move the same code regarding to the preview file generation into a usual thread (no modifications to the logic, only a thread is bordered to it) suddenly the node path does not exist, this is the error:
> -----------------
> Caused by: javax.jcr.PathNotFoundException: jcr:lastModifiedBy not found on /jcr:system/jcr:versionStorage/7e/f8/5b/7ef85b25-4598-4476-82df-446eb3a08a90/1.0/jcr:frozenNode/jcr:content
> 	at org.apache.jackrabbit.oak.jcr.session.NodeImpl$11.perform(NodeImpl.java:631)
> 	at org.apache.jackrabbit.oak.jcr.session.NodeImpl$11.perform(NodeImpl.java:625)
> 	at org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.perform(SessionDelegate.java:207)
> 	at org.apache.jackrabbit.oak.jcr.session.ItemImpl.perform(ItemImpl.java:112)
> 	at org.apache.jackrabbit.oak.jcr.session.NodeImpl.getProperty(NodeImpl.java:625)
> 	at com.westernacher.noah.util.content_repository.JcrUtil.getStringProperty(JcrUtil.java:35)
> ---------------------------
> In my point of view this is a bug. This is the code that works:
> Example:
> /// 1) User Upload document through browser in our web app..
> // 2) ... document uploaded and saved in OAK CR
> // 3) Now generate the preview:
> updateDocumentPreview(documentId);
> --------------------------------
> Now the same in a thread that does not work:
> => I have only moved the method "updateDocumentPreview(documentId);" in a Thread (Java 8):
> //Same code as before except the last line replaced by following lines:
> Runnable run = ()-> {updateDocumentPreview(documentId);}
> new Thread(run).start(); //Start the thread to generate a document preview
> --------------------------



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)