Пользовательский DataHandler для SOAP с использованием Java - PullRequest
0 голосов
/ 31 января 2012

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 31 января 2012
0 голосов
/ 31 января 2012

Хорошо. Я нашел решение. Решение не в том, чтобы изменить 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){

}

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

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

...