0

Oracle BPM 版本 11.1.1.7。在 Humantask.task、Events 选项卡、Content Change Callbacks 部分中,我输入了实现 NotesStore 以及 addNote 和 getNotes 方法的类的完全限定类名。

该类使用 AppModule 中的公共方法使用我们的自定义表写入和读取注释,并且这些方法在开发过程中使用 BC 测试器和回调类中的临时 main 进行了很好的测试。

该项目被编译成一个 jar 并放置在 BPM 项目的 SCA-INF/lib 文件夹中,然后部署 SCA 和相关的 ADF 人工任务表单。

当在流程实例期间在开箱即用的人工任务注释部分中进行注释时,将调用该类,但在创建 AppModule 的行的 getNotes 方法中发生异常:

java.lang.ClassCastException:oracle.jbo.common.ampool.PoolMgr

在类中,AppModule 是这样创建的:

AuditModule service = (AuditModule)Configuration.createRootApplicationModule("com.co.modules.AuditModule", "AuditModuleLocal");

我已经尝试将 web.xml 配置文件添加到带有过滤器的 SCA BPM 项目,如本文所述(最后一个答案)。这讨论了触发 ADF 上下文初始化,但我仍然收到错误消息。

问题是,如何使用人工任务的回调来调用使用 AppModule 公共方法来完成数据库工作的方法?Oracle在这方面的文档非常稀少(29.11.1)。

更新

结果表明堆栈跟踪显示它在查找数据源名称时遇到问题,并且实际上引发了 JBO 错误。如果有人遇到这种情况,请检查堆栈跟踪是否有其他问题。

更新2

终于得到这个将任务评论写入自定义评论表。事实证明,在评论回调类中使用 AppModule/Model 方法似乎是不可能的,因为在调用类时似乎无法启动所需的 ADF 上下文。通过重写类以直接在代码中访问数据库,注释回调类确实会写入表。但是,我得到了与这篇文章相同的错误。即:

Exception invoking method from XML data control. Cause:oracle.bpel.services.workflow.client.WorkflowServiceClientException: java.rmi.UnmarshalException: cannot unmarshaling return; nested exception is: 
Supplemental Detail java.io.IOException: Error: Unexpected type encountered in writeExternal oracle.bpel.services.workflow.client.WorkflowServiceClientException: java.rmi.UnmarshalException: cannot unmarshaling return; nested exception is: 
java.io.IOException: Error: Unexpected type encountered in writeExternal

我怀疑这是一个 Oracle 框架问题,因为传回的类型来自 NotesStore 实现,它们都传回了框架:

public class CommentsCallback implements NotesStore, Serializable...

    public List<CommentType> getNotes(Task task)

有没有人解决这个问题?完整的堆栈跟踪:

https://community.oracle.com/thread/3638940

4

1 回答 1

0

在与 Oracle 讨论之后,避免意外类型错误的关键是使用 ObjectFactory 来填充 CommentType 对象。虽然我们最终采用了不同的方法,但 Oracle 提供了以下代码作为示例,可能会对尝试执行此操作的人有所帮助:

import oracle.bpel.services.workflow.task.model.ObjectFactory; 
import oracle.bpel.services.workflow.task.model.CommentType; 
import oracle.bpel.services.workflow.task.model.IdentityType; 

...

ObjectFactory factory = new ObjectFactory() 

CommentType commentType = factory.createCommentType(); 

IdentityType updatedBy = factory.createIdentityType(); 
updatedBy.setId("some user"); 
updatedBy.setType(IWorkflowConstants.IDENTITY_TYPE_USER); 
updatedBy.setDisplayName("some user display name"); 

commentType.setUpdatedBy(updatedBy); 
commentType.setComment("some comment"); 

...set the rest of the comment fields as necessary... 
于 2015-09-23T17:49:03.503 回答