AWS SQS:一次提取所有消息并转移到运行中,但是我希望它们被一个接一个地处理

时间:2019-07-15 15:20:20

标签: java amazon-web-services amazon-sqs

我创建了一个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>

0 个答案:

没有答案