Beispiel: Subskription eines WS-Notification-Konsumenten
Verwenden Sie diese Task, um den Code für einen JAX-RPC-Client, der in der Rolle für die Publisher-Registrierung auftritt, der eine Publisher-Anwendung (Erzeuger) bei einem Broker registriert, basierend auf dem bereitgestellten Beispöielcodeauszug zu schreiben.
Informationen zu diesem Vorgang
Dieses Beispiel basiert auf der Verwendung der JAX-RPC-APIs (Java™ API for XML-based Remote Procedure Call) zusammen mit Code, der mit Tool WSDL2Java (auf der Basis der beim Erstellen des WS-Notification-Servicepunkts generierten NotificationBroker-WSDL) generiert wird, und den APIs und SPIs von WebSphere Application Server.
- JAX-WS
- JAX-WS-Clientprogrammiermodell
- Statische JAX-WS-Web-Service-Clients implementieren
- Writing JAX-WS applications for WS-Notification
- Web services hints and tips: JAX-RPC versus JAX-WS, Part 1
In diesem Beispiel zeigt der erste optionale Codeblock, wie eine Subskription unformatierter Nachrichten (Raw Subscription) erstellt wird. Dieses Konzept ist in Abschnitt 4.2 der Spezifikation 'Web Services Base Notification' definiert.
Normalerweise löst eine eingeschlossene Subskription die Operation "Notify" (Benachrichtigen) von "NotificationConsumer" aus, wenn passende Benachrichtigungen verfügbar sind. Falls der Subskribent stattdessen eine Subskription unformatierter Nachrichten erstellt, wird nur der anwendungsspezifische Inhalt der Ereignisbenachrichtigung (d. h. der Inhalt des Elements NotificationMessage) an den Zielendpunkt des Konsumenten gesendet. Beachten Sie Folgendes: Der Web-Service-Endpunkt, der in der ConsumerReference derjenigen Subscribe-Anforderung angegeben wurde, die auch den Parameter UseRaw enthielt (d. h. die Anforderung einer Subskription unformatierter Nachrichten) muss den NotificationConsumer-Porttyp nicht implementieren, weil die Ereignisbenachrichtigungen nicht über die Operation Notify zugestellt werden.
Dies bedeutet, dass der Konsument in der Lage sein muss, Operationen für jeden Typ von Anwendungsinhalt annehmen zu können, der im angegebenen Topic veröffentlicht wird. Dieses Beispiel ermöglicht WS-Notification, eine Gruppe vorhandener Web-Service-Anwendungen aufzurufen, die WS-Notification zwar nicht unterstützen, aber trotzdem dieselben Informationen empfangen möchten.
JAX-WS unterstützt die aktionsbasierte Zuteilung, und reine JAX-WS-Konsumentenanwendungen müssen den Aktions-URI http://docs.oasis-open.org/wsn/bw-2/NotificationConsumer/Notify akzeptieren. Weitere Informationen finden Sie im Fehlerbehebungstipp Eine JAX-WS-Anwendung, die ein Rohkonsument von Brokerbenachrichtigungen ist, muss eine SOAP-Aktion des Notification-Brokers erkennen.
Führen Sie die folgenden Schritte aus, um den Code für einen JAX-RPC-Client, der in der Rolle für die Publisher-Registrierung auftritt, der eine Publisher-Anwendung (Erzeuger) bei einem Broker registriert, basierend auf dem bereitgestellten Beispöielcodeauszug zu schreiben.
Vorgehensweise
Beispiel
// JAX-RPC-Service suchen. Der JNDI-Name ist spezifisch für Ihre Web-Service-Clientimplementierung.
InitialContext context = new InitialContext();
javax.xml.rpc.Service service = (javax.xml.rpc.Service) context.lookup(
"java:comp/env/services/NotificationBroker");
// Ein Stub für den Port abrufen, auf dem Operationen gestartet werden sollen.
NotificationBroker stub = (NotificationBroker) service.getPort(NotificationBroker.class);
// Die ConsumerReference erstellen. Sie enthält die Adresse des subskribierten
// Konsumenten-Web-Service bzw. alternativ eine Referenz auf einen Pull-Punkt (siehe
// die folgende Alternative). Die Angabe einer Endpunktreferenz (EPR) auf den
// Pull-Punkt zeigt an, dass der Konsument Pull-basierte Benachrichtigungen
// empfangen möchte.
EndpointReference consumerEPR =
EndpointReferenceManager.createEndpointReference(new URI("http://myserver.mycom.com:9080/Consumer"));
/*
// Alternative ConsumerReference für Pull-basierte Benachrichtigungen:
EndpointReference consumerEPR = pullPointEPR;
*/
// Den Filter erstellen. Er gibt den Namen des Topic an, das der Konsument subskribieren soll.
Filter filter = new Filter();
// Einen Topicausdruck erstellen und in den Filter aufnehmen. prefixMappings sind
// Zuordnungen zwischen Namespacepräfixen und den zugehörigen Namespaces für
// die im Ausdruck verwendeten Präfixe.
Map prefixMappings = new HashMap();
prefixMappings.put("abc", "uri:example");
TopicExpression exp =
new TopicExpression(TopicExpression.SIMPLE_TOPIC_EXPRESSION, "abc:ExampleTopic", prefixMappings);
filter.addTopicExpression(exp);
// Erstellen Sie einen Inhaltsfilter für XPath-Nachrichten der Version 1.0.
// In diesem Beispiel wird eine Untergruppe der verfügbaren Nachrichten im Topic, basierend auf der Gehaltsstufe, ausgewählt.
String filterExpression = "/company/department/employee/salary > 10000";
URI xpathURI = new URI(http://www.w3.org/TR/1999/REC-xpath-19991116);
QueryExpression qexp =
new QueryExpression(xpathURI, filterExpression);
filter.addMessageContentExpression(qexp);
// Die InitialTerminationTime (ursprüngliche Beendigungszeit) erstellen. Dieses Objekt gibt an, wann die Subskribtion beendet werden soll.
// Für dieses Beispiel wird eine Zeit von 1 Jahr in der Zukunft definiert.
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, 1);
AbsoluteOrRelativeTime initialTerminationTime = new AbsoluteOrRelativeTime(cal);
// Die Richtlinieninformationen erstellen.
SOAPElement[] policyElements = null;
/*
Optional
--------
Die folgenden Zeilen zeigen, wie eine Richtlinie erstellt wird, die
angibt, dass der Konsument unformatierte Benachrichtigungen empfangen soll:
javax.xml.soap.SOAPFactory soapFactory = javax.xml.soap.SOAPFactory.newInstance();
SOAPElement useRawElement = null;
if (soapFactory instanceof IBMSOAPFactory) {
// Sie können die von der API "IBMSOAPFactory" bereitgestellten Methoden zum Hinzufügen von Werten
// verwenden, um das SOAPElement aus einer XML-Zeichenfolge zu erstellen.
String useRawElementXML = "<mno:UseRaw xmlns:mno=\"http://docs.oasis-open.org/wsn/b-2\"/>";
useRawElement = ((IBMSOAPFactory) soapFactory).createElementFromXMLString(useRawElementXML);
} else {
useRawElement = soapFactory.createElement("UseRaw", "mno", "http://docs.oasis-open.org/wsn/b-2");
}
policyElements = new SOAPElement[] { useRawElement };
*/
// Holder für die Werte erstellen, die vom Broker zurückgegebenen werden:
// Die Subskriptionsreferenz
EndpointReferenceTypeHolder subscriptionRefHolder = new EndpointReferenceTypeHolder();
// Die aktuelle Zeit beim Broker
CalendarHolder currentTimeHolder = new CalendarHolder();
// Die Beendigungszeit für die Subskription
CalendarHolder terminationTimeHolder = new CalendarHolder();
// Zusätzliche Elemente
AnyArrayHolder anyOtherElements = new AnyArrayHolder();
// Die Operation Subscribe durch Aufruf der zugehörigen Methode im Stub starten.
stub.subscribe(consumerEPR,
filter,
initialTerminationTime,
policyElements,
anyOtherElements,
subscriptionRefHolder,
currentTimeHolder,
terminationTimeHolder);
// Die zurückgegebenen Werte abrufen:
// Eine Endpunktreferenz für die Subskription, die erstellt wurde. Sie wird für die spätere
// Verwaltung der Lebensdauer der Subskription benötigt, z. B. für das Aussetzen der Subskription.
com.ibm.websphere.wsaddressing.EndpointReference subscriptionRef = subscriptionRefHolder.value;
// Die aktuelle Zeit beim Broker
Calendar currentTime = currentTimeHolder.value;
// Die Beendigungszeit der Subskription
Calendar terminationTime = terminationTimeHolder.value;
// Zusätzliche Informationen
SOAPElement[] otherElements = anyOtherElements.value;