niedziela, 31 sierpnia 2008

Mule "echo" przykład

Po długim okresie nie pisanie czas wrócić do ESB w szczególności Mule 2.0, od czasu mojego ostatniego wpisu na temat instalacji Mule, na stronie projektu ukazała się ogromna ilość dokumentacji :) www.mulesource.org . Więc startujemy tworzymy nowy Mule 2.0 projekt:

Klikamy "Finish" i już mamy projekt stworzony:) Więc tak pierwsze zadanie to stworzyć klasę która będzie sprawdzała czy przekazana wartość z standardowego wejścia to "lukasz" jeśli tak to wypisze przywitanie w innym wypadku rzuci wyjątek.
Więc postępując zgodnie z dobrymi praktykami programistycznymi stworzymy interfejs:
package com.itsilesia;

/**
* @author lipka
*
*/
public interface Echo {
String echoMessage(String echo);
}

teraz implementujemy nasz interfejs:
package com.itsilesia;

/**
* @author lipka
*
*/
public class EchoUMOComponent implements Echo {

public String echoMessage(String echo) {
if(echo.equals("lukasz")){
return "Witaj "+echo;
}else{
throw new IllegalArgumentException("Zle dane");
}
}

}

skoro już mamy klasę, zostało nam tylko teraz napisać odpowiedni plik konfiguracyjny który przeczyta coś ze standardowego wyjścia prześle do naszego komponentu EchoUMOComponent a w razie nie powodzenia będzie w stanie obsłużyć wyjątek (w naszym wypadku wypisać na konsole).
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:stdio="http://www.mulesource.org/schema/mule/stdio/2.0"
xmlns:vm="http://www.mulesource.org/schema/mule/vm/2.0"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.mulesource.org/schema/mule/core/2.0 http://www.mulesource.org/schema/mule/core/2.0/mule.xsd
http://www.mulesource.org/schema/mule/stdio/2.0 http://www.mulesource.org/schema/mule/stdio/2.0/mule-stdio.xsd
http://www.mulesource.org/schema/mule/vm/2.0 http://www.mulesource.org/schema/mule/vm/2.0/mule-vm.xsd">
<description>Very simple echo example.</description>
<stdio:connector name="SystemStreamConnector"
promptMessage="Wpisz czarodziejskie slowo: " messageDelayTime="1000" />
<model name="echo">
<service name="displayingMessage">
<inbound>
<stdio:inbound-endpoint system="IN" />
</inbound>
<component class="com.itsilesia.EchoUMOComponent" />
<outbound>
<outbound-pass-through-router>
<stdio:outbound-endpoint system="OUT" />
</outbound-pass-through-router>
</outbound>
<default-service-exception-strategy>
<stdio:outbound-endpoint system="OUT" />
</default-service-exception-strategy>
</service>
</model>
</mule>

Krótki opis tego tagów z pliku myecho-config.xml:
  • xsi:schemaLocation="http://www.springframework.org/schema/.. -importujemy niezbędną przestrzeń nazw do dalszej konfiguracji Mule
  • stdio:connector - definiujemy konektor który czyta z standardowego wejścia czyli konsoli i do tego wypisuje nam komunikat zachęcający do wpisanie czegoś
  • model nazwa przez nas stworzonego modelu przetwarzania informacji
  • service name="displayingMessage" tworzenie naszego serwisu
  • inbound określenie danych wejściowych, na które ma reagować nasz model, w naszym przypadku reaguje on na wpisanie wyrazu i wciśnięcie klawisza ENTER
  • component class="com.itsilesia.EchoUMOComponent" po przejściu przez inbound informacja jest przekazywana do naszego komponentu, gdzie następuje przetwarzanie odebranej informacji
  • outbound i outbound-pass-through-router wyłapują informacje po przejściu przez nasz komponent i w naszym wypadku wypisują przetworzoną informacje na standardowe wyście
  • default-service-exception-strategy ten element wyłapuje wyjątki lecące w aplikacji i wypisuje je na standardowe wyjście
Więc wszytko gotowe teraz tylko uruchomić:

