工作流中一个非常有用的组件是业务事件(Business Event),它可以和异构系统进行互通消息。自Oracle Application Suite 11.5.10后,业务事件就支持Java程序了。如果不考虑使用数据库的功能(透明网关、Web Services)等,对于Oracle EBS而言,业务事件就是最优先的选择了。
Metalink上找不到相应的开发文档,Oracle Workflow Developer’s Guide 中提到过,但是很简略。和PL/SQL写rule function一样,使用Java也需要注意规范,必须使用该接口:
public interface SubscriptionInterface
{
void onBusinessEvent(Subscription eo, BusinessEvent event, WorkflowContext ctx)
throws BusinessEventException;
}
这三个参数作用:
eo 用于获取Subscription相关信息,比如phase或参数。
event BE对象,如event name, event key等。
ctx 工作流相关上下文,比如数据库链接句柄、日志对象等。
下面是一个简单的例子:
package oracle.apps.cux.sms;
import oracle.apps.fnd.wf.bes.BusinessEvent;
import oracle.apps.fnd.wf.bes.BusinessEventException;
import oracle.apps.fnd.wf.bes.SubscriptionInterface;
import oracle.apps.fnd.wf.bes.server.Subscription;
import oracle.apps.fnd.wf.common.WorkflowContext;
public class CuxSmsTransporter implements SubscriptionInterface {
public void onBusinessEvent(Subscription eo, BusinessEvent event,
WorkflowContext ctx) throws BusinessEventException {
System.out.println("Hello Subscription!");
}
}
具体的配置过程可以直接参考文档,创建业务事件、订阅,将class文件放入相应目录中即可。
需要留意的是,class文件要和应用的jvm版本一致,否则会导致如下错误:
[Feb 3, 2009 3:59:18 PM CST]:1233647958026:Thread[inboundThreadGroup1,5,inboundThreadGroup]:0:-1:erptest.orafans.com:10.0.0.2:-1:-1:ERROR:[fnd.wf.bes.EventDispatcher.executeSubscription()]:Could not instantiate Subscription -> java.lang.UnsupportedClassVersionError: oracle/apps/cux/sms/CuxSmsTransporter (Unsupported major.minor version 50.0)
由于系统缓存的问题,第一次调用后有修改,可能需要重启应用。

由于DB和应用分布在不同的服务器上,所以这里就只针对“应用”层进行控制和管理了,可以免去DBA很多事…索性把配置步骤也写清楚就更值得收藏了:-)
2009/02/03 @ 18:16
因为subscription中可以使用java,plsql或工作流,他们的定义(配置方式)比较类似,但是对于java rule function的文档太少,所以写一点。
如果不涉及异构系统,根本就不去考虑java了。
2009/02/03 @ 20:54