Пользовательский 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 ответа
Это может помочь вам:
http://www.exampledepot.com/egs/java.util.zip/CompressFile.html
Хорошо. Я нашел решение. Решением является не изменение 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){
}
Выше приведен пример кода.
С Уважением,
Дирадж Джоши