Mongock 变更日志文件在本地系统中执行,但部署后不在服务器上执行

问题描述 投票:0回答:1

能够在本地成功执行 Mongock 变更日志文件,但当我将应用程序 jar 部署到服务器时,变更日志文件无法执行。我也没有收到任何错误。我可以在服务器上看到 mongockChangelog 和 mongockLock 集合,但更改日志文件未执行。我也无法在日志中看到该打印语句。

我无法找出为什么我的变更日志文件没有在服务器上执行。我使用的是 spring-mvc 版本 5.3.31 当我在本地 tomcat 中部署 jar 时,上述场景在我的本地系统中运行良好。 以下是我的代码:

构建.gradle

def mongockJarsVersion="5.3.2"
    implementation 'com.reflexis:ztm-mongock:1.0'
    implementation group: 'io.mongock', name: 'mongock-api', version: "${mongockJarsVersion}"
    implementation group: 'io.mongock', name: 'mongock-driver-api', version: "${mongockJarsVersion}"
    implementation group: 'io.mongock', name: 'mongock-driver-core', version: "${mongockJarsVersion}"
    implementation group: 'io.mongock', name: 'mongock-runner-core', version: "${mongockJarsVersion}"
    implementation group: 'io.mongock', name: 'mongock-standalone-base', version: "${mongockJarsVersion}"
    implementation group: 'io.mongock', name: 'mongock-utils', version: "${mongockJarsVersion}"
    implementation group: 'io.mongock', name: 'mongodb-v3-driver', version: "${mongockJarsVersion}"

    def mongockProfessionalJarsVersion="5.2.2"
    implementation group: 'io.mongock.professional', name: 'mongock-standalone', version: "${mongockProfessionalJarsVersion}"
    implementation group: 'io.mongock.professional', name: 'mongock-runner-common', version: "${mongockProfessionalJarsVersion}"
    implementation group: 'io.mongock.professional', name: 'mongock-api', version: "${mongockProfessionalJarsVersion}"

    implementation group: 'io.mongock', name: 'jwt-api', version: '1.0.3'
    implementation group: 'org.apache.maven', name: 'maven-artifact', version: '3.6.1'
    implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
    implementation group: 'org.javassist', name: 'javassist', version: '3.28.0-GA'
    implementation group: 'org.reflections', name: 'reflections', version: '0.10.1'
    implementation group: 'javax.inject', name: 'javax.inject', version: '1'
    implementation group: 'org.objenesis', name: 'objenesis', version: '3.2'

变更日志文件

@ChangeLog
public class SystemCodeChangeLog {

    @ChangeSet(order="1", id="appVersionSystemCodes", author= MongockAppInitialization.MONGOCK_AUTHOR, runAlways=true)
    public void appVersionSystemCodes(MongoDatabase mongoDatabase) {
        System.out.println("SystemCodeChangeLog appVersionSystemCodes start...!");
        // insert code
    }
}

MongoApp初始化

@MongockCliConfiguration(sources = RunnerBuilderProviderImpl.class)
public class MongockAppInitialization {

    public static String DATABASE_NAME = null;
    public final static String MONGOCK_CHANGE_LOG_COLLECTION_NAME = "mongockChangeLog";
    public final static String MONGOCK_SCAN_PACKAGE = "com.mongockengine.changelog";
    public final static String MONGOCK_AUTHOR = "ztm-engg";

