可以在 JobManager 中添加 ByteArrayInputStream 吗?

Can we add ByteArrayInputStream in JobManager?

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 吗?

谢谢!

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

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

Sling 会将作业作为节点存储在存储库中,看起来它只支持 "standard" 类型,如 StringBooleanInteger 等。而不是 files/blobs.

我想不出将文件添加到作业中的方法,但您可以自己在存储库中创建临时节点,其中包含 files/blobs.

Sling 在此处存储工作:

/var/eventing/jobs

您可能会做类似的事情:

/var/<project-name>/jobs

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

根据 Jens 的评论,作业确实会将数据存储为 JCR 中的节点属性。您可能会探索将数据存储为 Binaryjcr:data 属性 的可能性,但我自己还没有测试过。

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

样本:Base64 Java encode and decode a string [duplicate]