2017-02-23 2 views
0

Ich muss die Nachrichtenweiterleitung deaktivieren, wenn der Benutzer die Verarbeitung nicht durchführt und die Sitzungszurücksetzung aufruft. Das Ziel besteht darin, die Nachricht selbst ohne erneute Zustellung in der Warteschlange zu belassen, und meine Kunden im Hintergrund werden weiterhin versuchen, die Nachricht zu verarbeiten.ActiveMQ-Nachrichtenredelieferung deaktivieren

In connection.getRedeliveryPolicy(), sehe ich Optionen zur Anpassung der Nachlieferungsverzögerungen und andere Einstellungen, aber ich sehe keine Option, um die erneute Zustellung vollständig zu deaktivieren. Ist das sogar möglich (vorzugsweise programmgesteuert mit den Attributen connection.getRedeliveryPolicy())

Antwort

0

Leider gibt es keine Lösung, um die RedeliveryPolicy zu deaktivieren, aber Sie können Ihren Code anders entwerfen.

einen hier Blick ActiveMQ redelivery does not work

vielleicht org.apache.activemq.ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE kann Ihnen helfen, aber denken Sie daran, dies:

Sobald der Broker eine Prefetch-Grenze Anzahl der Nachrichten zu einen Verbraucher es wird nicht Versand abgesandt hat weitere Nachrichten an diesen Verbraucher bis der Verbraucher hat mindestens 50% der vorab geholten Nachrichten, zB prefetch/2, die es erhalten bestätigt. Wenn der Broker hat die Bestätigungen empfangen werden, werden sie eine weitere prefetch/2 Anzahl der Nachrichten an den Verbraucher versenden ‚top-up‘, wie es war, ihre Vorabrufpuffer. Beachten Sie, dass es möglich ist, ein Vorabruflimit für jeden Kunden festzulegen (siehe unten).

Eine andere Lösung besteht darin, Nachrichten an eine andere Warteschlange für Hintergrundverbraucher zu senden.

0

Nun, es gibt ein paar Tricks, die Sie tun können.

Die typische Art und Weise ist die eingebaute DLQ Funktionalität und lassen Sie Ihre Rollback-Nachrichten an DLQ Kopf zu verwenden. Dann können Sie jedes Verfahren haben, das versucht, diese Nachrichten anschließend zu behandeln.

Aber wenn Sie wirklich die zurückgerollt Nachrichten in der Warteschlange behalten möchten „wie sie ist“ und nicht durch die Verbraucher mehr als einmal berührt, kann es auch erreicht werden.

Zuerst. Setzen Sie maximale Rücklieferungen auf Eins, d. H. Nachricht wird einmal wiederholt.

ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
RedeliveryPolicy policy = new RedeliveryPolicy(); 
policy.setMaximumRedeliveries(1); 
cf.setRedeliveryPolicy(policy); 

Stellen Sie dann sicher, dass nur nicht erneut übermittelte Nachrichten mit einem Selektor empfangen werden.

MessageConsumer cons = sess.createConsumer(sess.createQueue("FOOBAR"), "JMSRedelivered <> true"); 

Um die zurückrollenden Nachrichten zu lesen, müssten Sie mit dem umgekehrten Selektor lesen. Unabhängig davon empfehle ich immer noch eine separate Warteschlange für die zurückgerollten Nachrichten, wie die eingebaute DLQ. Viel einfacher zu handhaben und weniger fehleranfällig.

Verwandte Themen