WildFly JavaEE — запуск/остановка компонента, управляемого сообщениями, во время выполнения

У меня есть вопрос о компонентах, управляемых сообщениями (MDB). Есть ли способ генерировать их только во время выполнения? Я хочу предоставить способ в моем бэкэнде, чтобы начать или остановить получение сообщений. Он должен контролироваться через запись конфигурации в базе данных. При запуске WildFly также должен сначала проверить, можно ли запустить MDB.

Совместимо ли с Java EE обходиться без MDB и создавать прослушиватели вручную?

В настоящее время я использую следующий код

@MessageDriven(name = "MyMDB", activationConfig = {
        @ActivationConfigProperty(propertyName = "maxSession", propertyValue = "2"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/jms/queue/Test"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")})
public class JmsConsumer implements MessageListener {

    @Override
    public void onMessage(final Message msg) {

        if (msg instanceof TextMessage) {
            try {
                final String text = ((TextMessage) msg).getText();

                System.out.println("message: " + text + " (" + msg.getJMSRedelivered() + ")");

            } catch (final JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

Будет ли этот код также соответствовать Java EE?

@Singleton
@LocalBean
public class QueueWorkerManager {
    private InitialContext initialContext = null;
    private QueueConnectionFactory queueConnectionFactory = null;
    private Queue queue = null;
    private QueueConnection queueConnection = null;
    private QueueSession queueSession = null;
    private MessageConsumer consumer = null;

    @PostConstruct
    public void init() {
        try {
            this.initialContext = new InitialContext();
            this.queueConnectionFactory = (QueueConnectionFactory) initialContext
                    .lookup("java:/ConnectionFactory");

            this.queue = (Queue) initialContext.lookup(MyQueueSender.WORKER_QUEUE);
            this.queueConnection = queueConnectionFactory.createQueueConnection();
            this.queueSession = queueConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);

            this.consumer = queueSession.createConsumer(this.queue);
            this.consumer.setMessageListener(new ConsumerMessageListener());

            this.queueConnection.start();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @PreDestroy
    public void destroy() {
        this.stopConsumer(this.consumer;
        if(this.consumer != null) {
            try {
                this.consumer.close();
            } catch (JMSException e) {
            }
            this.consumer = null;
        }

        if(this.queueSession != null) {
            try {
                this.queueSession.close();
            } catch (JMSException e) {
            }
            this.queueSession = null;
        }

        if(this.queueConnection != null) {
            try {
                this.queueConnection.close();
            } catch (JMSException e) {
            }
            this.queueConnection = null;
        }
    }
}

public class ConsumerMessageListener implements MessageListener {

    @Override
    public void onMessage(Message message) {
        TextMessage textMessage = (TextMessage) message;
        try {
             System.out.println("message: " + textMessage.getText() + " (" + msg.getJMSRedelivered() + ")");
            message.acknowledge();
        } catch (JMSException | InterruptedException e) {          
            e.printStackTrace();
        }
    }

}

person Net_Hans    schedule 30.04.2020    source источник
comment
Как насчет приостановки очередей? activemq.apache.org/components/artemis/documentation/latest/ QueueControl может приостанавливать и возобновлять базовую очередь. Когда очередь приостановлена, она будет получать сообщения, но не доставлять их. Когда он возобновится, он начнет доставлять сообщения из очереди, если таковые имеются.   -  person ehsavoie    schedule 30.04.2020
comment
Я прочитал описанный вариант. К сожалению, полное прекращение доставки сообщений не является моей целью. Я ищу способ деактивировать отдельные экземпляры MDB. Я могу идентифицировать экземпляры, используя имя MDB или имя класса.   -  person Net_Hans    schedule 03.05.2020


Ответы (1)


Я бы посоветовал вам

  • добавьте аннотацию @DeliveryActive(false/true) к вашей MDB, чтобы загрузить ее в желаемом начальном состоянии
  • Используйте JMX или JBoss CLI для программного изменения значения атрибута active вашей MDB.

Здесь все объясняется: https://docs.wildfly.org/16/Developer_Guide.html#Message_Driven_Beans_Controlled_Delivery

Удачи

person TacheDeChoco    schedule 04.05.2020
comment
спасибо за помощь, если я смогу реализовать соединение JMX в программе, это будет хорошим решением. - person Net_Hans; 06.05.2020