Как можно передать OutputStream по каналу к StreamingDataHandler?

Я просматривал документы AWS для красного смещения и похоже, что Функция INTCAP может решить ваш вариант использования

Для справки => https: //docs.aws.amazon. com / redshift / latest / dg / r_INITCAP.html

Краткое описание (скопировано)

Функция INITCAP создает первую букву каждого слова в строке заглавные буквы, а любые последующие буквы делаются (или оставляются) строчными. Поэтому важно понимать, какие символы (кроме пробелов) функционируют как разделители слов. Символ разделителя слов - это любой не алфавитно-цифровой символ, включая знаки пунктуации, символы и управляющие символы. Все следующие символы являются разделителями слов:

! "# $% & amp; '() * +, -. /:; < =>? @ [\] ^ _` {|} ~

И в вашем случае вы объявили имя поля как event_date который преобразуется в Event_Date.

И затем вы можете использовать функцию REPLACE для замены подчеркивания '_'

Для справки => https: // docs. aws.amazon.com/redshift/latest/dg/r_REPLACE.html

8
задан Dan Lew 14 May 2009 в 21:53
поделиться

3 ответа

Я нашел ответ в том же духе, о котором говорил Кристиан (создание нового потока для выполнения writeToOut ()):

@MTOM
@WebService
class Example {
    @WebMethod
    public @XmlMimeType("application/octet-stream") DataHandler service() {
        // Create piped output stream, wrap it in a final array so that the
        // OutputStream doesn't need to be finalized before sending to new Thread.
        PipedOutputStream out = new PipedOutputStream();
        InputStream in = new PipedInputStream(out);
        final Object[] args = { out };

        // Create a new thread which writes to out.
        new Thread(
            new Runnable(){
                public void run() {
                    writeToOut(args);
                    ((OutputStream)args[0]).close();
                }
            }
        ).start();

        // Return the InputStream to the client.
        DataSource ds = new ByteArrayDataSource(in, "application/octet-stream");
        DataHandler dh = new DataHandler(ds);
        return dh;
    }
}

Это немного сложнее из-за final , но, насколько я могу судить, это правильно. Когда поток запускается, он блокируется при первой попытке вызвать out.write () ; в то же время входной поток возвращается клиенту, который разблокирует запись, прочитав данные. (Проблема с моими предыдущими реализациями этого решения заключалась в том, что я не

4
ответ дан 5 December 2019 в 20:18
поделиться

Шаблон оболочки? : -).

Пользовательская реализация javax.activation.DataSource (всего 4 метода), чтобы сделать это?

return new DataHandler(new DataSource() { 
  // implement getOutputStream to return the stream used inside writeToOut() 
  ... 
});   

У меня нет IDE для тестирования, поэтому я делаю только предложение. Мне также понадобится общий макет writeToOut :-).

1
ответ дан 5 December 2019 в 20:18
поделиться

Извините, я сделал это только для C #, а не java, но я думаю, что ваш метод должен запускать поток для выполнения "writeToOut (out);" в парралеле. Вам нужно создать специальный поток и передать его новому потоку, который передаст этому потоку writeToOut. После запуска потока вы возвращаете этот объект потока вызывающей стороне.

Если у вас есть только метод, который записывает в поток и возвращает впоследствии, и другой метод, который потребляет поток и возвращает его впоследствии, другого пути нет.

] Конечно, сложнее всего заполучить такой многопоточный безопасный поток: он должен блокировать каждую сторону, если внутренний буфер переполнен.

Не знаю, работает ли Java-pipe-stream для этого.

3
ответ дан 5 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: