spring使用内置jetty创建提供http接口服务

这篇具有很好参考价值的文章主要介绍了spring使用内置jetty创建提供http接口服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、添加pom文件依赖

<dependency>
	<groupId>org.eclipse.jetty</groupId>
	<artifactId>jetty-server</artifactId>
	<version>9.4.22.v20191022</version>
</dependency>
<dependency>
	<groupId>org.eclipse.jetty</groupId>
	<artifactId>jetty-deploy</artifactId>
	<version>9.4.22.v20191022</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-web</artifactId>
	<version>5.2.9.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>5.2.9.RELEASE</version>
</dependency>

2、编写代码

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;

/**
 * Spring root context keeper
 */
@Component
public class ApplicationContextKeeper implements ApplicationContextAware {

    private static WebApplicationContext webAppCtx;

    @Override
    public void setApplicationContext(ApplicationContext appCtx)
            throws BeansException {
        XmlWebApplicationContext xmlWebAppCtx = new XmlWebApplicationContext();
        xmlWebAppCtx.setParent(appCtx);
        xmlWebAppCtx.setConfigLocation("");
        xmlWebAppCtx.setClassLoader(appCtx.getClassLoader());
        xmlWebAppCtx.refresh();
        xmlWebAppCtx.registerShutdownHook();
        webAppCtx = xmlWebAppCtx;
    }

    public static WebApplicationContext getWebAppCtx() {
        return webAppCtx;
    }

}
import org.eclipse.jetty.server.Server;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

/**
 * 服务生命周期辅助程序, 用于:
 * 1. 优雅关闭API服务, 加入JVM钩子, 保护数据.
 * 2. 可用于缓存持久化至数据库, 文件等操作
 */
public final class Bootstrap implements Lifecycle, InitializingBean, ApplicationListener<ContextRefreshedEvent> {
    private static final Logger LOG = LoggerFactory.getLogger(Bootstrap.class);

    private Server jettyServer;

    @Value("${rest.status}")
    private int status;

    @Value("${server.port}")
    private int port;

    /**
     * The set of registered LifecycleListeners for event notifications.
     */
    private LifecycleListener[] listeners = new LifecycleListener[0];

    private final Object listenersLock = new Object(); // Lock object for changes to listeners

    @Override
    public void addLifecycleListener(LifecycleListener listener) {
        synchronized (listenersLock) {
            LifecycleListener[] results = new LifecycleListener[listeners.length + 1];
            System.arraycopy(listeners, 0, results, 0, listeners.length);
            results[listeners.length] = listener;
            listeners = results;
        }
    }

    @Override
    public void removeLifecycleListener(LifecycleListener listener) {
        synchronized (listenersLock) {
            int n = -1;
            for (int i = 0; i < listeners.length; i++) {
                if (listeners[i] == listener) {
                    n = i;
                    break;
                }
            }
            if (n < 0) {
                return;
            }
            LifecycleListener[] results = new LifecycleListener[listeners.length - 1];
            int j = 0;
            for (int i = 0; i < listeners.length; i++) {
                if (i != n) {
                    results[j++] = listeners[i];
                }
            }
            listeners = results;
        }
    }

    /**
     * @return true: no error, false: has error
     */
    private boolean doStop() {
        try {
            jettyServer.stop(); // 1. Gracefully shutdown

            // 2
            for (LifecycleListener listener : listeners) {
                listener.lifecycleEvent(new LifecycleEvent(this, Lifecycle.AFTER_STOP_EVENT));
            }
            return true;
        } catch (Exception e) {
            LOG.error("Shutdown jetty server error: ", e);
        }
        return false;
    }

    @Override
    public void afterPropertiesSet() {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            if (doStop()) {
                LOG.info("Shutdown completed");
            } else {
                LOG.warn("Shutdown completed with error, please check logs !!!");
            }
        }));
        LOG.info("Added JVM shutdown hook ...");
    }

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if (event.getApplicationContext().getParent() == null) { // Notify when ROOT CONTEXT loaded
            try {
                /*
                 * Start Jetty container after all bean have been initialize.
                 *
                 * 1.In case of load big data from DB slowly but the WEB PORT
                 *   have been open, some request maybe send to here but
                 *   application can't process them.
                 *
                 * 2. Jetty will parse web.xml, DispatcherServlet need WebApplicationContext to make
                 *    handlerMapping (URL -> process bean), so if the Spring Container haven't load
                 *    controllers specified on "springmvc-context.xml" and Jetty parse web.xml,
                 *    springmvc maybe not found the beans, finally will throw 404 error to client.
                 */
                if (status == 1) {
                    jettyServer.start();
                    System.out.println("Start http server on port:" + port);
                }
            } catch (Exception e) {
                LOG.error("Start jetty server error: ", e);
                System.exit(1);
                throw new RuntimeException(e);
            }
        }
    }

    public void setJettyServer(Server jettyServer) {
        this.jettyServer = jettyServer;
    }

}
import org.springframework.web.servlet.DispatcherServlet;
public class CustomDispatcherServlet extends DispatcherServlet {

