Мы переходим от 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 кажется, что у нас нет такого типа темы.