工作流中一个非常有用的组件是业务事件(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)

由于系统缓存的问题,第一次调用后有修改,可能需要重启应用。