    private static final long serialVersionUID = 1L;

    public CustomDispatcherServlet() {
        super(ApplicationContextKeeper.getWebAppCtx());
    }

}
public interface Lifecycle {

    String BEFORE_START_EVENT = "before_start";
    String AFTER_START_EVENT = "after_start";

    String BEFORE_STOP_EVENT = "before_stop"; // Before jetty gracefully shutdown
    String AFTER_STOP_EVENT = "after_stop"; // After jetty gracefully shutdown

    void addLifecycleListener(LifecycleListener listener);

    void removeLifecycleListener(LifecycleListener listener);

}

import java.util.EventObject;

public class LifecycleEvent extends EventObject {
    private static final long serialVersionUID = 1L;

    /**
     * The event type this instance represents.
     */
    private final String type;

    public LifecycleEvent(Object source, String type) {
        super(source);
        this.type = type;
    }

    public String getType() {
        return type;
    }

}

/**
 * Interface defining a listener for significant events (including "server
 * start" and "server stop")
 */
public interface LifecycleListener {

    /**
     * Acknowledge the occurrence of the specified event.
     *
     * @param event LifecycleEvent that has occurred
     */
    void lifecycleEvent(LifecycleEvent event);

}

3、配置bean

<bean id="bootstrap" class="com.xuanwu.msggate.mto.mos.server.Bootstrap">
	<property name="jettyServer" ref="jettyServer" />
</bean>

4、配置mvc注解驱动

<mvc:annotation-driven />

通过mvc:annotation-driven/配置,Spring MVC会启用对注解的支持,使得可以在控制器类和方法上使用注解来定义请求映射、参数绑定等操作。

具体来说,mvc:annotation-driven/会启用以下功能:
支持@Controller注解,用于标识控制器类
支持@RequestMapping注解,用于定义请求映射
支持@RequestParam注解,用于绑定请求参数
支持@ResponseBody注解,用于将方法返回值直接作为HTTP响应体返回
支持@PathVariable注解,用于绑定URI模板变量

注意: 如果没有mvc注解支持。则会出现No mapping for POST

5、添加jetty配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<bean id="contextHandlerCollection" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"></bean>
	
	<bean id="jettyServer" class="org.eclipse.jetty.server.Server" destroy-method="stop">
		<constructor-arg name="pool">
			<bean class="org.eclipse.jetty.util.thread.QueuedThreadPool">
				<constructor-arg name="minThreads" value="${rest.api.jetty.poolSize.minThreads}" />
				<constructor-arg name="maxThreads" value="${rest.api.jetty.poolSize.maxThreads}" />
			</bean>
		</constructor-arg>
		<property name="stopAtShutdown" value="true" />
		<property name="stopTimeout" value="3000" />
		<property name="connectors">
			<array>
				<bean class="org.eclipse.jetty.server.ServerConnector">
					<constructor-arg name="server" ref="jettyServer" />
					<property name="port" value="${server.port}" />
					<property name="acceptQueueSize" value="1024" />
				</bean>
			</array>
		</property>
		<property name="handler">
			<bean class="org.eclipse.jetty.server.handler.HandlerCollection">
				<property name="handlers">
					<list>
						<ref bean="contextHandlerCollection" />
					</list>
				</property>
			</bean>
		</property>
		<property name="beans">
			<list>
				<ref bean="deploymentManager" />
			</list>
		</property>
	</bean>
	
	<bean id="deploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager">
		<property name="contexts" ref="contextHandlerCollection" />
		<property name="appProviders">
			<list>
				<ref bean="webAppProvider" />
			</list>
		</property>
	</bean>
	
	<bean id="webAppProvider" class="org.eclipse.jetty.deploy.providers.WebAppProvider">
		<property name="monitoredDirName" value="${webapps.dir}webapps" />
		<property name="scanInterval" value="5" />
		<property name="extractWars" value="true" />
		<property name="configurationManager">
			<bean class="org.eclipse.jetty.deploy.PropertiesConfigurationManager" />
		</property>
	</bean>
	
</beans>

6、在spring中导入

