Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ja.. ich bin noch recht neu auf dem gebiet. und bin noch dabei mir einzufinden.
also ich habe einen esb server aufgesetzt (jboss ESB). ich möchte nun einen webservice erstellen der nachrichten entgegen nimmt und sie meinetwegen leicht verändert in einer action klasse(nur das man sieht das damit was passiert ist) und sie dann wieder ausgeben.
ich dachte das wäre nicht so schwer =) .. aber anescheind habe ich mich geirrt.
also mit jms hat das erstmal gar nichts zu tun? ich dachte die nachrichten werden dann über jms in den esb gespeist oder so.
webservice(client)----> esb ---> jms_nachricht als output ?
Ich habe mir ein beispiel gezogen. bekomme es nocht nicht zum laufen.. aber da bin ich dabei. könnt ihr mir nur vom code ca sagen ob ich den ablauf richtig verstanden habe ??
ich habe insgesamt 5 klassen:
eine davon:
Code:
package org.jboss.soa.esb.samples.quickstart.webservice_consumer1;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.WebParam;
@WebService(name = "HelloWorld", targetNamespace = "http://webservice_consumer1/helloworld")
public class HelloWorldWS{
@WebMethod
public String sayHello(@WebParam(name = "toWhom")
String toWhom)
{
String greeting = "Hello World Greeting for '" + toWhom + "' on " + new java.util.Date();
return greeting;
}
}
also das ist der webservice-client. richtig? der nimmt quasi die informationen entgegen. oder wie hier steht ja schon ein vordefinierter string der eine nachricht enthält. (frage dazu. wie kann ich ihn starten? eine main zum aufrufen gibt es ja nicht.)
dann zwei weitere klassen in einem paket: MyRequestAction und MyResponseAction
code von MyRequestAction
Code:
package org.jboss.soa.esb.samples.quickstart.webservice_consumer1;
import org.jboss.soa.esb.actions.AbstractActionLifecycle;
import org.jboss.soa.esb.actions.ActionUtils;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.message.Body;
import org.jboss.soa.esb.message.Message;
import java.util.HashMap;
public class MyRequestAction extends AbstractActionLifecycle
{
protected ConfigTree _config;
public MyRequestAction(ConfigTree config)
{
_config = config;
}
public Message noOperation(Message message)
{
return message;
}
/*
* Convert the message into a webservice request map.
*/
public Message process(Message message) throws Exception
{
logHeader();
String msgBody = (String) message.getBody().get();
HashMap requestMap = new HashMap();
// add paramaters to the web service request map
requestMap.put("sayHello.toWhom", msgBody);
// The "paramsLocation" property was set in jboss-esb.xml to
// "helloworld-request-parameters"
message.getBody().add(requestMap);
System.out.println("Request map is: " + requestMap.toString());
logFooter();
return message;
}
public void exceptionHandler(Message message, Throwable exception)
{
logHeader();
System.out.println("!ERROR!");
System.out.println(exception.getMessage());
System.out.println("For Message: ");
System.out.println(message.getBody().get());
logFooter();
}
// This makes it easier to read on the console
private void logHeader()
{
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
}
private void logFooter()
{
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
}
}
code von MyResponseAction
Code:
package org.jboss.soa.esb.samples.quickstart.webservice_consumer1;
import org.jboss.soa.esb.actions.AbstractActionLifecycle;
import org.jboss.soa.esb.actions.ActionUtils;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.message.Body;
import org.jboss.soa.esb.message.Message;
import java.util.Map;
public class MyResponseAction extends AbstractActionLifecycle
{
protected ConfigTree _config;
public MyResponseAction(ConfigTree config)
{
_config = config;
}
public Message noOperation(Message message)
{
return message;
}
/*
* Retrieve and output the webservice response.
*/
public Message process(Message message) throws Exception
{
logHeader();
// The "responseLocation" property was set in jboss-esb.xml to
// "helloworld-response"
Map responseMsg = (Map) message.getBody().get(Body.DEFAULT_LOCATION);
System.out.println("Response Map is: " + responseMsg);
logFooter();
return message;
public void exceptionHandler(Message message, Throwable exception)
{
logHeader();
System.out.println("!ERROR!");
System.out.println(exception.getMessage());
System.out.println("For Message: ");
System.out.println(message.getBody().get());
logFooter();
}
// This makes it easier to read on the console
private void logHeader()
{
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
}
private void logFooter()
{
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
}
}
also wenn ich das jetzt richtig verstanden habe. ist es der webservice der die nachricht entgegen nimmt oder wie hier schon vordefiniert hat. die requestklasse verarbeitet die nchricht und die response klasse gibt die nachricht wieder aus !? so erstmal richtig ??
dann habe ich noch zwei weitere klassen. deswegen bin ich auch darauf gekommen mit dem jms etc..
diese zwei klassen befinden sich in einem weiteren paket.: SendEsbMessage und SendJMSMessage
code sendesbmassage:
Code:
package org.jboss.soa.esb.samples.quickstart.webservice_consumer1.test;
import org.jboss.internal.soa.esb.rosetta.pooling.JmsConnectionPoolContainer;
import org.jboss.soa.esb.client.ServiceInvoker;
import org.jboss.soa.esb.message.Message;
import org.jboss.soa.esb.message.format.MessageFactory;
import org.jboss.soa.esb.message.format.MessageType;
import org.jboss.soa.esb.actions.StoreMessageToFile;
public class SendEsbMessage
{
/*
* Send a message directly the the ESB internal JMS listener. Demonstrates
* how one can bypass the gateway and speak directly to an ESB service.
*/
public void sendMessage(String message) throws Exception
{
// Create the delivery adapter for the target service (cache it)
System.setProperty("javax.xml.registry.ConnectionFactoryClass",
"org.apache.ws.scout.registry.ConnectionFactoryImpl");
// Create the delivery adapter for the target service (cache it)
ServiceInvoker deliveryAdapter = new ServiceInvoker("MyServiceCategory",
"WebserviceConsumer1");
// Create and populate the request message...
Message requestMessage = MessageFactory.getInstance().getMessage(
MessageType.JBOSS_XML);
requestMessage.getBody().add(message);
// Deliver the request message synchronously - timeout after 20
// seconds...
deliveryAdapter.deliverAsync(requestMessage);
}
public static void main(String args[]) throws Exception
{
SendEsbMessage sm = new SendEsbMessage();
// sm.sendMessage(args[0]);
sm.sendMessage("Hallo Leopold JuniorESB");
}
}
könnt ihr mir die zusammenhänge der verschiedenen klassen erklären damit ich mal so ein grundlegendes verständnis dafuer bekommen kann ? ich wäre euch so dankbar =) .. leider gibt es im netz ja nicht so extrem viele gute anleitungen.
package org.jboss.soa.esb.samples.quickstart.webservice_consumer1;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.WebParam;
@WebService(name = "HelloWorld", targetNamespace = "http://webservice_consumer1/helloworld")
public class HelloWorldWS{
@WebMethod
public String sayHello(@WebParam(name = "toWhom") String toWhom)
{
String greeting = "Hello World Greeting for '" + toWhom + "' on " + new java.util.Date();
return greeting;
}
}
also das ist der webservice-client. richtig? der nimmt quasi die informationen entgegen. oder wie hier steht ja schon ein vordefinierter string der eine nachricht enthält. (frage dazu. wie kann ich ihn starten? eine main zum aufrufen gibt es ja nicht.)
dann zwei weitere klassen in einem paket: MyRequestAction und MyResponseAction
code von MyRequestAction
Code:
package org.jboss.soa.esb.samples.quickstart.webservice_consumer1;
import org.jboss.soa.esb.actions.AbstractActionLifecycle;
import org.jboss.soa.esb.actions.ActionUtils;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.message.Body;
import org.jboss.soa.esb.message.Message;
import java.util.HashMap;
public class MyRequestAction extends AbstractActionLifecycle
{
protected ConfigTree _config;
public MyRequestAction(ConfigTree config)
{
_config = config;
}
public Message noOperation(Message message)
{
return message;
}
/*
* Convert the message into a webservice request map.
*/
public Message process(Message message) throws Exception
{
logHeader();
String msgBody = (String) message.getBody().get();
HashMap requestMap = new HashMap();
// add paramaters to the web service request map
requestMap.put("sayHello.toWhom", msgBody);
// The "paramsLocation" property was set in jboss-esb.xml to
// "helloworld-request-parameters"
message.getBody().add(requestMap);
System.out.println("Request map is: " + requestMap.toString());
logFooter();
return message;
}
public void exceptionHandler(Message message, Throwable exception)
{
logHeader();
System.out.println("!ERROR!");
System.out.println(exception.getMessage());
System.out.println("For Message: ");
System.out.println(message.getBody().get());
logFooter();
}
// This makes it easier to read on the console
private void logHeader()
{
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
}
private void logFooter()
{
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
}
}
code von MyResponseAction
Code:
package org.jboss.soa.esb.samples.quickstart.webservice_consumer1;
import org.jboss.soa.esb.actions.AbstractActionLifecycle;
import org.jboss.soa.esb.actions.ActionUtils;
import org.jboss.soa.esb.helpers.ConfigTree;
import org.jboss.soa.esb.message.Body;
import org.jboss.soa.esb.message.Message;
import java.util.Map;
public class MyResponseAction extends AbstractActionLifecycle
{
protected ConfigTree _config;
public MyResponseAction(ConfigTree config)
{
_config = config;
}
public Message noOperation(Message message)
{
return message;
}
/*
* Retrieve and output the webservice response.
*/
public Message process(Message message) throws Exception
{
logHeader();
// The "responseLocation" property was set in jboss-esb.xml to
// "helloworld-response"
Map responseMsg = (Map) message.getBody().get(Body.DEFAULT_LOCATION);
System.out.println("Response Map is: " + responseMsg);
logFooter();
return message;
public void exceptionHandler(Message message, Throwable exception)
{
logHeader();
System.out.println("!ERROR!");
System.out.println(exception.getMessage());
System.out.println("For Message: ");
System.out.println(message.getBody().get());
logFooter();
}
// This makes it easier to read on the console
private void logHeader()
{
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
}
private void logFooter()
{
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
}
}
also wenn ich das jetzt richtig verstanden habe. ist es der webservice der die nachricht entgegen nimmt oder wie hier schon vordefiniert hat. die requestklasse verarbeitet die nchricht und die response klasse gibt die nachricht wieder aus !? so erstmal richtig ??
------> Das sieht mir wie 2 Handler aus, die für den Request und die Response einige Sachen erledigen, wie z.B. das Logging.
vodn7v hat gesagt.:
dann habe ich noch zwei weitere klassen. deswegen bin ich auch darauf gekommen mit dem jms etc..
diese zwei klassen befinden sich in einem weiteren paket.: SendEsbMessage und SendJMSMessage
code sendesbmassage:
Code:
package org.jboss.soa.esb.samples.quickstart.webservice_consumer1.test;
import org.jboss.internal.soa.esb.rosetta.pooling.JmsConnectionPoolContainer;
import org.jboss.soa.esb.client.ServiceInvoker;
import org.jboss.soa.esb.message.Message;
import org.jboss.soa.esb.message.format.MessageFactory;
import org.jboss.soa.esb.message.format.MessageType;
import org.jboss.soa.esb.actions.StoreMessageToFile;
public class SendEsbMessage
{
/*
* Send a message directly the the ESB internal JMS listener. Demonstrates
* how one can bypass the gateway and speak directly to an ESB service.
*/
public void sendMessage(String message) throws Exception
{
// Create the delivery adapter for the target service (cache it)
System.setProperty("javax.xml.registry.ConnectionFactoryClass",
"org.apache.ws.scout.registry.ConnectionFactoryImpl");
// Create the delivery adapter for the target service (cache it)
ServiceInvoker deliveryAdapter = new ServiceInvoker("MyServiceCategory",
"WebserviceConsumer1");
// Create and populate the request message...
Message requestMessage = MessageFactory.getInstance().getMessage(
MessageType.JBOSS_XML);
requestMessage.getBody().add(message);
// Deliver the request message synchronously - timeout after 20
// seconds...
deliveryAdapter.deliverAsync(requestMessage);
}
public static void main(String args[]) throws Exception
{
SendEsbMessage sm = new SendEsbMessage();
// sm.sendMessage(args[0]);
sm.sendMessage("Hallo Leopold JuniorESB");
}
}
ich habe noch eine frage =) .. also das ganze läuft jetzt.
nur irgednwie scheint das genau umgekehrt zu sein.. möglich ?ß
also jms --> esb --> webservice ausgang
wenn ich das programm ausführe dann startet er in der klasse sendjmsmessage.
geht dann in die klasse requestaction. oder in die response klasse.. den utner schied kann ich noc nicht so ganz feststellen da in beiden klasen das gleiche steht.
ruft von da aus die webservice klasse auf:
Code:
package org.jboss.soa.esb.samples.quickstart.webservice_consumer1;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.WebParam;
@WebService(name = "HelloWorld", targetNamespace = "http://webservice_consumer1/helloworld")
public class HelloWorldWS
{
@WebMethod
public String sayHello(@WebParam(name = "toWhom")
String toWhom)
{
String greeting = "Hello World Greeting for '" + toWhom + "' on " + new java.util.Date();
return greeting;
}
}
danach wieder in die request oder response klasse und gibt dann die ausgabe aus...