我创建了一个SQS使用者,该使用者应该立即选择一条消息,进行处理(平均花费20分钟),然后确认。但是,它正在执行的是,它立即选择所有消息(在队列中可用)并在飞行中移动它们(最烦人的部分),然后逐个处理,但最后一条消息仍会保留在飞行中,直到可见性超时到期为止(尽管所有其他消息都会被处理。
我尝试在接收中给出一个超时,但这没有用。我正在使用下面的代码轮询队列并相应地处理消息
public void startReceiving(String sqsServiceUrl, String queueName) throws JMSException {
String msgAsString = StringUtils.EMPTY;
do {
tryToReconnect(sqsServiceUrl, queueName);
msgAsString = receiveMessage(getMessageConsumer(sqsServiceUrl, queueName));
} while(!StringUtils.equalsIgnoreCase(msgAsString, "exit"));
}
private String receiveMessage(MessageConsumer consumer) throws JMSException {
Message message = consumer.receive(0);
String msgAsString = StringUtils.EMPTY;
} else {
try {
msgAsString = ((SQSTextMessage) message).getText();
/*Do some processing and overwrite msgAsString value with returned one*/
} catch (Exception e) {
LOG.error(e.getMessage());
}
finally{
message.acknowledge();
}
}
return msgAsString;
}
private void tryToReconnect(String sqsServiceUrl, String queueName) throws JMSException {
String currentHour = Calendar.getInstance().get(Calendar.DAY_OF_MONTH) + "-" + Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
if (!savedHour.equals(currentHour) || (session == null || messageConsumer == null)){
synchronized(lock){
if (messageConsumer == null){
savedHour = currentHour;
SQSConnection connection = createSqsConnection(sqsServiceUrl, queueName);
session = createSqsSession(connection);
messageConsumer = createMessageReciever(connection, queueName);
}
}
}
}
我正在无限循环的帮助下轮询队列,我想要这样的代码,以便它一次从队列中选择一条消息,对其进行处理,进行确认,然后仅选择下一个可用的消息。 / p>