【问题标题】:SymetricWebServer not starting in embedded modeSymmetricWebServer 未以嵌入式模式启动
【发布时间】:2020-05-16 16:43:30
【问题描述】:

我有一个带有 SymetricDS 的 Spring Boot maven 项目。当我以嵌入式模式启动应用程序时,即使我有一个 Spring boot 的 Tomcat,它也在寻找 Jetty。

SymmetricWebServer node = new SymmetricWebServer("server.properties");


<dependency>
   <groupId>org.jumpmind.symmetric</groupId>
   <artifactId>symmetric-server</artifactId>
   <version>3.5.19</version>
</dependency>

例外:

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jetty/server/bio/SocketConnector

这是为什么?为什么没有使用 symetric-server 下载依赖项?

【问题讨论】:

  • 您是否尝试过显式添加缺少的依赖项?

标签: java spring-boot maven symmetricds


【解决方案1】:

对 Jetty 的 maven 依赖是“提供的”,因为 symmetric-server 可以构建为可以部署到任意数量的 Web 服务器的战争。这是我如何使用 Spring Boot 提供的 Web 容器将 SymmetricDS 嵌入到 Spring Boot 中的精髓。

import org.jumpmind.symmetric.common.ParameterConstants;
import org.jumpmind.symmetric.web.ServerSymmetricEngine;
import org.jumpmind.symmetric.web.SymmetricEngineHolder;
import org.jumpmind.symmetric.web.SymmetricServlet;
import org.jumpmind.symmetric.web.WebConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.ServletContext;
import javax.sql.DataSource;
import java.util.Properties;

@Configuration
public class SymDSModule implements ApplicationListener<ApplicationReadyEvent> {

    @Autowired
    ServletContext servletContext;

    @Autowired
    DataSource dataSource;

    @Autowired
    ApplicationContext applicationContext;

    @Override
    final public void onApplicationEvent(ApplicationReadyEvent event) {
        SymmetricEngineHolder holder = new SymmetricEngineHolder();
        Properties properties = new Properties();

        properties.put(ParameterConstants.DATA_LOADER_IGNORE_MISSING_TABLES, "true");
        properties.put(ParameterConstants.TRIGGER_CREATE_BEFORE_INITIAL_LOAD, "false");
        properties.put(ParameterConstants.AUTO_RELOAD_ENABLED, "true");
        properties.put(ParameterConstants.AUTO_REGISTER_ENABLED, "true");

        ServerSymmetricEngine serverEngine = new ServerSymmetricEngine(dataSource, applicationContext, properties, false, holder);

        holder.getEngines().put(properties.getProperty(ParameterConstants.EXTERNAL_ID), serverEngine);
        holder.setAutoStart(false);
        servletContext.setAttribute(WebConstants.ATTR_ENGINE_HOLDER, holder);

        serverEngine.setup();
        serverEngine.start();
    }

    @Bean
    public ServletRegistrationBean<SymmetricServlet> symServlet() {
        ServletRegistrationBean<SymmetricServlet> bean = new ServletRegistrationBean<>(new SymmetricServlet(), "/sync");
        bean.setLoadOnStartup(1);
        return bean;
    }

}

【讨论】:

  • 这是 2 个独立的类吗?
  • @GáborCsikós。不。看起来代码被粘贴了两次。我修复了帖子。
  • 它只是挂在 ServerSymmetricEngine serverEngine 行
  • 这个例子来自最新版本的 SymmetricDS。 3.11.x。它在这里发布:maven.jumpmind.com/repo
  • 我认为这只是我们如何创建引擎的副作用。默认部署类型是客户端,我们在创建 ServerSymmetricEngine 时没有明确设置它。如果需要,您可以将其显式设置为服务器。不应该有所作为,因为它是信息性的。用户 setDeploymentType() 在引擎上覆盖它。
猜你喜欢
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多