Чем мне нравится Apache Camel, так это готовыми компонентами конечных точек(endpoints) на все случаи жизни. В моей жизни встретилась задача, по Base64 кодированию/декодированию множества файлов.
Схема работы приложения следующая:
В соответствующие папки будут кидаться файлики, результат будет формироваться в папке output:
c://data/encode
c://data/decode
c://data/output
Идеальная задача для Apache Camel!
Как обычно создаем Maven Project на основе уже известного нам camel-archetype-java.
Добавляем в зависимости к проекту сommon-codec, с помощью которого будет проводиться кодирование/декодирование
Декодировщик:
Добавляем наши 2 процессора в spring-контекст
Схема работы приложения следующая:
В соответствующие папки будут кидаться файлики, результат будет формироваться в папке output:
c://data/encode
c://data/decode
c://data/output
Идеальная задача для Apache Camel!
Как обычно создаем Maven Project на основе уже известного нам camel-archetype-java.
Добавляем в зависимости к проекту сommon-codec, с помощью которого будет проводиться кодирование/декодирование
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>
Создаем два процессора которые будут кодировать и раскодировать поступающие сообщения.Декодировщик:
package com.bssys.base64.convert;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.commons.codec.binary.Base64;
public class Base64DecodeProcessor implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
// TODO Auto-generated method stub
InputStream is = exchange.getIn().getBody(InputStream.class);
String fileName = (String)exchange.getIn().getHeader(Exchange.FILE_NAME);
BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
int pos=-1;
while((pos= bufferedInputStream.read(buf))!=-1){
byteArrayOutputStream.write(buf, 0, pos);
}
bufferedInputStream.close();
byte[] encodeBytes = Base64.decodeBase64(byteArrayOutputStream.toByteArray());
exchange.getOut().setHeader(Exchange.FILE_NAME, fileName);
exchange.getOut().setBody(encodeBytes);
}
}
Кодировщик:
package com.bssys.base64.convert;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.commons.codec.binary.Base64;
public class Base64EncodeProcessor implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
// TODO Auto-generated method stub
InputStream is = exchange.getIn().getBody(InputStream.class);
String fileName = (String)exchange.getIn().getHeader(Exchange.FILE_NAME);
BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte buf[] = new byte[1024];
int pos = -1;
while ((pos = bufferedInputStream.read(buf)) != -1) {
byteArrayOutputStream.write(buf, 0, pos);
}
bufferedInputStream.close();
byte[] encodeBytes = Base64.encodeBase64(byteArrayOutputStream
.toByteArray());
exchange.getOut().setHeader(Exchange.FILE_NAME, fileName);
exchange.getOut().setBody(encodeBytes);
}
}
Добавляем наши 2 процессора в spring-контекст
<bean id="Base64Encode" class="com.bssys.base64.convert.Base64EncodeProcessor"/>
<bean id="Base64Decode" class="com.bssys.base64.convert.Base64DecodeProcessor"/>
И модифицируем MyRouteBuilder.java добавив в него 2 роутера:
public void configure() {
// TODO create Camel routes here.
from("file:c://data/encode").convertBodyTo(InputStream.class).to("Base64Encode").to("file:c://data/outbox");
from("file:c://data/decode").convertBodyTo(InputStream.class).to("Base64Decode").to("file:c://data/outbox");
}
Запускаем и наслаждаемся. Apache Camel слушает заданные папки, и при поступлении файликов выполняет за нас всю черную работу.
Комментариев нет:
Отправить комментарий