# Webservice, allgemeine Fragen



## vodn7v (10. Sep 2008)

Hallo,
ich habe ein paar allegemeine fragen zu webservices und deren aufbau.

ich möchte einen webservice erstellen der per jms nachrichten empfängt und wieder ausgibt.

brauch ich dafuer diese annotationen? oder sind die nur ein hilfsmittel.
zwingend erforderlich ? wofuer genau da ??


danke euch !!


----------



## foobar (10. Sep 2008)

Webservice per JMS? Du willst wohl 2 Systeme per JMS koppeln. Das hat aber nichts mit Webservices zu tun.


----------



## vodn7v (10. Sep 2008)

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.

womit fange ich da am besten an ??


danke dir !!


----------



## lhein (10. Sep 2008)

Im Bus wird meist JMS benutzt, das ist korrekt. Aber der Weg vom Client zum Webservice-Öhrchen am Bus ist ein anderer.


----------



## vodn7v (10. Sep 2008)

also kann man das ca so sehen ?


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:


```
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

```
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


```
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:

```
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");
   }
}
```


code sendjms message:



```
package org.jboss.soa.esb.samples.quickstart.webservice_consumer1.test;

import java.util.Properties;

import javax.jms.JMSException;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class SendJMSMessage {
    QueueConnection conn;
    QueueSession session;
    Queue que;
    
    
    public void setupConnection() throws JMSException, NamingException
    {
        Properties properties1 = new Properties();
		properties1.put(Context.INITIAL_CONTEXT_FACTORY,
				"org.jnp.interfaces.NamingContextFactory");
		properties1.put(Context.URL_PKG_PREFIXES,
				"org.jboss.naming:org.jnp.interfaces");
		properties1.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099");
		InitialContext iniCtx = new InitialContext(properties1);

    	Object tmp = iniCtx.lookup("ConnectionFactory");
    	QueueConnectionFactory qcf = (QueueConnectionFactory) tmp;
    	conn = qcf.createQueueConnection();
    	que = (Queue) iniCtx.lookup("queue/quickstart_webservice_consumer1_Request_gw");
    	session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
    	conn.start();
    	System.out.println("Connection Started");
    }
    
    public void stop() throws JMSException 
    { 
        conn.stop();
        session.close();
        conn.close();
    }
    
    public void sendAMessage(String msg) throws JMSException {
    	
        QueueSender send = session.createSender(que);        
        ObjectMessage tm = session.createObjectMessage(msg);
        send.send(tm);        
        send.close();
    }
       
    
    public static void main(String args[]) throws Exception
    {        	    	
    	SendJMSMessage sm = new SendJMSMessage();
    	sm.setupConnection();
    //	sm.sendAMessage(args[0]); 
    	sm.sendAMessage("Hallo Leopold Junior"); 
    	sm.stop();
    	
    }
    
}
```


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.

ich danke euch vielmals !!


----------



## lhein (10. Sep 2008)

Eher so:

Webservice-Client  --- SOAP/HTTP/etc. --> ESB Webservice Binding Component --- JMS/JCA/SEDA/etc. --> other Bus Endpoint 

und dann halt noch den Weg zurück.


----------



## vodn7v (10. Sep 2008)

ok   das macht sinn =) .. habe meinen beitrag oben editiert. ich hoffe du erschreckst dich nicht =)


----------



## lhein (10. Sep 2008)

vodn7v hat gesagt.:
			
		

> ich habe insgesamt 5 klassen:
> 
> eine davon:
> 
> ...



-----> Das ist der Webservice, der im Bus läuft.




			
				vodn7v hat gesagt.:
			
		

> dann zwei weitere klassen in einem paket: MyRequestAction und MyResponseAction
> code von MyRequestAction
> 
> ```
> ...



------> 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
> 
> ...



--------> die Klassen übernehmen anscheinend das Versenden der JMS Message im Bus.


Genaueres kann ich Dir da nicht bieten, da ich den JBoss ESB noch nie verwendet hab.

lhein


----------



## vodn7v (10. Sep 2008)

ok danke dir fuers erste... dann muss ich mal zusehen das ich mich hier irgednwie zurecht finde.

danke !!


----------



## vodn7v (10. Sep 2008)

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:


```
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...


kann das sein ?

danke dir!!!


----------

