Пользовательский DataHandler для SOAP с использованием Java

У меня есть приложение, где два процесса общаются с помощью SOAP. Файл передается из процесса A в процесс B. Где процесс B сохранит его в БД.

opqData.setBase64Binary(new DataHandler(new FileDataSource(file)));

где файл - это данные, которые необходимо сохранить в БД. Однако теперь я хочу заархивировать данные при сохранении их в БД. Один из вариантов - заархивировать файл и отправить его как FileDataSource. Однако я не могу использовать его, потому что у нас есть более 1000 таких файлов, и это создает много записей zip в структуре файла, а создание zip - это дополнительные издержки.

Поэтому я думал реализовать DataHandler как GzipDataHandler, и возвращаемый поток ввода - это gzipInputStream для обработки B. Таким образом, данные будут заархивированы и сохранены в БД.

Однако я запутался, как написать метод getInputStream для моего нового GzipDataHandler.

Кто-нибудь пробовал что-то подобное раньше? Или я могу получить какие-либо указатели от экспертов по Java и SOAP?

Спасибо,
Дирадж Джоши

2 ответа

Решение

Хорошо. Я нашел решение. Решением является не изменение DataHandler, а изменение FileDataSource.

Создайте новый FileDataSource, скажем, ZipFileDataSource, расширьте FileDataSource и реализуйте метод getInputStream.

Ваш метод getInputStream должен прочитать файл, а GZIPOutputStream должен сжать его, и он должен быть передан по каналу вызывающей стороне.

final PipedOutputStream pos = new PipedOutputStream();
final PipedInputStream pis = new PipedInputStream(pos);
FileInputStream fis = null;
GZIPOutputStream gos = null;
byte[] buffer = new byte[1024];
try {
    fis = new FileInputStream(MyFile);
    gos = new GZIPOutputStream(pos);
        int length;
        while ((length = fis.read(buffer, 0, 1024)) != -1)
    gos.write(buffer, 0, length);
        fis.close();
} catch(Exception e){

}

Выше приведен пример кода.

С Уважением,
Дирадж Джоши

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