środa, 17 września 2008

Mule z JMS

Zadanie na dzisiaj odebrać z ftp plik o rozszerzeniu xml i na podstawie tego pliku stworzyć odpowiedni obiekt, który będzie wysłany do odpowiednich kolejek w JMS (Apache activemq) (jak to zainstalować było opisane w Apache ActiveMQ instalacja ). Jak pobrać plik z ftp wiemy, należy tylko napisać komponent który po odberaniu pliku z serwisu ftp, będzie go w stanie sparsować. Sztuczka polega na tym, żeby nasz komponent implementował interfejs org.mule.api.lifecycle.Callable i po pobraniu pliku odpowiednio zaimplementować metodę onCall z interfejsu Callable. Więc tworzymy komponent RequestCreator który na podstawie pliku xml (a dokoładnie tagu ) będzie tworzył pdf ->PdfRerquest albo color -> ColorProofingRequest. Przykładowy plik xml:

<request> <name>pdf</name> <paramter>300dpi</paramter> </request>

Nasz klasa RequestCreator wygląda tak:


package com.itsilesia.jmsexample;

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.mule.api.MuleEventContext;
import org.mule.api.MuleMessage;
import org.mule.api.lifecycle.Callable;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

/**
* @author lipka
*
*/
public class RequestCreator implements Callable {

public Object onCall(MuleEventContext context) throws Exception {
MuleMessage message = context.getMessage();
String xmlFile = message.getPayloadAsString();
try {
DocumentBuilder documnetBuilder = DocumentBuilderFactory
.newInstance().newDocumentBuilder();
Document document = documnetBuilder.parse(new InputSource(
new StringReader(xmlFile)));

document.getDocumentElement().normalize();

NodeList list = document.getElementsByTagName("request");

for (int i = 0; i < list.getLength(); i++) {
Node request = list.item(i);
if (request.getNodeType() == Node.ELEMENT_NODE) {
Element requestElement = (Element) request;
NodeList nameList = requestElement
.getElementsByTagName("name");
Element nameElement = (Element) nameList.item(0);

NodeList textNameList = nameElement.getChildNodes();
String name = ((Node) textNameList.item(0)).getNodeValue().trim();
p(name);

NodeList paramterList = requestElement
.getElementsByTagName("paramter");
Element paramterElement = (Element) paramterList.item(0);

NodeList textParamterList = paramterElement.getChildNodes();

String parameters = ((Node) textParamterList.item(0)).getNodeValue().trim();
p(parameters);

if(name.equals("pdf")){
PdfRequest pdfRequest = new PdfRequest();
pdfRequest.setParamters(parameters);
return pdfRequest;
}
if(name.equals("color")){
ColorProofingRequest colorProofingRequest = new ColorProofingRequest();
colorProofingRequest.setParamters(parameters);
return colorProofingRequest;
}
}
}
} catch (Exception e2) {
p("exception");
e2.printStackTrace();
}
return false;
}

void p(String string) {
System.out.println(string);
}
}


Więc mamy klasę która pobiera PayloadAsString czyli przerabia nasz plik xml w String potem jest parsowany i w zależności od nazwy tworzymy klasę PdfRequest albo ColorProofingRequest. Oby dwie klasy wyglądają identycznie, jedna dla przykładu:


package com.itsilesia.jmsexample;

import java.io.Serializable;

/**
* @author lipka
*
*/
public class PdfRequest implements Serializable{
private String paramters;

/**
* @return the paramters
*/
public String getParamters() {
return paramters;
}

/**
* @param paramters the paramters to set
*/
public void setParamters(String paramters) {
this.paramters = paramters;
}
}


Teraz pozostaje nam podłączyć JMS do mule, musimy dodać więc kolejną linie do naszego pliku konfiguracyjnego:

<jms:activemq-connector name="jmsCon" brokerURL="tcp://localhost:61616" />

