我们可以在JobManager中添加ByteArrayInputStream吗?

时间:2019-05-23 06:51:45

标签: aem sling

AEM6.2 我有一个Osgi服务,其中引用了org.apache.sling.event.jobs.JobManager,并向其中添加了工作。

代码类似于:

Map dataSourceMap = new HashMap<String, DataSource>
dataSourceMap.put(fileName, new ByteArrayDataSource(byte[], mimeTypeOfFile))

final Map<String, Object> props = new HashMap<String, Object>();
props.put("item1", "/something");
props.put("count", 5);
props.put("files", dataSourceMap)

jobManager.addJob("my/special/jobtopic", props);

该作业执行后显示错误

org.apache.sling.api.resource.PersistenceException: Value can't be stored in the repository: {<<filename>>=org.apache.commons.mail.ByteArrayDataSource@3f0f234c}

问题:对此异常有什么解决方案吗?还是我做错了什么?我们可以将ByteArrayInputStream添加到jobmanager吗?

谢谢!

只是一个信息,如果我删除行props.put("files", dataSourceMap),它将正常工作。

如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

Sling将作业存储为存储库中的一个节点,并且看起来它仅支持StringBooleanInteger等“标准”类型,而不支持文件/斑点。

我想不出一种向作业添加文件的方法,但是您可以做的是自己在存储库中创建一个临时节点,其中包含文件/斑点。

吊索在这里存储作业:

/var/eventing/jobs

您可能会做类似的事情:

/var/<project-name>/jobs

然后Sling作业的有效负载包含该作业节点的路径。

答案 1 :(得分:0)

根据Jens的评论,该作业确实会将数据存储为JCR中的节点属性。您可能会探讨将数据作为Binary存储到jcr:data属性的可能性,但是我自己尚未对此进行测试。

作为一种快速且可能不是非常优化的解决方法,为什么不将byte[]序列化为String甚至将其编码为Base64字符串?

示例:Base64 Java encode and decode a string [duplicate]