事件來源範例是 WS-Notification 1.0 通知產生器的範例程式碼。它根據 Apache Axis 及 Eclipse TPTP 開放原始碼專案的程式庫。
它會示範事件來源必須遵循的下列步驟:
可在 <sdk_install_dir>/samples/wsnt-axis/src/com/wtci/samples/axis/source
目錄中取得 EventSourceWsn10.java 的程式碼
此範例使用數個 Apache Axis 類別、Eclipse Hyades 記載類別以及從 wsdl 檔案產生的類別。請使用下列 import 陳述式來存取必要的套件:
import com.ibm.wtci.samples.axiswsn10.wsa.AttributedURI; import com.ibm.wtci.samples.axiswsn10.wsa.EndpointReferenceType; import com.ibm.wtci.samples.axiswsn10.wsn.NotificationConsumer; import com.ibm.wtci.samples.axiswsn10.wsn.NotificationConsumerService; import com.ibm.wtci.samples.axiswsn10.wsn.NotificationConsumerServiceLocator; import com.ibm.wtci.samples.axiswsn10.wsn.NotificationMessageHolderType; import com.ibm.wtci.samples.axiswsn10.wsn.TopicExpressionType; import org.apache.axis.encoding.TypeMapping; import org.apache.axis.encoding.TypeMappingRegistry; import org.apache.axis.message.MessageElement; import org.apache.axis.types.URI; import org.eclipse.hyades.logging.events.cbe.CommonBaseEvent; import org.eclipse.hyades.logging.events.cbe.EventFactory; import org.eclipse.hyades.logging.events.cbe.EventFactoryFactory; import org.eclipse.hyades.logging.events.cbe.Situation; import org.eclipse.hyades.logging.events.cbe.util.EventFormatter; import java.net.URL; import javax.xml.namespace.QName;
EventSourceWsn10.java 的 main
方法會使用預設建構子來建立 EventSourceWsn10 的新實例。然後,
它會呼叫專用 sendEvent() 方法,而此方法包含主程式邏輯。傳回 sendEvent() 方法之後,main()
方法會將「已送出通知」訊息列印至標準輸出。
/** * Main method for the event source. * * @param args * arguments passed from the command line */ public static void main(String args[]) { EventSourceWsn10 source = new EventSourceWsn10(); try { source.sendEvent(); System.out.println("Notification sent"); } catch (Exception e) { e.printStackTrace(); } }
EventSourceWsn10.java 的 createEvents
方法是 helper 方法,可使用它來建立事件,
並將最小一組的內容資料移入該事件。sendEvent
方法會呼叫此方法,
以建立將傳送給「Web 服務」的事件。
public static CommonBaseEvent[] createEvents() throws Exception { CommonBaseEvent[] events = null; String cbeFile = System.getProperty("cbe.file"); if (cbeFile != null) { events = EventFormatter.eventsFromCanonicalXMLDoc(cbeFile); } else { // 第一個步驟是存取事件工廠 EventFactory eventFactory = EventFactoryFactory.createEventFactory(); // 建立具有副檔名的事件。 CommonBaseEvent event = eventFactory.createCommonBaseEvent("EVENT"); event.setCreationTimeAsLong(System.currentTimeMillis()); // 設定事件必要狀況的說明。 Situation situation = eventFactory.createSituation(); situation.setCategoryName(Situation.REPORT_SITUATION_CATEGORY); situation.setReportSituation("INTERNAL", "Succeeded"); event.setSituation(situation); // 設定事件來源的必要元件定義 event.setSourceComponentId("Event Source", "source.EventSource", "createEvent()", "http://www.ibm.com/namespaces/autonomic/Tivoli/Samples", "Sample", "unknown", "hostname"); // 設定通用基礎事件版本 event.setVersion("1.0.1"); // Setting optional fields event.setSeverity((short) 10); event.setMsg("Common Event Infrastructure Tutorial"); events = new CommonBaseEvent[] { event }; } return events; }
createEvents
方法會執行下列步驟:
附註:
與 situation 相似,sourceComponentId 也是複式內容。然而,它的子內容全部都是以字串來呈現的簡式屬性, 所以您可以使用 setSourceComponentId() helper 方法,而不是個別實例化特殊 Java 物件。範例所設定的其他內容 (version、severity 及 msg) 全部都是以字串或整數來呈現的簡式屬性。
createEvents
方法會傳回現在已移入內容資料的事件。事件來源範例的下一個方法 createNotificationMessage(event) 是 helper 方法, 可使用它來建立會將傳入的事件封裝為方法之參數的通知訊息。sendEvent 方法會呼叫此方法,以建立將傳送給「Web 服務」的通知訊息。
public static NotificationMessageHolderType[] createNotificationMessage( CommonBaseEvent events[]) throws Exception { NotificationMessageHolderType[] notificationArray = new NotificationMessageHolderType[events.length]; for (int i = 0; i < events.length; i++) { //Creating an instance of NotificationMessageHolderType notificationArray[i] = new NotificationMessageHolderType(); //Creating a Topic element with name 'Topic' and value of //dialect attribute as 'tec' MessageElement[] msgTopic = new MessageElement[1]; msgTopic[0] = new MessageElement(); msgTopic[0].setName("Topic"); msgTopic[0].setAttribute("dialect", "none"); TopicExpressionType topicExpType = new TopicExpressionType(); topicExpType.set_any(msgTopic); //Setting the Topic of the notification notificationArray[i].setTopic(topicExpType); //Setting the event to be the message of the notification notificationArray[i].setMessage(events[i]); //Setting information about the producer of the event in //the notification EndpointReferenceType endPointRef = new EndpointReferenceType(); AttributedURI au = new AttributedURI(); URI value = new URI("protocol", "your.event.source.address"); au.set_value(value); endPointRef.setAddress(au); notificationArray[i].setProducerReference(endPointRef); } return notificationArray; }
createNotificationMessage(event) 會執行下列步驟
事件來源範例的最後一個方法 sendEvent() 包含主程式邏輯。此方法會處理所有與 NotificationConsumer 用戶端的互動 (包括傳送事件)。
private void sendEvent() throws Exception { //The first step is creating an event CommonBaseEvent[] events = createEvents(); //Creating the Notification message encapsulating the event NotificationMessageHolderType[] notificationArray = createNotificationMessage(events); // Obtaining the address of the NotificationConsumer10Service // Web Services String endpoint = System.getProperty("service.address"); if (endpoint == null) { //If no address was specified, the webservice is assumed to be // runnning in the localhost at port 8080 for axis endpoint = "http://localhost:8080/axis/services/NotificationConsumer10Soap"; } //Creating an URL object for the address obtained URL serviceURL = new URL(endpoint); //Creating an instance of NotificationConsumerServiceLocator NotificationConsumerService notifierSvc = new NotificationConsumerServiceLocator(); //Using the NotificationConsumerService to obtain // NotificationConsumer object for the service NotificationConsumer notifier = notifierSvc.getNotificationConsumer10Soap(serviceURL); //Registering an instance of CbeSerializer object for serializing // objects of //type CommonBaseEvent to be sent over the wire TypeMappingRegistry reg = (TypeMappingRegistry) notifierSvc.getTypeMappingRegistry(); TypeMapping tm = (TypeMapping) reg.getTypeMapping(endpoint); QName qn = new QName("http://www.ibm.com/AC/commonbaseevent1_0_1", "CommonBaseEvent"); tm.register(CommonBaseEvent.class, qn, new CbeSerializerFactory(), null); //Sending the notification notifier.notify(notificationArray); }
sendEvent() 方法會執行下列步驟: