本章介绍了 Sun Java System Content Delivery Server 事件服务 API。事件服务 API 的外部接口是
事件服务会将事件队列传出的消息传播给已订阅了事件服务所发布的主题的任何感兴趣的事件监听器。事件服务还将事件数据存储在 Content Delivery Server 数据库中。可以使用 SQL*Net 客户机或 JMS 客户机应用程序方法。两种方法都可以近乎实时地访问相同的信息。
图 1 简单说明了通用系统和组件与事件服务之间进行交互的情况,列出了通过各种系统交互传递信息的方式:
Content Delivery Server 管理器将适当的消息发布到 Java 消息服务 (JMS) 队列。这些消息由事件服务进行检索和处理。Content Delivery Server 中的任何组件都可以将事件发布到事件服务。由于事件发布是异步操作,所以一旦发出消息,发布消息的组件将继续操作。
事件服务在 Content Delivery Server 环境中作为单独的进程运行。事件服务用于:
事件服务 API 的当前实现使用了 JMS 点对点 (PTP) 消息传送域,在此域中各种发布程序将消息发布到单个队列,并由事件服务 JMS 客户机应用程序的某个实例对这些消息进行处理。
事件被事件服务成功处理后,将被放置到用于存放消息内容的数据库架构区域。有关存储这些消息的数据模型信息,请参见“事件数据库”。
数据驻留在标准关系数据库中,开发者可以通过一组视图以任何能够查询 Oracle 数据库的编程语言编写应用程序。例如,可以使用 Java 语言、C++ 或 Visual Basic 编写这些应用程序。
本节所介绍的表格包含事件经事件服务处理后产生的数据。作为集成者,您具有访问这些表格数据的权限。使用用户 prefix_es_app
可以连接到 Oracle 数据库,其中 prefix 是为用于创建数据库的数据库配置文件中 Vending 元素下的 Prefix 元素指定的值。使用为数据库配置文件中的 Vending 元素下的 Password 元素指定的密码。有关数据库配置文件的信息,请参见《Sun Java System Content Delivery Server 安装指南》。
此表包含事件服务成功处理的每个事件的记录。处理事件时,此表将实时更新。
此表包含事件类型定义。在第 2.3 节“事件和事件数据”中列出了这些定义。它是静态的表。
此表保留了系统中所有事件组的定义,为静态形式。所有事件都属于名为 cds_group
的事件组。
此表包含事件源类型定义。它是静态的表。
可以使用任何连接到 Oracle 数据库的数据库报告工具为数据生成各种类型的报告。常用的一些报告工具包括 Crystal Reports、Microsoft Access、Oracle Reports 或 ReportSmith。
除了事件数据的基于 SQL 的接口,还可以实现通过 JMS 主题与事件服务直接接口的 JMS 客户机应用程序。虽然此方法需要进行较为复杂的开发,但是可以提高处理 Content Delivery Server 生成的事件时的灵活性。
要成功利用事件服务(使用此 API)集成,应该熟悉 JMS 客户机应用程序的编写,并且理解 Java 2 Platform Enterprise Edition(J2EETM 平台)的 JMS 规范中介绍的发布/订阅消息传送域。任意数量的 JMS 客户机应用程序都可以使用发布/订阅消息传送模型来订阅由事件服务发布的消息。
本节介绍了有关由事件服务提供的事件和事件数据的信息。SQL*Net 和 JMS 客户机应用程序都使用此信息过滤和处理事件。
下表介绍了由事件服务生成的事件。
下表列出了可以包含在事件中的信息。每个事件仅包含与该事件相关的参数。
CDSAbstractBillingSubscriber
类是抽象类,为所有订户类的基类。它用于处理所有与 JMS 相关的信息。这样外部开发者便可以集中精力进行自身的商业逻辑开发。
有关本节中未介绍的类或方法的信息,请参见 $CDS_HOME/javadoc/cdsapi/index.html
中的事件服务 API 的 JavadocTM 工具的 HTML 输出。
在您实现的构造函数中,调用父级构造函数并提供表 8 中所述的参数。执行该实现时,可以对这些参数进行硬编码或传递这些参数。
CDSAbstractBillingSubscriber(java.lang.String clientID, java.lang.String subName, java.lang.String selector, boolean durable, boolean transactional, java.lang.String jndiCtxFactory, java.lang.String connFactory, java.lang.String providerURL, java.lang.String topicName)
参数
|
说明
|
|||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
clientID
|
用于标识连接的名称。
|
|||||||||||||
subName
|
用于标识 JMS 主题订阅的名称。
|
|||||||||||||
selector
|
用于确定所监视的事件的过滤器。将此参数设置为 null 可以监视所有事件。要监视特定事件,请参见
javax.jms.Message 的 Javadoc 工具的输出,以获取有关设置此参数的信息。有关事件信息,请参见表 2。
|
|||||||||||||
durable
|
表示订户是否为长期订户的标志。长期订户接收订户处于非活动状态时发送的消息。将此参数设置为 true 可以创建长期订户。否则,将其设置为 false。
|
|||||||||||||
transactional
|
指明事务性会话是否应用于创建订户的标志。将此参数设置为 true 可以创建事务性会话。否则将其设置为 false。
|
|||||||||||||
jndiCtxFactory
|
用于生成 WebLogic 初始上下文的类。如果使用的是 Sun Java System Application Server,则将此参数设置为 null。如果使用的是 WebLogic Server,则将此参数设置为 weblogic.jndi.WLInitialContextFactory。
|
|||||||||||||
connFactory
|
Java Naming and Directory InterfaceTM ("JNDI") API 使用的连接工厂的名称。将此参数设置为
cds.messaging.billing.TopicConnectionFactory。 |
|||||||||||||
providerURL
|
JNDI API 的服务提供者的 URL。
如果使用的是 Sun Java System Application Server,则将此参数设置为 null。
如果使用的是 WebLogic Server,则为
jndi.host 和 jndi.port 属性,将此参数设置为部署配置文件中的值。例如,t3://jndihost.domain.com:80。
|
|||||||||||||
topicName
|
JNDI API 使用的
CDSBillingTopic 主题的名称。将此变量设置为 cds.messaging.billingTopic。
|
|||||||||||||
此方法用于定义如何处理消息。它由 onMessage
进行调用。
此方法用于定义如何在消息处理过程中处理错误。它由 catch 块中的 onMessage
调用。
本节介绍如何将事件服务 API 用于 SQL*Net 和 Java 中。
应用程序必须获得指向数据库的 SQL*Net 连接,以便应用程序直接查询 Oracle 数据库。具体过程取决于数据库服务器和客户机应用程序的本地环境。
使用用户 prefix_es_app
可以连接到 Oracle 数据库,其中 prefix 是为用于创建数据库的数据库配置文件中 Vending 元素下的 Prefix 元素指定的值。使用为数据库配置文件中的 Vending 元素下的 Password 元素指定的密码。有关数据库配置文件的信息,请参见《Sun Java System Content Delivery Server 安装指南》。
要编译 JMS 客户机,请在类路径中包含下表中所述的文件:
要执行 JMS 客户机:
-Dcds.home=
cds-home-Dcds.config.file=CDS.properties
-Dcds.config.dir=
cds-home/deployment/
deployment-name/conf
以下代码示例展示了一个样例脚本,可用于编译和执行第 2.6 节“示例” 中显示的 CDSAbstractBillingSubscriber
类的样例实现。
#!/bin/bash # Set the following properties for your environment CDS_HOME="/usr/local/cdshome" CDS_DEPL_NAME="cds" JAVA_HOME="/usr/j2se" # Set the following parameters for CDSBillingSubscriber clientID="CDSBillingSubscriberUniqueClientID" subName="CDSBillingSubscriberUniqueSubscriptionName" selector="null" durable="false" transactional="false" # CDSBillingSubscriber Parameter Constants connFactory="cds.messaging.billing.TopicConnectionFactory" topicName="cds.messaging.billingTopic" # Sun Java System Application Server Parameters jndiCtxFactory="null" providerURL="null" # BEA WebLogic Parameters # Set the providerURL and WL_HOME # For providerURL use the # WebLogic Application Server host and port #jndiCtxFactory="weblogic.jndi.WLInitialContextFactory" #providerURL="t3://jndihost.domain.com:80" #WL_HOME="/usr/local/bea/weblogic700/server" # You may select to filter the messages by event. # See the javadoc for javax.jms.Message for more # information on selectors.See the CDS Customization # Guide for a list of possible events. #selector="JMSCorrelationID=download_initiated" # Directory Constants DEPL_DIR="${CDS_HOME}/deployment/${CDS_DEPL_NAME}" CONF_DIR="${DEPL_DIR}/conf" LIB_DIR="${DEPL_DIR}/lib" CDSLIB_DIR="${LIB_DIR}/cdslib" # Sun Java System Application Server CLASSPATH Constant COMPILE_LCP=".:${LIB_DIR}/jms.jar" COMPILE_LCP="${COMPILE_LCP}:${CDSLIB_DIR}/cdsapi.jar" COMPILE_LCP="${COMPILE_LCP}:${CDSLIB_DIR}/foundation.jar" EXEC_LCP=".:${LIB_DIR}/jms.jar" EXEC_LCP="${EXEC_LCP}:${CDSLIB_DIR}/cdsapi.jar" EXEC_LCP="${EXEC_LCP}:${CDSLIB_DIR}/foundation.jar" EXEC_LCP="${EXEC_LCP}:${CDSLIB_DIR}/eventserviceclient.jar" EXEC_LCP="${EXEC_LCP}:${LIB_DIR}/imq.jar" EXEC_LCP="${EXEC_LCP}:${LIB_DIR}/fscontext.jar" # BEA WebLogic CLASSPATH Constant #COMPILE_LCP=".:${LIB_DIR}/jms.jar" #COMPILE_LCP="${COMPILE_LCP}:${CDSLIB_DIR}/cdsapi.jar" #COMPILE_LCP="${COMPILE_LCP}:${CDSLIB_DIR}/foundation.jar" #EXEC_LCP=".:${LIB_DIR}/jms.jar" #EXEC_LCP="${EXEC_LCP}:${CDSLIB_DIR}/cdsapi.jar" #EXEC_LCP="${EXEC_LCP}:${CDSLIB_DIR}/foundation.jar" #EXEC_LCP="${EXEC_LCP}:${CDSLIB_DIR}/eventserviceclient.jar" #EXEC_LCP="${EXEC_LCP}:${WL_HOME}/lib/weblogic.jar" # Java Command Line Option Constants CDS_OPTS="-Dcds.home=${CDS_HOME}" CDS_OPTS="${CDS_OPTS} -Dcds.config.file=CDS.properties" CDS_OPTS="${CDS_OPTS} -Dcds.config.dir=${CONF_DIR}" # Compile JAVAC_OPTS="-classpath ${COMPILE_LCP}" JAVAC_OPTS="${JAVAC_OPTS} CDSBillingSubscriber.java" $JAVA_HOME/bin/javac ${JAVAC_OPTS} # Execute JAVA_OPTS="-cp ${EXEC_LCP} ${CDS_OPTS}" JAVA_OPTS="${JAVA_OPTS} CDSBillingSubscriber" JAVA_OPTS="${JAVA_OPTS} ${clientID}" JAVA_OPTS="${JAVA_OPTS} ${subName}" JAVA_OPTS="${JAVA_OPTS} ${selector}" JAVA_OPTS="${JAVA_OPTS} ${durable}" JAVA_OPTS="${JAVA_OPTS} ${transactional}" JAVA_OPTS="${JAVA_OPTS} ${jndiCtxFactory}" JAVA_OPTS="${JAVA_OPTS} ${connFactory}" JAVA_OPTS="${JAVA_OPTS} ${providerURL}" JAVA_OPTS="${JAVA_OPTS} ${topicName}" $JAVA_HOME/bin/java ${JAVA_OPTS}
以下代码示例是 CDSBillingSubscriber
类的类定义。此类是如何扩展 AbstractBillingSubscriber
类以实现自己的记帐适配器的样例。
import com.sun.content.server.eventservice.subscriber.abs.*; import com.sun.content.server.eventservice.subscriber.util.*; import javax.jms.TextMessage; public class CDSBillingSubscriber extends CDSAbstractBillingSubscriber { public CDSBillingSubscriber( String clientID, String subName, String selector, boolean durable, boolean transactional, String jndiCtxFactory, String connFactory, String providerURL, String topicName) throws Exception { super(clientID, subName, selector, durable, transactional, jndiCtxFactory, connFactory, providerURL, topicName); } public void handleMsg() throws CDSEventServiceSubscriberException { try { // simply prints the message TextMessage txtMsg = (TextMessage) getMessage(); System.out.println(txtMsg.getText()); } catch (Exception ex) { ex.printStackTrace(); } } public void handleError() throws CDSEventServiceSubscriberException {} private static void displayUsage() { System.out.println(); System.out.print("Usage :java CDSBillingSubscriber "); System.out.print("clientID subName selector "); System.out.print("durable transactional "); System.out.print("jndiCtxFactory connFactory "); System.out.print("providerURL topicName"); System.out.println(); System.out.println(); System.out.print("For selector, you can specify null or "); System.out.print("JMSCorrelationID=<event>"); System.out.println(); System.out.println(); System.out.println("\t Terminating Program ..."); System.exit(-1); } public static void main(String[] args) { String clientID = null; String subName = null; String selector = null; boolean durable = false; boolean transactional = false; String jndiCtxFactory = null; String connFactory = null; String providerURL = null; String topicName = null; if (args.length == 9) { clientID = args[0]; subName = args[1]; selector = args[2]; durable = Boolean.valueOf(args[3]).booleanValue(); transactional = Boolean.valueOf(args[4]).booleanValue(); jndiCtxFactory = args[5]; connFactory = args[6]; providerURL = args[7]; topicName = args[8]; } else { displayUsage(); } if (selector == null) selector = null; else if (selector.trim().length() == 0) selector = null; else if (selector.trim().equalsIgnoreCase("null")) selector = null; CDSBillingSubscriber s = null; try { System.out.println(); System.out.println("Creating subscriber..."); s = new CDSBillingSubscriber(clientID, subName, selector, durable,transactional, jndiCtxFactory, connFactory, providerURL, topicName); System.out.println("Subscriber created."); System.out.println("clientID="+s.getClientID()); System.out.println("subName="+s.getSubName()); System.out.println("selector="+s.getSelector()); System.out.println("durable="+s.isDurable()); System.out.println("transactional="+s.isTransactional()); System.out.println("jndiCtxFactory="+s.getJndiCtxFactory()); System.out.println("connFactory="+s.getConnFactory()); System.out.println("providerURL="+s.getProviderURL()); System.out.println("topicName="+s.getTopicName()); System.out.println(); System.out.println("Running for ten minutes..."); Thread.sleep(600000); System.out.println("Ten minutes have elapsed."); } catch (Exception e) { e.printStackTrace(); } try { System.out.println(); System.out.println("Closing connections..."); if (s != null) s.getTopicHelper().closeConnections(); System.out.println("Connections closed"); } catch (Exception e) { e.printStackTrace(); } } }
定制指南 Sun Java™ System Content Delivery Server,版本 2004Q1 |
版权所有 © 2004 Sun Microsystems, Inc. 保留所有权利。必须依据许可证条款使用。