********************************************************************************
* A Fatal error has occurred while the server was running: *
* com.itsilesia.EchoUMOComponent (java.lang.ClassNotFoundException) *
* *
* The error is fatal, the system must shutdown *
* Server started: 01.01.70 01:00 *
* Server shutdown: 31.08.08 14:27 *
********************************************************************************

niestety Mule nie mogło znaleźć naszej klasy, musimy ja tam skopiować, najszybciej po prostu zrobić jara za pomocą Eclipse export i potem skopiować go do katalogu gdzie zainstalowaliśmy Mule a dokładni do katalogu lib/user/

Uruchamiamy nasz przykład:
lukasz-lipkas-computer:~/Documents/workspace/MyEcho lipka$ mule -config conf/myecho-config.xml

Wpisz czarodziejskie slowo:
lukasz

INFO 2008-08-31 15:09:23,509 [SystemStreamConnector.dispatcher.1] org.mule.transport.stdio.StdioMessageDispatcher: Connected: StdioMessageDispatcher{this=7d08eb, endpoint=stdio://system.out, disposed=false}
Witaj lukasz

Wpisz czarodziejskie slowo:
lipka
ERROR 2008-08-31 15:09:26,291 [displayingMessage.3] org.mule.service.DefaultServiceExceptionStrategy:
********************************************************************************
Message : Component that caused exception is: displayingMessage. Message payload is of type: String
Type : org.mule.api.service.ServiceException
Code : MULE_ERROR--2
JavaDoc : http://mule.mulesource.org/docs/apidocs/org/mule/api/service/ServiceException.html
Payload : lipka
********************************************************************************
Exception stack is:
1. Zle dane (java.lang.IllegalArgumentException)
com.itsilesia.EchoUMOComponent:16 (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/IllegalArgumentException.html)
2. Component that caused exception is: displayingMessage. Message payload is of type: String (org.mule.api.service.ServiceException)
org.mule.component.DefaultLifecycleAdapter:214 (http://mule.mulesource.org/docs/apidocs/org/mule/api/service/ServiceException.html)
********************************************************************************
Root Exception stack trace:
java.lang.IllegalArgumentException: Zle dane
at com.itsilesia.EchoUMOComponent.echoMessage(EchoUMOComponent.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.mule.model.resolvers.AbstractEntryPointResolver.invokeMethod(AbstractEntryPointResolver.java:147)
at org.mule.model.resolvers.ReflectionEntryPointResolver.invoke(ReflectionEntryPointResolver.java:127)
at org.mule.model.resolvers.DefaultEntryPointResolverSet.invoke(DefaultEntryPointResolverSet.java:50)
at org.mule.component.DefaultLifecycleAdapter.intercept(DefaultLifecycleAdapter.java:202)
at org.mule.component.AbstractJavaComponent.invokeComponentInstance(AbstractJavaComponent.java:82)
at org.mule.component.AbstractJavaComponent.doOnCall(AbstractJavaComponent.java:73)
at org.mule.component.AbstractComponent.onCall(AbstractComponent.java:87)
at org.mule.model.seda.SedaService$ComponentStageWorker.run(SedaService.java:533)
at org.mule.work.WorkerContext.run(WorkerContext.java:310)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
at java.lang.Thread.run(Thread.java:613)

********************************************************************************

ERROR 2008-08-31 15:09:26,292 [displayingMessage.3] org.mule.service.DefaultServiceExceptionStrategy: Message being processed is: org.mule.transport.DefaultMessageAdapter/org.mule.transport.DefaultMessageAdapter@2ed6f9{id=099b0bf3-775e-11dd-a41e-b944827db778, payload=java.lang.String, correlationId=null, correlationGroup=-1, correlationSeq=-1, encoding=UTF-8, exceptionPayload=org.mule.message.DefaultExceptionPayload@237817}
ExceptionMessage{message=lipka, context={MULE_ORIGINATING_ENDPOINT=endpoint.stdio.system.in}exception=org.mule.api.service.ServiceException: Component that caused exception is: displayingMessage. Message payload is of type: String, componentName='displayingMessage', endpointUri=stdio://system.in, timeStamp=Sun Aug 31 15:09:26 CEST 2008}

Wszystko działa więc teraz trzeba będzie to trochę skomplikować i w następnym wpisie połączyć to z jakimś serwerem ftp i jms.