Camel ルーターを使用して、5 分間隔でアクティブな MQ のキュー 1 (デッド レター キュー) からキュー 2 にメッセージを移動しようとしています。これを達成するために以下のコードを使用しています:-
public class MessageRouteBuilder extends RouteBuilder {
private static final Logger LOG =
LoggerFactory.getLogger(MessageRouteBuilder.class);
/*
* (non-Javadoc)
*
* @see org.apache.camel.builder.RouteBuilder#configure()
*/
@Override
public void configure() throws Exception {
LOG.info("Routing of camel is started");
CronScheduledRoutePolicy startPolicy = new CronScheduledRoutePolicy();
startPolicy.setRouteStartTime("0 0/5 * * * ?");
from(
"jms:queue:DLQ.Consumer.OUTDOCS.VirtualTopic.queue1")
.routeId("DLQMessageMoverID").routePolicy(startPolicy)
.noAutoStartup()
.to("jms:queue:Consumer.OUTDOCS.VirtualTopic.queue1");
LOG.info("Routing of camel is done");
}
}
@Startup
@Singleton
public class ScheduledMessageDLQConsumer {
@Inject
private MessagingUtil msgUtil;
@Inject
private MessageRouteBuilder builder;
private static final Logger LOG =
LoggerFactory.getLogger(ScheduledMessageDLQConsumer.class);
@PostConstruct
public void init() {
LOG.info("camel Scheduling scheduled started");
CamelContext camelContext = new DefaultCamelContext();
ConnectionFactory connectionFactory = msgUtil.getAMQConnectionFactory();
camelContext.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
try {
camelContext.addRoutes(builder);
camelContext.start();
LOG.info("Camel scheduling completed");
} catch (Exception e) {
// TODO Auto-generated catch block
LOG.error("Error in registering camel route builder", e);
}
LOG.info(" camel Scheduling scheduled completed");
}
}
ここでの問題は次のとおりです。- キャメル ルーティングが 5 分後に有効になります。メッセージを DLQ (DLQ.Consumer.OUTDOCS.VirtualTopic.queue1) から queue1 (Consumer.OUTDOCS.VirtualTopic.queue1) に移動します。しかし、メッセージが poison の場合、メッセージは再び DLQ に戻り、ルーティングによってメッセージが DLQ から通常のキューに移動され、このプロセスは無限に実行され続けます。
私の要件は、ルーティングが 5 分ごとにメッセージを DLQ からキューに 1 回だけ移動する必要があることです。有害なメッセージが表示された場合は、5 分後に確認する必要があります。