Apache Camel - exchange.getIn(). GetBody(ZipFile.class) возвращает NULL, но exchange.getOut(). SetBody(zipfile) работает нормально

Я пытаюсь заархивировать сообщение (String) в zip-файл, а затем установить его как тело объекта обмена в Apache Camel, чтобы одна из последующих служб (также использующая Apache Camel) могла извлечь zip-файл. файл с использованием exchange.getIn().getBody() метод.

Первая часть хороша, я могу установить zip-файл на body, но когда я пытаюсь получить это на другой стороне очереди (Active MQ), exchange.getIn().getBody(ZipFile.class) возвращается null, На самом деле, body сам по себе null,

С чего бы это?

Я попытался отправить нормальную строку в теле, и это работало нормально. Файл (ZipFile) не установлен, интересно, почему.

Вот фрагменты кода -

Маршрут -

from(some_route)
.bean(SomeClass.class, "zipAndSend")
.to("activemq:queue:" + somequeue)

Чтобы сжать файл -

public void zipAndSend(Exchange exchange) throws Exception {
        String incomingMessage;
        try {
            incomingMessage = exchange.getIn().getBody().toString();
            File file = ZipUtil.createFile(incomingMessage);
            String zipFilePath = file.getPath().replace(".xml", ".zip");
            ZipFile zipFile = ZipUtil.zipFile(file.getPath(), zipFilePath);

            exchange.getOut().setHeader("Compressed", "Y");
            exchange.getOut().setHeader("ZipFilePath", zipFilePath);
            exchange.getOut().setBody(zipFile);

//the body is set correctly here, so far so good

        } catch (Exception e) {
            e.printStackTrace(); //other operations


        }
    }

public static File createFile(String incomingMessaage) {

        String fileName = "C:\\Project\\ZipUnzipTest\\incoming.xml";
        File file = new File(fileName);
        try {
            FileUtils.writeStringToFile(file, incomingMessaage);
        } catch (Exception e) {
            //log.error("Error in Writing Message into file " + fileName, e);
            String errorFile = fileName.replace("work", "error");
        }
        return file;
    }

В другом сервисе (конец очереди) я переопределяю process() метод, как показано ниже, чтобы иметь возможность извлечь сообщение (String) обратно из файла внутри zip-файла.

public void process(Exchange exchange) throws WorkflowDBException,
            Exception {

        try {
            ZipFile zipFile = exchange.getIn().getBody(ZipFile.class); //NPE as body is null
            String zipFilePath = exchange.getIn().getHeader("ZipFilePath").toString();
            File inFile = ZipUtil.unzipFile(zipFile, "C:\\Project\\ZipUnzipTest\\Output\\WF", true);
            String incomingMessage;
            incomingMessage = FileUtils.readFileToString(inFile, "UTF-8");
} catch (Exception e) {e.printStackTrace();}
}

Зависимости -

<dependency>
            <groupId>net.lingala.zip4j</groupId>
            <artifactId>zip4j</artifactId>
            <version>1.3.2</version>
        </dependency>
<dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>

Я ожидаю, что содержание тела будет таким же в in а также out пространство. Увы, это не так.

1 ответ

Оказывается, верблюд (среди прочих рамок) обрабатывает bytes[] скорее лучше. Я преобразовал ZipFile в byte arrayи использовал его для установки body из exchange объект.

incomingMessage = exchange.getIn().getBody().toString();
File file = ZipUtil.createFile(incomingMessage);
String zipFilePath = file.getPath().replace(".xml", ".zip");
ZipFile zipFile = ZipUtil.zipFile(file.getPath(), zipFilePath);
messageData = FileUtils.readFileToByteArray(new File(zipFilePath));

exchange.getOut().setHeader("Compressed", "Y");
exchange.getOut().setHeader("ZipFilePath", zipFilePath);
exchange.getOut().setBody(messageData);

И во время чтения я использовал ZipInputStream чтобы получить Zip Entry из ByteArrayInputStream,

byte [] bytes = exchange.getIn().getBody(byte[].class);
ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(bytes));
try {
    StringBuilder s = new StringBuilder();
    StringBuilder temp = new StringBuilder();
    byte[] buffer = new byte[1024];
    int read = 0;
    ZipEntry entry;
    while ((entry = zipStream.getNextEntry())!= null) {
        while ((read = zipStream.read(buffer, 0, 1024)) >= 0) {
            s.append(new String(buffer, 0, read));
        }
        temp = temp.append(s);
        s.setLength(0);
    }
    return temp.toString();
} catch (Exception e) {
            e.printStackTrace();
}

Да это оно. Все еще открыты для других способов решить эту проблему:)

Другие вопросы по тегам