później trzeba zdefiniować transformacje, żeby stworzony przez nasz obiekt wsadzić do JMS:
<jms:object-to-jmsmessage-transformer name="ObjectToJMS" />
teraz pozostaje nam jeszcze w zależności od zwróconego przez RequestCreator klasy wrzucić dany obiekt do odpowiedniej kolejki, a w przypadku gdy żaden obiekt nie będzie pasował wrzucamy go do kolejki request.invalid, więc tak wygląda obsługa wrzucenie czegoś do kolejki:

<forwarding-catch-all-strategy>
<jms:outbound-endpoint queue="request.invalid" />
</forwarding-catch-all-strategy>
<filtering-router>
<jms:outbound-endpoint queue="request.pdf" transformer-refs="ObjectToJMS"/>
<payload-type-filter expectedType="com.itsilesia.jmsexample.PdfRequest"/>
</filtering-router>
<filtering-router>
<jms:outbound-endpoint
queue="request.colorproofing" transformer-refs="ObjectToJMS" />
<payload-type-filter expectedType="com.itsilesia.jmsexample.ColorProofingRequest"/>
</filtering-router>

a cały plik konfiguracyjny wygląda tak:

<?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:stdio="http://www.mulesource.org/schema/mule/stdio/2.0"
xmlns:file="http://www.mulesource.org/schema/mule/file/2.0"
xmlns:xm="http://www.mulesource.org/schema/mule/xml/2.0"
xmlns:ftp="http://www.mulesource.org/schema/mule/ftp/2.0"
xmlns:jms="http://www.mulesource.org/schema/mule/jms/2.0"
xsi:schemaLocation="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/file/2.0
http://www.mulesource.org/schema/mule/file/2.0/mule-file.xsd
http://www.mulesource.org/schema/mule/xml/2.0
http://www.mulesource.org/schema/mule/xml/2.0/mule-xml.xsd
http://www.mulesource.org/schema/mule/ftp/2.0
http://www.mulesource.org/schema/mule/ftp/2.0/mule-ftp.xsd
http://www.mulesource.org/schema/mule/jms/2.0 http://www.mulesource.org/schema/mule/jms/2.0/mule-jms.xsd">

<description>JMS connector</description>

<jms:activemq-connector name="jmsCon"
brokerURL="tcp://localhost:61616" />

<jms:object-to-jmsmessage-transformer name="ObjectToJMS" />

<model>
<service name="jmsService">
<inbound>
<ftp:inbound-endpoint user="lipka" password="****"
host="localhost" port="21" path="/Users/lipka/in"
pollingFrequency="10000">
<file:filename-wildcard-filter pattern="*.xml" />
</ftp:inbound-endpoint>
</inbound>
<component class="com.itsilesia.jmsexample.RequestCreator" />
<outbound>
<forwarding-catch-all-strategy>
<jms:outbound-endpoint queue="request.invalid" />
</forwarding-catch-all-strategy>
<filtering-router>
<jms:outbound-endpoint queue="request.pdf" transformer-refs="ObjectToJMS"/>
<payload-type-filter expectedType="com.itsilesia.jmsexample.PdfRequest"/>
</filtering-router>
<filtering-router>
<jms:outbound-endpoint
queue="request.colorproofing" transformer-refs="ObjectToJMS" />
<payload-type-filter expectedType="com.itsilesia.jmsexample.ColorProofingRequest"/>
</filtering-router>
</outbound>
</service>
</model>
</mule>

Uruchamiamy jconsole, żeby śledzić co się dzieje w Active MQ
uruchamiamy mule:
lukasz-lipkas-computer:~/Documents/workspace/JMSRequest lipka$ mule -config conf/jmsticket-config.xml

wrzucamy jakieś pliki xml, prawidłowy lub nie:) i patrzymy jak zapełniają się nasze kolejki w Apache Active MQ
Mule:
Jak widać nasz request zostały umieszczone w kolejkach:) Więc w następnym wpisie trzeba będzie je pobrać i na przykład przekazać jako parametry do jakiegoś programu, chyba, że ktoś ma jakiś inny pomysł:)każdy pomysł mile widziany:)

Brak komentarzy: