Вы можете использовать репозиторий Spring Data, чтобы сделать это следующим образом:
public interface LogRepository extends JpaRepository<Log, Long> {
// just get one or null
Log findOneByCreatedByAndCreatedDate(Instant createdBy, Instant createdDate);
// get all, but pagable
List<Log> findAllByCreatedByAndCreatedDate(Instant createdBy, Instant createdDate, Pageable pageable);
}
Я предполагаю, что вы используете Instant
как метку времени, но это также должно работать для других типов дат Java 8 или старый Date
класс.
В рамках вашей бизнес-логики вы теперь можете позвонить:
Log log = logRepository.findOneByCreatedByAndCreatedDate(YOUR_TIMESTAMP, Instant.now());
// or
Log allLogs = logRepository.findOneByCreatedByAndCreatedDate(YOUR_TIMESTAMP, Instant.now(), PageRequest.of(0, 50));
Стандарт POSIX определяет, что с MSG_PEEK «данные обрабатываются как непрочитанные, и следующая функция recv () или аналогичная функция все равно будет возвращать эти данные». Похоже, это означает, что если ret2 не равно -1, он будет таким же, как ret1.
Вы также должны учитывать возможность того, что другой вызов recv в другом потоке может быть вызван между ret1 и ret2. Этот другой вызов получит ваши данные, в результате чего ret2 останется без данных или с неожиданно меньшим объемом данных.
Если ваше приложение не является многопоточным или спроектировано так, что fd используется только этими двумя вызовами, тогда вы можете проигнорировать это. Но если это риск, то вам следует поместить два вызова в механизм блокировки.
I'm not sure about EAGAIN, but think that EBADF or ECONNRESET are possible.
В вашем простом случае последующий recv вернет количество байтов ret1 (если ret1 не было ошибкой). Однако для многопоточного дизайна это не всегда может быть правдой.