Как я могу перенести журнал из ActiveMQ Artemis 1.5.6 в 2.7.0? - PullRequest
0 голосов
/ 09 мая 2019

Я хотел бы перенести мой (встроенный) ActiveMQ Artemis с 1.5.6 на 2.7.0, но при запуске я получаю ошибку о несовместимости журнала.

2019-05-09 17:10:08,762 main            org.apache.activemq.artemis.core.server  ERROR AMQ224000: Failure in initialisation
java.lang.IllegalStateException: This is using old journal data, export your data and import at the correct version
        at org.apache.activemq.artemis.core.persistence.impl.journal.AbstractJournalStorageManager.loadMessageJournal(AbstractJournalStorageManager.java:912)
        at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.loadJournals(ActiveMQServerImpl.java:2980)
        at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.initialisePart2(ActiveMQServerImpl.java:2690)
        at org.apache.activemq.artemis.core.server.impl.LiveOnlyActivation.run(LiveOnlyActivation.java:72)
        at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.internalStart(ActiveMQServerImpl.java:564)
        at org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl.start(ActiveMQServerImpl.java:501)
        at org.apache.activemq.artemis.jms.server.impl.JMSServerManagerImpl.start(JMSServerManagerImpl.java:376)
        at org.apache.activemq.artemis.jms.server.embedded.EmbeddedJMS.start(EmbeddedJMS.java:131)

Как я могу перенести сообщения без потериданные?

Я нашел изменение, которое вводит новый формат (https://issues.apache.org/jira/browse/ARTEMIS-1009), но я не нашел информации о том, как перенести или как использовать старый формат.

Сервер 2.7.0 запускаю следующим образом:

Configuration configuration = new ConfigurationImpl();
configuration.setJMXManagementEnabled(false);

configuration.setPersistenceEnabled(true);
configuration.setBindingsDirectory(persistenceLocation + "bindings");
configuration.setJournalDirectory(persistenceLocation + "journal");
configuration.setPagingDirectory(persistenceLocation + "paging");
configuration.setLargeMessagesDirectory(persistenceLocation + "largemessages");

configuration.addAddressesSetting("#", new AddressSettings().setAutoCreateJmsQueues(false).setAutoDeleteJmsQueues(false));
configuration.addAcceptorConfiguration("in-vm", "vm://0");
configuration.addAcceptorConfiguration("tcp","tcp://" +host+  ":" + port + "?anycastPrefix=jms.queue.");

configuration.setSecurityEnabled(true);
Set<Role> roles = new HashSet<>();
roles.add(new Role(PRODUCER, true, false, false, false, false, false, false, false, false, false));
roles.add(new Role(CONSUMER, false, true, false, false, false, false, false, false, false, false));
configuration.putSecurityRoles("#", roles);

JMSQueueConfigurationImpl queueConfig = new JMSQueueConfigurationImpl();
queueConfig.setDurable(true);
queueConfig.setName("Provisioning");

JMSConfiguration jmsConfig = new JMSConfigurationImpl();
jmsConfig.getQueueConfigurations().add(queueConfig);

SecurityConfiguration securityConfiguration = new SecurityConfiguration();
securityConfiguration.addUser(user, password);
securityConfiguration.addRole(user, PRODUCER);
securityConfiguration.addRole(user, CONSUMER);
securityConfiguration.setDefaultUser(user);

ActiveMQSecurityManager securityManager = new ActiveMQJAASSecurityManager(InVMLoginModule.class.getName(),
                        securityConfiguration);
// Start server
EmbeddedJMS server = new EmbeddedJMS();
server.setJmsConfiguration(jmsConfiguration);
server.setConfiguration(configuration);
server.setSecurityManager(securityManager);
server.start()

1 Ответ

0 голосов
/ 09 мая 2019

Вы можете использовать инструменты Artemis data для экспорта и импорта журнала.

  1. Перейдите в каталог bin вашего экземпляра Artemis 1.5.6.
  2. Экспорт данных журнала: ./artemis data exp > /tmp/export.xml
  3. Перейдите в каталог bin вашего экземпляра Artemis 2.7.0.
  4. Запустите посредника: ./artemis run
  5. Импорт данных журнала 1.5.6: ./artemis data imp --input /tmp/export.xml

Для импорта требуется работающий посредник, и по умолчанию он попытается подключиться к localhost:61616.Однако вы можете использовать переключатели --host и --port, чтобы изменить это при необходимости.

Если вы предпочитаете работать непосредственно с базовым Java, а не с инструментами командной строки, вы можете сделать что-то вродеэто для экспорта:

import java.io.ByteArrayOutputStream;
import org.apache.activemq.artemis.cli.commands.tools.xml.XmlDataExporter;
...
ByteArrayOutputStream xmlOutputStream = new ByteArrayOutputStream();
XmlDataExporter xmlDataExporter = new XmlDataExporter();
xmlDataExporter.process(xmlOutputStream, "BindingsDirectory", "JournalDirectory", "PagingDirectory", "LargeMessagesDirectory");
System.out.print(new String(xmlOutputStream.toByteArray()));

Это должно быть выполнено версией, родной для экспортируемого журнала, поэтому, например, если вы хотите экспортировать журнал из версии 1.5.6, тогда эти классы должныприходят из jar 1.5.6, так как это версия, которая может правильно читать журнал.

Чтобы импортировать, вы можете запустить что-то вроде этого:

import java.io.ByteArrayInputStream;
import org.apache.activemq.artemis.cli.commands.tools.xml.XmlDataImporter;
...
ByteArrayInputStream xmlInputStream = new ByteArrayInputStream(xmlOutputStream.toByteArray());
XmlDataImporter xmlDataImporter = new XmlDataImporter();
xmlDataImporter.validate(xmlInputStream);
xmlInputStream.reset();
xmlDataImporter.process(xmlInputStream, session);

Здесь session указывает наэкземпляр брокера, в который вы хотите импортировать данные.

Вы можете увидеть множество рабочих примеров этого в ActiveMQ Artemis test-suite .

...