Что происходит, если сообщение откатывается в MQ?

У меня была та же проблема, и я попробовал три разных способа удалить изображение. Иногда это работало, иногда это не так. После слишком большого количества времени, проведенного сейчас, каждый метод, который у меня есть, удалит изображение. Я хочу сказать следующее: БУДЬТЕ ОСТОРОЖНЫ С ОБРАБОТКОЙ BITMAP Я делал снимок, сохранял его, а затем поворачивал при необходимости:

public static Bitmap rotatePictureToPortraitMode(String filePath, Bitmap myBitmap) {
try {
    ExifInterface exif = new ExifInterface(filePath);
    int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
    Log.d("EXIF", "Exif: " + orientation);
    Matrix matrix = new Matrix();
    if (orientation == 6) {
        matrix.postRotate(90);
    } else if (orientation == 3) {
        matrix.postRotate(180);
    } else if (orientation == 8) {
        matrix.postRotate(270);
    }
    myBitmap = Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(), myBitmap.getHeight(), matrix, true); // rotating bitmap
} catch (Exception e) {

}
return myBitmap;
}

после этого я пытался удалить изображение, но, как я уже говорил ранее, оно не работало. Удаление этого метода помогло мне решить проблему.

Может быть, это была только моя проблема, но как только я удалил это, это мне очень помогло, поэтому я хочу сказать осторожно, как вы обрабатываете изображение. Для моего случая я использовал ответ, который упоминался ранее:

File file = new File(photoUri);
file.delete();

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, 
Uri.fromFile(new File(photoUri)))); 

Надеюсь, это поможет!

6
задан T.Rob 5 September 2010 в 02:44
поделиться

3 ответа

Если вы выполняете операции с очередью в рамках транзакции, и происходит откат, то после разрешения транзакции очередь и сообщение появятся так же, как и до начала транзакции. Другими словами, никаких изменений вообще.

В сценарии большого объема, однако, типично иметь несколько транзакционных считывателей и записывающих устройств в одной очереди, и они не блокируют всю очередь для каждого удаления из очереди или постановки в очередь.

Эти средства чтения и записи будут вставлять элементы в очередь или выводить элементы из очереди транзакционным способом, пока выполняется ваша обреченная транзакция. В этом случае другие элементы очереди могут появиться или исчезнуть (или и то, и другое).

Если после отката исходной транзакции вы снова удаляете из очереди, вы можете получить исходное сообщение, но не можете. В большом объеме, сценарий с высоким уровнем параллелизма, возможно, что другой читатель извлечет сообщение до того, как ваш код сможет это сделать.

7
ответ дан 8 December 2019 в 16:09
поделиться

Откат оставляет сообщение в очереди и помещает его для повторной доставки.

Однако, когда (настраиваемый) предел попыток повторной доставки был достигнут, сообщение откладывается в «очередь недоставленных сообщений».

Типичным примером, когда это происходит, являются sc 'подозрительные сообщения': сообщения, с которыми невозможно справиться из-за фундаментальных и временных проблем (например, недопустимый формат, отсутствующие поля и т. Д.).

Поэтому, прежде чем выполнять откат (и помещать сообщение обратно в очередь), обязательно подумайте, является ли ошибка временной (например, разрывается соединение с серверной частью) или нет.

В последнем случае лучше проглотить сообщение и зарегистрировать ошибку или запустить другое предупреждение. В противном случае сообщение будет без необходимости потреблять как вычислительную мощность, так и инфраструктуру очереди.

4
ответ дан 8 December 2019 в 16:09
поделиться

Чтобы ответить на пару конкретных вопросов из этой беседы ...

  • Сообщение сохраняет свою позицию в очереди. GET в точке синхронизации блокирует сообщение, но не удаляет его из очереди и не меняет его положение. Откат снимает блокировку и делает сообщение доступным для повторной доставки.
  • Автоматическое повторное создание подозрительного сообщения происходит с классами JMS и XMS, но не с собственными API Java, C, C #, COBOL и т. Д. Если вы не используете JMS или XMS (которые реализуют JMS API для программ на C и .Net), вам необходимо повторно поставить сообщение в очередь.
  • Вы правы, что повторная постановка в очередь будет предпринята для очереди, указанной в атрибуте BOQNAME входной очереди, после превышения количества повторных доставок BOQTHRESH. Если эта очередь недоступна (полная, неавторизованная, несуществующая и т. Д.), Выполняется попытка DLQ. Если это не удается, прослушиватель сообщений вообще перестает получать сообщения.
  • В идеале программа будет обрабатывать подозрительное сообщение, повторно ставя его в очередь и предупреждая о наличии сообщений в очереди исключений. В противном случае, по крайней мере, не просто переваривайте и не отбрасывайте сообщение. Зарегистрируйте его вместе с заголовками сообщений, чтобы кто-нибудь позже мог согласовать, что с ним произошло.
4
ответ дан 8 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

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