Как настроить распределенную тему или очередь, используя Apache MQ со свойствами JNDI, а также внедрить MQ в сервер приложений - PullRequest
0 голосов
/ 11 октября 2018

Мы переходим от weblogic jms к activemq.Мы поместили все необходимые jar-файлы activemq в наш путь к классу приложения и создали один файл свойств, содержащий URL-адрес activemq и сведения о подключении, как показано ниже:

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory

java.naming.provider.url=tcp://localhost:61616

connectionFactoryNames=TestTopicConnectionFactory

topic.mq/TestTopic=TestTopic

During server startup we are loading this properties file as below and starting the MQ broker srevice.

public TestServlet extends HttpServlet {
    private MQStartup mqStartup = null;
    @Override
    public void init(ServletConfig config)
            throws ServletException {
            super.init(config);
            mqStartup = new MQStartup();
            mqStartup.startBrokerService();
    }
}
public class MQStartup {
    private final String bindAddress;
    private BrokerService broker = new BrokerService();

    public MQStartup(){
        MQContext context = new MQContext();
        context.loadJndiProperties();
        bindAddress = ActiveMQContext.getProperty("java.naming.provider.url");
    }

    public void startBrokerService() {
        broker.addConnector(bindAddress);
        broker.start();
    }

    public void stopBrokerService() {
        try {
            broker.stop();
        }catch (Exception e) {
            logger.error("Unable to stop the MQ Broker service " +e);
        }
    }
}


public class MQContext {
    private static final Object singletonLock = new Object();
    static Context context = null;
    static Properties properties = null;
    private boolean loaded = false;

    public void loadJndiProperties() {
        try {
            if (!loaded) {
                synchronized (singletonLock) {
                    URL url = getClass().getClassLoader().getResource("jda-activemq-jndi.properties");
                    properties = new Properties();
                    properties.load(url.openStream());
                    context = new InitialContext(properties);
                    loaded = true;
                }
            }
        } catch (IOException | NamingException ie) {
            logger.error("Failed to load apachemq jndi", ie);
        }
    }

    public static Context getContext() {
        return context;
    }

    public static Properties getProperties() {
        return properties;
    }

    public static String getProperty(String propertyName) {
        return properties.getProperty(propertyName);
    }
}

В классе реализации для создания сообщения мы получаем lq mfact connectionfactory ниже:

TopicConnectionFactory factory = (TopicConnectionFactory) MQContext.getContext().lookup("<topicFactoryName>");

this.topicConnection = factory.createTopicConnection();
this.topicConnection.start();

, а затем создаем тематическую сессию и используем publisher.publish ("message");

Но проблема здесь в том, что у нас есть 3 экземпляра приложения в кластере, и для этих 3 экземпляров мывстроенный брокер службы activemq 3.

Когда я создаю одно сообщение и отправляю в instance1 (предположим, веб-сервер переходит в instance1), это сообщение не используется экземпляром other2.

Я гуглил, что есть некоторыеКонфигурация сетевого разъема может помочь.Но проблема в том, что мы используем JNDI, а MQ не является отдельной установкой.

Есть ли способ сделать это с помощью встроенного MQ и JNDI.

Примечание: В weblogic у нас есть тип темы UniformDistributedTopic , который помогает достичь вышеуказанного, но в MQ кажется, что у нас нет такого типа темы.

...