<import resource="classpath:/com/xuanwu/msggate/mto/mos/jetty-context.xml"/>

7、创建webapps目录并创建web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	<display-name>rest api</display-name>
	
	<servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>com.xuanwu.msggate.rest2mtreceiver.server.CustomDispatcherServlet</servlet-class>
		<init-param>
			<param-name>detectAllHandlerAdapters</param-name>
			<param-value>true</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>

	<!-- Spring字符集过滤器      建议放前面 不然拦截可能有问题-->
	<filter>
		<filter-name>SpringEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>SpringEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<filter>
		<filter-name>HttpRequestFilter</filter-name>
		<filter-class>com.xuanwu.msggate.rest2mtreceiver.rest.filter.HttpRequestFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>HttpRequestFilter</filter-name>
		<url-pattern>/api/authorization/*</url-pattern>
	</filter-mapping>

</web-app>

jetty.server spring,spring,jetty,http文章来源地址https://www.toymoban.com/news/detail-851885.html

到了这里,关于spring使用内置jetty创建提供http接口服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java创建上传文件接口并使用HTTP测试

    备注: 使用jersey框架 2.1.1.上传本地文件 参考链接: Jersey (JAX-RS) multiple files upload example

    2024年02月11日
    浏览(287)
  • java Spring Boot2.7写一个接口 提供图片预览 前端可以直接用接口地址当src为图片地址使用

    我们特别是在做小程序开发时 很多图片会比较大 而小程序本身就对自身大小要求非常高 所以 图片放在服务器上提供访问链接是一种非常好的选择 我想很多前端会误认为 直接将图片放在服务器上就可以了 但其实没那么简单 因为服务器其实也可以理解为一个电脑 你就想 你自

    2024年02月07日
    浏览(48)
  • Maven Jetty运行Spring MVC项目

    pom引入插件 项目设置为war形式 Idea的Edit Configurations 然后选择Maven 点击 ‘+号’ 进行配置 点击 Debug 图标运行项目

    2024年02月07日
    浏览(39)
  • WPF项目创建HTTP WEB服务,不使用IIS业务 WPF桌面程序WebApi WPF 集成WebApi C# 创建HTTP Web API服务

    在C# WPF应用程序中直接创建HTTP服务或WebAPI服务有以下优点: 自托管服务: 简化部署:无需依赖外部服务器或IIS(Internet Information Services),可以直接在应用程序内部启动和运行Web服务。 集成紧密:与WPF应用程序的其他组件和逻辑可以更紧密地集成,因为它们都在同一个进程

    2024年02月02日
    浏览(62)
  • 消息队列 -提供上层服务接口

    我们之前已经将 数据库 的操作 和文件的操作 都完成了, 但是对于上层调用来说, 并不关心是于数据库中存储数据还是往文件中存储数据, 因此 我们提供一个类, 封装一下 上述俩个类中的操作, 并将这个类 提供给上层调用 由于之前我们已经分别测试过了,写入数据库与写入文件

    2024年02月14日
    浏览(38)
  • 如何使用Node.js快速创建本地HTTP服务器并实现公网访问服务端

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月03日
    浏览(73)
  • 【微服务|SpringBoot 3.0】 新特性——内置声明式HTTP客户端

    从Spring 6和Spring Boot 3开始,Spring framework支持将远程HTTP服务代理为带有HTTP交换注解方法的Java接口。类似的库,如OpenFeign和Retrofit,仍然可以使用,但HttpServiceProxyFactory添加了对Spring框架的原生支持。 声明式 http 客户端主旨是使得编写 java http 客户端更容易。为了贯彻这个理念

    2024年02月16日
    浏览(47)
  • Unity中使用HttpListener创建本地Http web服务器教程与完整代码

    下方有完整代码和使用方法,急用的请直接拉到最下方 本文可以实现不开新进程在Unity中创建http服务器。 监听自定义ip获取指定目录下的网页或其他资源。如果网页内有其他资源链接也可以正常访问。 可以配合Unity网页浏览器组件使用解决资源打包问题 在Unity中搭建简易ht

    2024年02月02日
    浏览(94)
  • 如何使用Node.js快速创建本地HTTP服务器并实现异地远程访问

    Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation(原为 Node.js Foundation,已与 JS Foundation 合并)持有和维护,亦为 Linux 基金会的项目。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高

    2024年02月05日
    浏览(68)
  • 如何使用Node.js快速创建HTTP服务器并实现公网访问本地Server

    Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation(原为 Node.js Foundation,已与 JS Foundation 合并)持有和维护,亦为 Linux 基金会的项目。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高

    2024年01月15日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包