Тайм-аут чтения для SocketChannel [дубликат]

Из ответа Димы Кудоша и на основе https://stackoverflow.com/a/5700744/2240489 мне пришлось сделать следующее: я удалил ссылку на PARTITION BY в sql и заменил с результатом ORDER BY.

AModel.objects.annotate(
    cumsum=Func(
        Sum('a_number'), 
        template='%(expressions)s OVER (ORDER BY %(order_by)s)', 
        order_by="id"
    ) 
).values('id', 'cumsum').order_by('id', 'cumsum')

Это дает следующий sql:

SELECT "amodel"."id",
SUM("amodel"."a_number") 
OVER (ORDER BY id) AS "cumsum" 
FROM "amodel" 
GROUP BY "amodel"."id" 
ORDER BY "amodel"."id" ASC, "cumsum" ASC

Ответ Димы Кудоша не суммировал результаты, но это было сделано выше.

14
задан Tim Cooper 15 May 2013 в 16:24
поделиться

3 ответа

Вы также можете подумать о том, чтобы сделать ваш канал неблокируемым и просто использовать System.currentTimeMillis ().

-1
ответ дан Bat0u89 22 August 2018 в 07:03
поделиться

Если вы знакомы с использованием Java Selector, вы можете эмулировать тайм-аут сокета самостоятельно с помощью селектора. Полезно видеть sun.nio.ch.SocketAdaptor.

Следует соблюдать осторожность при использовании Thread.interrupt (). SocketChannel - прерыватель канала. Когда вы читаете описание InterruptibleChannel, Thread.interrupt () вызывает закрытие SocketChannel. Если вы хотите использовать SocketChannel после таймаута, вы не можете использовать функцию InterruptibleChannel.

2
ответ дан Eugene Chung 22 August 2018 в 07:03
поделиться

В соответствии с этой статьей SocketChannel не будет таймаутом для своей операции чтения, но вы можете получить этот эффект от чтения из канала по-другому.

SocketChannel socketChannel;
socketChannel.socket().setSocketTimeout(500);
InputStream inStream = socketChannel.socket().getInputStream();
ReadableByteChannel wrappedChannel = Channels.newChannel(inStream);

чтение из wrappedChannel будет тайм-аут в соответствии с параметром socketTimeOut, который вы установили.

14
ответ дан luke 22 August 2018 в 07:03
поделиться
  • 1
    хорошее решение. Java ... застрял – Jiang YD 11 September 2015 в 06:45
  • 2
    Это не правильный способ сделать это, только обходной путь. Правильный способ - использовать Selector.select (timeout) в цикле и проверить soTimeout / connectTimeout с помощью if-check – wzona 13 October 2016 в 10:55
  • 3
    setSocketTimeout теперь setSoTimeout, но работает одинаково. – Pedro Estevao 7 March 2018 в 17:47
Другие вопросы по тегам:

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