如何将日志从 ActiveMQ Artemis 1.5.6 迁移到 2.7.0?
How can I migrate the Journal from ActiveMQ Artemis 1.5.6 to 2.7.0?
我想将我的(嵌入式)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()
您可以使用 Artemis data
工具导出和导入您的日记。
- 导航到您的 Artemis 1.5.6 实例的
bin
目录。
- 导出日志数据:
./artemis data exp > /tmp/export.xml
- 导航到您的 Artemis 2.7.0 实例的
bin
目录。
- 启动代理:
./artemis run
- 导入 1.5.6 期刊数据:
./artemis data imp --input /tmp/export.xml
导入需要 运行ning 代理,默认情况下它将尝试连接到 localhost:61616
。但是,如果需要,您可以使用 --host
和 --port
开关来更改它。
如果您更愿意直接使用底层 Java 而不是 command-line 工具,您可以执行类似这样的操作来导出:
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 版导出期刊,那么这些 类 必须来自 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
指向要导入数据的broker实例。
中看到许多这方面的工作示例
我想将我的(嵌入式)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()
您可以使用 Artemis data
工具导出和导入您的日记。
- 导航到您的 Artemis 1.5.6 实例的
bin
目录。 - 导出日志数据:
./artemis data exp > /tmp/export.xml
- 导航到您的 Artemis 2.7.0 实例的
bin
目录。 - 启动代理:
./artemis run
- 导入 1.5.6 期刊数据:
./artemis data imp --input /tmp/export.xml
导入需要 运行ning 代理,默认情况下它将尝试连接到 localhost:61616
。但是,如果需要,您可以使用 --host
和 --port
开关来更改它。
如果您更愿意直接使用底层 Java 而不是 command-line 工具,您可以执行类似这样的操作来导出:
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 版导出期刊,那么这些 类 必须来自 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
指向要导入数据的broker实例。