    public static void initializeMongock() {
        try {
            System.out.println("MongockAppInitialization initializeMongock start...!");
           
            new RunnerBuilderProviderImpl(DATABASE_CONFIG, DATABASE_NAME,
                    MONGOCK_SCAN_PACKAGE)
                    .getBuilder()
                    .buildRunner()
                    .execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.ClientSession;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import io.mongock.driver.mongodb.v3.driver.MongoCore3Driver;
import io.mongock.runner.core.builder.RunnerBuilder;
import io.mongock.runner.core.builder.RunnerBuilderProvider;
import io.mongock.runner.standalone.MongockStandalone;
import org.bson.codecs.configuration.CodecRegistries;
import org.bson.codecs.configuration.CodecRegistry;
import org.bson.codecs.pojo.PojoCodecProvider;

import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;

public class RunnerBuilderProviderImpl implements RunnerBuilderProvider {
    private static String MONGODB_CONNECTION_STRING = null;

    private String MONGODB_MAIN_DB_NAME = null;
    private String MONGOCK_SCAN_PACKAGE = null;
    public RunnerBuilderProviderImpl(String MONGODB_CONNECTION_STRING, String MONGODB_MAIN_DB_NAME, String MONGODB_SCAN_PACKAGE) {
        this.MONGODB_CONNECTION_STRING = MONGODB_CONNECTION_STRING;
        this.MONGODB_MAIN_DB_NAME = MONGODB_MAIN_DB_NAME;
        this.MONGOCK_SCAN_PACKAGE = MONGODB_SCAN_PACKAGE;
    }

    @Override
    public RunnerBuilder getBuilder() {
        MongoClient client = getMainMongoClient();
        ClientSession session = client.startSession();
        // session.close()
        return MongockStandalone.builder()
                .setDriver(MongoCore3Driver.withDefaultLock(client, this.MONGODB_MAIN_DB_NAME))
                .addMigrationScanPackage(this.MONGOCK_SCAN_PACKAGE)
                .setMigrationStartedListener(MongockEventListener::onStart)
                .setMigrationSuccessListener(MongockEventListener::onSuccess)
                .setMigrationFailureListener(MongockEventListener::onFail)
                // create mongosession object
                // add dependency to pass client session and whatever object i've created.
                .addDependency("ClientSession", session)
                .setTrackIgnored(true)
                .setTransactionEnabled(true);
    }

    /**
     * Main MongoClient for Mongock to work.
     */
    private static MongoClient getMainMongoClient() {
        return buildMongoClientWithCodecs(MONGODB_CONNECTION_STRING);
    }

    /**
     * Helper to create MongoClients customized including Codecs
     */
    private static MongoClient buildMongoClientWithCodecs(String connectionString) {
        CodecRegistry codecRegistry = fromRegistries(CodecRegistries.fromCodecs(),
                MongoClientSettings.getDefaultCodecRegistry(),  fromProviders(PojoCodecProvider.builder().automatic(true).build()));

        MongoClientSettings.Builder builder = MongoClientSettings.builder();
        builder.applyConnectionString(new ConnectionString(connectionString));
        builder.codecRegistry(codecRegistry);
        MongoClientSettings build = builder.build();
        return MongoClients.create(build);
    }
}

服务器日志

SystemOut O [EVENT LISTENER] - Mongock STARTED successfully.
SystemErr R [Default Executor-thread-4] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:8, serverValue:1472262}] to tm-engg-dev-shard-00-02.nwuj5.mongodb.net:27017
SystemErr R [Default Executor-thread-4] INFO org.reflections.Reflections - Reflections took 140 ms to scan 1 urls, producing 2 keys and 2 values
SystemErr R [Default Executor-thread-4] INFO org.reflections.Reflections - Reflections took 1 ms to scan 1 urls, producing 2 keys and 2 values
SystemErr R [Default Executor-thread-4] INFO io.mongock.driver.core.lock.LockManagerDefault - Mongock trying to acquire the lock
SystemErr R [Default Executor-thread-4] INFO io.mongock.driver.core.lock.LockManagerDefault - Mongock acquired the lock until: Mon Jan 22 14:10:58 UTC 2024
SystemErr R [Thread-18] INFO io.mongock.driver.core.lock.LockManagerDefault - Starting mongock lock daemon...
SystemErr R [Default Executor-thread-4] INFO io.mongock.runner.core.executor.system.SystemUpdateExecutor - Mongock starting the system update execution id[2024-01-22T14:09:57.053-954]...
SystemErr R [Default Executor-thread-4] INFO io.mongock.runner.core.executor.ChangeLogRuntimeImpl - method[io.mongock.runner.core.executor.system.changes.SystemChangeUnit00001] with arguments: []
SystemErr R [Thread-18] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:9, serverValue:1472263}] to tm-engg-dev-shard-00-02.nwuj5.mongodb.net:27017
SystemErr R [Default Executor-thread-4] INFO io.mongock.runner.core.executor.ChangeLogRuntimeImpl - method[beforeExecution] with arguments: [io.mongock.driver.mongodb.v3.repository.Mongo3ChangeEntryRepository]
SystemErr R [Default Executor-thread-4] INFO io.mongock.runner.core.executor.ChangeExecutorBase - APPLIED - {"id"="system-change-00001_before", "type"="before-execution", "author"="mongock", "class"="SystemChangeUnit00001", "method"="beforeExecution"}
SystemErr R [Default Executor-thread-4] INFO io.mongock.runner.core.executor.ChangeLogRuntimeImpl - method[execution] with arguments: [io.mongock.driver.mongodb.v3.repository.Mongo3ChangeEntryRepository]
SystemErr R [Default Executor-thread-4] INFO io.mongock.runner.core.executor.ChangeExecutorBase - APPLIED - {"id"="system-change-00001", "type"="execution", "author"="mongock", "class"="SystemChangeUnit00001", "method"="execution"}
SystemErr R [Default Executor-thread-4] INFO io.mongock.driver.core.lock.LockManagerDefault - Mongock waiting to release the lock
SystemErr R [Default Executor-thread-4] INFO io.mongock.driver.core.lock.LockManagerDefault - Mongock releasing the lock
SystemErr R [Default Executor-thread-4] INFO io.mongock.driver.core.lock.LockManagerDefault - Mongock released the lock
SystemErr R [Default Executor-thread-4] INFO io.mongock.runner.core.executor.system.SystemUpdateExecutor - Mongock has finished the system update execution
SystemErr R [Default Executor-thread-4] INFO org.reflections.Reflections - Reflections took 2 ms to scan 1 urls, producing 0 keys and 0 values
SystemErr R [Default Executor-thread-4] INFO org.reflections.Reflections - Reflections took 2 ms to scan 1 urls, producing 0 keys and 0 values
SystemErr R [Default Executor-thread-4] INFO io.mongock.runner.core.executor.operation.migrate.MigrateExecutorBase - Mongock skipping the data migration. There is no change set item.
SystemErr R [Default Executor-thread-4] INFO io.mongock.runner.core.executor.operation.migrate.MigrateExecutorBase - Mongock has finished
SystemOut O [EVENT LISTENER] - Mongock finished successfully
SystemOut O MongockAppInitialization initializeMongock end...!
[1/22/24 14:09:58:245 UTC] 00000039 SystemOut O IndexConfigSetup init end...!


mongodb spring-mvc mongock
1个回答
0
投票

不久前我在 Mongock 5 和 Reflections 库 0.10.2 上也遇到了类似的问题。

Mongock 变更单元将在本地环境中运行,但不能在容器化(docker)服务器环境中运行。

降级到 Reflections 库 0.10.1 解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.