前言
由于项目需要运行一些后台服务提供计算和结转,不想与之前的项目放在一起需要独立出来。但是jfinal是web形式的框架需要占用web端口,虽然占用也无所谓,主要是想单纯的使用jfinal提供的ActiveRecord、插件管理等功能。springboot是可以直接选择使用web或者非web形式启动的。这里说明下如何使用jfinal做一个win下的服务。
使用工具
Apache Commons Daemon将java项目在win下使用服务模式运行。
代码
创建JServletContext类用于提供伪ServletContext
public class JServletContext implements ServletContext { //这个随便返回点什么 public String getContextPath() { return "E:/app"; } public ServletContext getContext(String s) { return null; } public int getMajorVersion() { return 0; } public int getMinorVersion() { return 0; } public int getEffectiveMajorVersion() { return 0; } public int getEffectiveMinorVersion() { return 0; } public String getMimeType(String s) { return null; } public Set<String> getResourcePaths(String s) { return null; } public URL getResource(String s) throws MalformedURLException { return null; } public InputStream getResourceAsStream(String s) { return null; } public RequestDispatcher getRequestDispatcher(String s) { return null; } public RequestDispatcher getNamedDispatcher(String s) { return null; } public Servlet getServlet(String s) throws ServletException { return null; } public Enumeration<Servlet> getServlets() { return null; } public Enumeration<String> getServletNames() { return null; } public void log(String s) { } public void log(Exception e, String s) { } public void log(String s, Throwable throwable) { } public String getRealPath(String s) { return null; } public String getServerInfo() { return null; } public String getInitParameter(String s) { return null; } public Enumeration<String> getInitParameterNames() { return null; } public boolean setInitParameter(String s, String s1) { return false; } public Object getAttribute(String s) { return null; } public Enumeration<String> getAttributeNames() { return null; } public void setAttribute(String s, Object o) { } public void removeAttribute(String s) { } public String getServletContextName() { return null; } public ServletRegistration.Dynamic addServlet(String s, String s1) { return null; } public ServletRegistration.Dynamic addServlet(String s, Servlet servlet) { return null; } public ServletRegistration.Dynamic addServlet(String s, Class<? extends Servlet> aClass) { return null; } public ServletRegistration.Dynamic addJspFile(String s, String s1) { return null; } public <T extends Servlet> T createServlet(Class<T> aClass) throws ServletException { return null; } public ServletRegistration getServletRegistration(String s) { return null; } public Map<String, ? extends ServletRegistration> getServletRegistrations() { return null; } public FilterRegistration.Dynamic addFilter(String s, String s1) { return null; } public FilterRegistration.Dynamic addFilter(String s, Filter filter) { return null; } public FilterRegistration.Dynamic addFilter(String s, Class<? extends Filter> aClass) { return null; } public <T extends Filter> T createFilter(Class<T> aClass) throws ServletException { return null; } public FilterRegistration getFilterRegistration(String s) { return null; } public Map<String, ? extends FilterRegistration> getFilterRegistrations() { return null; } public SessionCookieConfig getSessionCookieConfig() { return null; } public void setSessionTrackingModes(Set<SessionTrackingMode> set) { } public Set<SessionTrackingMode> getDefaultSessionTrackingModes() { return null; } public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() { return null; } public void addListener(String s) { } public <T extends EventListener> void addListener(T t) { } public void addListener(Class<? extends EventListener> aClass) { } public <T extends EventListener> T createListener(Class<T> aClass) throws ServletException { return null; } public JspConfigDescriptor getJspConfigDescriptor() { return null; } public ClassLoader getClassLoader() { return null; } public void declareRoles(String... strings) { } public String getVirtualServerName() { return null; } public int getSessionTimeout() { return 0; } public void setSessionTimeout(int i) { } public String getRequestCharacterEncoding() { return null; } public void setRequestCharacterEncoding(String s) { } public String getResponseCharacterEncoding() { return null; } public void setResponseCharacterEncoding(String s) { } }
创建JFilterConfig用于初始化何启动
JFilterConfig FilterConfig { String (String startClass) { .= startClass} String () { } ServletContext () { JServletContext()} String (String s) { } Enumeration<String> () { } }
接下来EnginStart
public class EnginStart extends JFinalConfig { private static Logger logger = LoggerFactory.getLogger(EnginStart.class); /** * 启动入口,运行此 main 方法可以启动项目,此 main 方法可以放置在任意的 Class 类定义中,不一定要放于此 */ public static void main(String[] args) { startMain(); } public static void startMain() { logger.info("项目启动开始"); try { //这里添加EnginStart的全路径 JFilterConfig jFilterConfig = new JFilterConfig("xxx.xxx.xxx.xxxx.EnginStart"); new JFinalFilter().init(jFilterConfig); } catch (ServletException e) { logger.error("项目启动失败", e); } } /** * 配置常量 * * @param me */ @Override public void configConstant(Constants me) { // 加载配置文件,随后可用PropKit.get(...)获取值 PropKit.use("dbconfig.properties");//本地环境 // 设置编码格式 me.setEncoding("utf-8"); me.setJsonFactory(new FastJsonFactory()); } @Override public void configRoute(Routes routes) { } @Override public void configEngine(Engine engine) { } /** * 配置插件 * * @param me */ @Override public void configPlugin(Plugins me) { // 数据库连接也可以使用以下的方式(Druid) DruidPlugin druid_oracle = DataSourceConnectPool.getOracleDruid(); druid_oracle.addFilter(new StatFilter()); me.add(druid_oracle); ActiveRecordPlugin Arp_oracle = new ActiveRecordPlugin(druid_oracle); Arp_oracle.setDialect(new OracleDialect()); Arp_oracle.setContainerFactory(new CaseInsensitiveContainerFactory()); Arp_oracle.getEngine().setSourceFactory(new ClassPathSourceFactory()); MappingKit.mappingOracle(Arp_oracle); me.add(Arp_oracle); //定时任务控制插件 me.add(new QuartzPlugin()); //hbase插件 me.add(new HBasePlugin()); } /** * 配置全局拦截器,对所有请求进行拦截,类和方法使用@Before(Class.class)即能使用 * * @param me */ @Override public void configInterceptor(Interceptors me) { } /** * 配置处理器 * * @param me */ @Override public void configHandler(Handlers me) { } @Override public void afterJFinalStart() { logger.info("项目启动成功"); } @Override public void beforeJFinalStop() { } }
接下来直接运行就可以以非web模式运行jfinal了
这只是不想一个后台运行的服务占用一个端口而进行的操作,在大多数情况下并没有所谓。如果你也想使用jfinal做java后台服务的话可以按照我的尝试下
我们一般独立使用插件的话,比如数据库跑个独立任务啥的,就是直接main方法启动了 https://www.jfinal.com/doc/5-15 ActiveRecordPlugin可以独立于java web 环境运行在任何普通的java程序中