私の構成は次のとおりです。
- アクティブMQ 5.15.1
- atomikosトランザクションjms 4.0.6
- スプリング ブート 2.1.7.RELEASE
JmsTemplate.convertAndSend
私のアプリケーションはSpringメソッドでメッセージを送信しています:
import org.springframework.jms.core.JmsTemplate;
@Component
@Slf4j
public class AsynchronousMajProducer {
@Autowired
private ActiveMQConfig activeMQConfig;
@Autowired
private JmsTemplate jmsTemplate;
private void convertAndSend(String msg) {
jmsTemplate.convertAndSend(activeMQConfig.privateQueue(), msg, message -> {
String[] versionParts = buildProperties.getVersion().split("\\.");
String version = versionParts[0] + "." + versionParts[1];
message.setStringProperty("VERSION", version);
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 2000);
return message;
});
}
}
長時間 (数週間) 実行した後、一部のキューはメッセージをエンキューしなくなりました (一部は正常に機能します)。
失敗した場合、convertAndSend メソッドは例外をスローせず、すべて問題ないように見えますが、最終的には何もエンキューされません (AMQ コンソールのエンキュー カウントは増加しません)。
以下は、送信が成功したときの AMQ ログです。
2019-11-22 09:37:29,647 | INFO | Sending message: ActiveMQTextMessage {commandId = 8, responseRequired = false,
messageId = ID:NMI16510-60675-1574375565048-1:23:2:1:1, originalDestination = null, originalTransactionId = null,
producerId = ID:NMI16510-60675-1574375565048-1:23:2:1, destination = queue://testportail,
transactionId = XID:[1096044365,globalId=3137322e31372e36352e37372e746d313537343337353834383839343030343731,
branchId=3137322e31372e36352e37372e746d343732], expiration = 1574375885026, timestamp = 1574375849026,
arrival = 0, brokerInTime = 0, brokerOutTime = 0, correlationId = null, replyTo = null, persistent =
true, type = null, priority = 9, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false,
userID = null, content = org.apache.activemq.util.ByteSequence@15d17509, marshalledProperties = org.apache.activemq.util.ByteSequence@34beb533,
dataStructure = null, redeliveryCounter = 0, size = 1122, properties = {VERSION=2.0, AMQ_SCHEDULED_DELAY=2000},
readOnlyProperties = false, readOnlyBody = false, droppable = false, jmsXGroupFirstForConsumer = false,
text = {
"type" : "MAJ_CONTACT",
"id" : 124
}} | org.apache.activemq.broker.util.LoggingBrokerPlugin | ActiveMQ Transport: tcp:///172.17.65.77:61220@61611
2019-11-22 09:37:32,001 | DEBUG | Firing: Job [id=ID:NMI16510-60675-1574375565048-1:23:2:1:1, startTime=Fri Nov 22 09:37:30 NCT 2019,
delay=2000, period=0, repeat=0, nextTime=Fri Nov 22 09:37:32 NCT 2019, executionCount = 1] | org.apache.activemq.store.kahadb.scheduler.JobSchedulerImpl
| JobScheduler:JMS
2019-11-22 09:37:32,002 | DEBUG | Set message ID:NMI16510-60675-1574375565048-1:23:2:1:1 timestamp from 1574375849026 to 1574375852002
| org.apache.activemq.broker.scheduler.SchedulerBroker | JobScheduler:JMS
2019-11-22 09:37:32,003 | DEBUG | ACTIVEMQ Message ID:NMI16510-60675-1574375565048-1:23:2:1:1 sent to queue://testportail
| org.apache.activemq.broker.region.Queue | JobScheduler:JMS
失敗すると、最初のログしか取得しませんSending message
。AMQ ログに ERROR または WARN メッセージはありません。影響を受けるキューと影響を受けないキューがあることに気付きました。
問題を「修正」するには、次のことを行う必要があります。
- ブローカーを停止する
- このフォルダを削除:
/apache-activemq-5.15.1/data/ACTIVEMQ/scheduler
- ブローカーを再起動します
本番環境では、この問題を予測するために毎日行っています。アプリケーションによって以前に送信されたがエンキューされていないメッセージは確実に失われるため、これは良い解決策ではありません。
AMQ スケジューラの既知の問題ですか? AMQ を頻繁に再起動するのは悪い/良い習慣ですか?