Удалить Thread.sleep () в случае отправки сообщения в ActiveMQ - PullRequest
0 голосов
/ 04 июня 2018

Я исправлял ошибку сонара в моем проекте.Я видел блок кода, где сонар lint дает мне ошибку правила squid:S2276, чтобы заменить Thread.sleep (100);с ожиданием ().Но wait () должен быть в условном цикле, чтобы избежать ложной проблемы с пробуждением.Но я не получаю такого состояния, как я должен использовать.

Могу ли я достичь того же самого без сна ()

public class ACTOOBEventSubSMSProducer {

private ACTOOBEventSubSMSProducer(){
    super();
}
private static Logger logger = LoggerManager.getInstance().getCoreProcessingLogger();
public static final String CONNECTION_FACTORY = "java:jboss/activemq/ConnectionFactory";
static final String QUEUE_NAME = "java:jboss/exported/jms/queue/actOOBEventSubscriptionSMS";
static ConnectionFactory connectionFactory = null;
static Connection connection = null;
static Session session = null;
static Destination destination = null;
static MessageProducer messageProducer = null;

static {
    connectionFactory = ServiceLocator.getJmsConnectionFactory(CONNECTION_FACTORY);
    try {
        connection = connectionFactory.createConnection();
        session = connection.createSession(false, Session.DUPS_OK_ACKNOWLEDGE);
        destination = ServiceLocator.getJmsDestination(QUEUE_NAME);
        messageProducer = session.createProducer(destination);
        messageProducer.setDisableMessageID(true);
        messageProducer.setDisableMessageTimestamp(true);
    } catch (JMSException e) {
        logger.error("Error in creating ConnectionFactory",e);
    }
}

/**
 * This method sends OOB Event SMS Message in Queue.
 * 
 * @param message
 */
public static synchronized void sendMessage(Serializable payload) throws JmsProducerException {
    try {
        ObjectMessage message = session.createObjectMessage(payload);
        messageProducer.send(message, javax.jms.DeliveryMode.NON_PERSISTENT, javax.jms.Message.DEFAULT_PRIORITY,
                1800000);
    } catch (JMSException je) {
        try {
            Thread.sleep(100);
            ObjectMessage message = session.createObjectMessage(payload);
            messageProducer.send(message, javax.jms.DeliveryMode.PERSISTENT, javax.jms.Message.DEFAULT_PRIORITY,
                    1800000);
        } catch (JMSException jee) {
            logger.error("Error in sendMessage()",jee);
            throw new JmsProducerException(jee);
        } catch (InterruptedException ie) {
            logger.error("Error in sendMessage()",ie);
            Thread.currentThread().interrupt();
            throw new JmsProducerException(ie);
        }
    } catch (ServiceLocatorException sle) {
        logger.error("Error in sendMessage()",sle);
        throw new JmsProducerException(sle);
    }
}

}

1 Ответ

0 голосов
/ 05 июня 2018

Тщательно созданный цикл for с числом итераций, представляющим собой количество попыток повторения, и некоторую логику обработки исключений, чтобы разорвать цикл, если что-то будет работать, возможно, чуть более понятным образом, иначе, используя ScheduledThreadPoolExecutor илиили таймер будет вариант.

...