`
lettoo
  • 浏览: 35329 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
58ccff5b-5ca6-387a-9c99-a277f31a9e51
我和Java数据库操作的那...
浏览量:9513
社区版块
存档分类
最新评论

一个简单的JAVA后台程序框架

阅读更多

    本项目已经通过git进行版本管理,checkout:http://github.com/lettoo/orion

    项目要实现一个java后台程序,提供start(),stop()和status()的方法。

    主要的原理是:有一个Server类运行在localhost:xxxx上,当成一个RMI service,这个Server类里有一个Service List,通过Spring注入的方式,向其中注入Service,当然,也可以通过编程方式动态往里面加Service,因为项目比较简单,直接通过Spring配置已经满足要求。RMI 客户端通过调用Server.start(),遍历Service List中的service,一个个启动起来。客户端调用stop(),则遍历Service List中的server,一个个关闭,最终再关闭服务端。status()方法只是简单的提供Server是否在运行状态。

1. Server接口

public interface IServer {
    void start() throws Exception;    
    void stop() throws Exception;    
    boolean isStarted();
}

 

2. Server实现类

import java.util.LinkedList;
import java.util.List;

public class ServerImpl implements IServer {    
    private volatile boolean isStarted = false;
    private List<IService> serviceList = new LinkedList<IService>();
    
    public void setServiceList(List<IService> serviceList) {
        this.serviceList = serviceList;
    }

    @Override
    public void start() throws Exception {
        if (isStarted) {
            return;
        }        
        for (IService service : serviceList) {
            service.start();
        }        
        isStarted = true;
    }

    @Override
    public void stop() throws Exception{       
        for (IService service : serviceList) {
            service.stop();
        }        
        isStarted = false;
        System.exit(0);
    }

    @Override
    public boolean isStarted() {
        return isStarted;
    }
}

 
3. 通过Spring RMI,分别创建两个xml,一个是server.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
  "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="server" class="cn.lettoo.server.ServerImpl">
        <property name="serviceList">
            <list>
                <!-- Add your service here, all service implements IService interface. -->
                <ref bean="jmsService" />
                <ref bean="jobService" />
                <ref bean="dataReaderService" />
            </list>
        </property>
    </bean>
    <bean id="orionMonitorServer" class="org.springframework.remoting.rmi.RmiServiceExporter">
        <property name="serviceInterface" value="cn.lettoo.server.IServer" />
        <property name="service" ref="server" />
        <property name="serviceName" value="OrionMonitorServer" />
        <property name="registryPort" value="1199" />
        <property name="alwaysCreateRegistry" value="true" />
    </bean>

</beans>

 

再创建一个client.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
  "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="serviceProxy" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
        <property name="serviceUrl" value="rmi://localhost:1199/OrionMonitorServer" />
        <property name="serviceInterface" value="cn.lettoo.server.IServer" />
    </bean>
</beans>

 

4. 写一个Luncher类,通过RMI来调用Server的方法

import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Launcher {

    /** The Constant USAGE. */
    private static final String USAGE = "[options]";

    /** The Constant HEADER. */
    private static final String HEADER = "Options:";

    /** The Constant FOOTER. */
    private static final String FOOTER = "For more instructions, please contact golettoo@gmail.com";
    
    private IServer server;
    
    private static Log logger = LogFactory.getLog(Launcher.class);

    public static void main(String args[]) {
        Launcher launcher = new Launcher();
        try {
            launcher.execute(args);
        } catch (Exception e) {
            launcher.printUsage(launcher.createOptions());
            logger.error("launch error: ", e);
            System.exit(1);
        }
    }

    private void execute(String[] args) throws Exception {
        CommandLineParser parser = new BasicParser();
        Options options = createOptions();
        CommandLine commandLine = parser.parse(options, args);
        if (commandLine.hasOption('h')) {
            printUsage(options);
            return;
        }

        if (commandLine.hasOption('v')) {
            System.out.println("Version: 1.0");
            return;
        }
        
        if (args.length == 0) {
            start();
        } else if (commandLine.hasOption("start")) {
            start();
        } else if (commandLine.hasOption("stop")) {
            stop();
        } else if (commandLine.hasOption("status")) {
            System.out.println("Status: " + getStatus());
        } else {
            printUsage(options);
        }
    }

    private void initServer() throws Exception {
        ApplicationContext context = 
            new ClassPathXmlApplicationContext(new String[] { "server.xml" });        
    }
    
    private void initClient() throws Exception {
        ApplicationContext context = 
            new ClassPathXmlApplicationContext(new String[] { "client.xml" });        
        this.server = (IServer) context.getBean("serviceProxy");
    }
    
    private void start() throws Exception {
        initServer();
        initClient();
        server.start();
    }

    private void stop() {
        try {
            initClient();
            server.stop();
        } catch (Exception e) {
            logger.error("Stop server error: " + e.toString());
        }
    }

    private String getStatus() {
        try {     
            initClient();
            return server.isStarted() ? "started" : "stopped";
        } catch (Exception e) {
            logger.error("Get server status error: " + e.toString());
        }
        return "stopped";
    }

    private void printUsage(Options options) {
        HelpFormatter helpFormatter = new HelpFormatter();
        helpFormatter.printHelp(USAGE, HEADER, options, FOOTER);
    }

    private Options createOptions() {
        Options options = new Options();
        options.addOption("h", "help", false, "print this usage information");
        options.addOption("o", "option", true, "set option");
        options.addOption("v", "version", false, "print version");
        options.addOption("start", false, "start the application");
        options.addOption("stop", false, "stop the application");
        options.addOption("status", false, "print the status information");
        return options;
    }
}

 

Luncher类通过运行时的参数来决定是start还是stop,另外,还提供了一个帮助和版本信息的查看

现在可以通过运行Luncher -start来启动这个server了

再通过Luncher -status来看状态

通过Luncher -stop来关闭server

分享到:
评论
1 楼 succinite 2011-11-19  
使用TortoiseGit, 出现以下错误。
fatal: http://github.com/lettoo/orion/info/refs not found: did you run git update-server-info on the server?

相关推荐

    java后台框架集合

    Java后台框架集合是开发高效、稳定且可扩展的后端应用程序的重要工具箱。SpringMVC、Redis和Quartz是其中的三个关键组件,它们分别在不同的层面上为开发者提供了强大的支持。 SpringMVC是Spring框架的一个模块,...

    一个免费的java权限后台管理系统框架

    java权限后台开发框架,采用spring + srpingsecurity + springMVC + Hibernate + freemarker + jquery 等技术实现,页面及源文件打包发布程序。 完整的功能应用,包括:后台权限、人员机构、参数代码、角色权限、...

    Java开发的一个简约后台管理系统源码.zip

    项目简介:Java开发的一个简约后台管理系统 1.需求定义:外包项目如雨后春笋,开发工期被迫压缩,为了开发人员专注开发项目业务,早点下班能陪老婆、孩子。 2.产品定位: 简约后台管理系统 3.项目特点:此项目代码...

    商城小程序JAVA后台

    "商城小程序JAVA后台"是一个基于Java技术开发的用于支持电商小程序运行的后端系统。这个系统的核心目标是为前端小程序提供稳定、高效的数据处理和服务支持,实现用户购物、支付、订单管理等一系列功能。以下是该系统...

    微信商城 小程序 前后台源码 Java后台 ssm框架+MySQL

    微信商城小程序是一个基于微信生态的在线购物平台,其前端通过微信小程序进行展示,后端则由Java技术栈构建,采用SSM(Spring、SpringMVC、MyBatis)框架进行开发,并结合MySQL数据库来存储数据。这个项目是针对毕业...

    java后台;java后台

    Java后台技术是构建大型互联网应用的核心部分,它主要负责处理前端...以上就是Java后台开发的一些关键知识点,涵盖从框架选择、数据库操作到系统架构等多个层面,这些都是成为一名合格的Java后台开发者必备的基础技能。

    简单好用的Web后台管理框架

    "简单好用的Web后台管理框架"是一个专为提高开发效率而设计的解决方案,它包含了导航菜单、增删改查页面以及登录页面等功能,为开发者提供了完整的后台管理模板。 首先,我们来了解一下后台管理框架的基本概念。...

    微信小程序+Java后台完整代码

    在“微信小程序+Java后台完整代码”中,我们可以看到一个完整的电商解决方案,包括前端的小程序部分和后端的Java服务。小程序商城的部分主要负责展示商品、处理用户交互、实现购物车功能、订单管理以及支付流程等。...

    大华视频 最新java后台程序开发demo

    "大华视频 最新java后台程序开发demo"的标题暗示了这是一个与大华公司相关的项目,它提供了使用Java进行后台程序开发的示例代码或教程。这个Demo可能包含了一个或多个用Java编写的后端服务,用于处理视频数据或其他...

    微信支付-微信小程序+Java后台代码

    在这个项目中,我们结合了微信小程序和Java后台技术,实现了一个完整的微信支付流程。以下将详细阐述涉及的知识点: 1. **微信小程序**:微信小程序是一种轻量级的应用开发框架,允许开发者在微信内部创建和运行...

    基于Java的后台管理系统快速开发脚手架.zip

    综上,"基于Java的后台管理系统快速开发脚手架.zip"包含了一系列用于后台系统开发的关键技术,如Java、Spring Boot、MyBatis、Thymeleaf等,旨在提供一个高效、可复用的开发基础,加速项目的实施。通过学习和运用...

    java后台部署html页面代码.docx

    数据库交互是 Java 后台部署 HTML 页面代码的另一个重要组成部分。在给定的代码中,我们可以看到使用了静态模型(StaticModel)来存储 HTML 页面的元数据。静态模型是一个 JavaBean 对象,用于存储 HTML 页面的元...

    java后台服务程序.rar

    本压缩包“java后台服务程序.rar”很可能包含了一个或多个这样的服务的源代码、配置文件、依赖库等组成部分。 Java作为一门面向对象的编程语言,因其跨平台性、稳定性和强大的功能而广泛应用于后台服务开发。下面...

    微信商城小程序带JAVA后台

    综上所述,"微信商城小程序带JAVA后台"项目涵盖了从前端用户体验到后台业务处理的完整流程,涉及微信小程序开发、JAVA编程、数据库管理、服务器部署等多个技术领域,是企业级电商解决方案的一个实例。

    简单后台框架结构html

    这个简单后台框架可能没有明确的后端实现,但理解这一概念对于完整系统的构建至关重要。 8. 开发工具:开发者可能会使用如Visual Studio Code、Sublime Text等编辑器,或Webpack、Gulp等构建工具来管理和优化这个...

    微信小程序,小程序商城,商城,springboot框架,vue管理系统,java后台.zip

    微信小程序,小程序商城,商城,springboot框架,vue管理系统,java后台.zip

    后台管理框架

    【后台管理框架】是一个专为构建企业级后台应用设计的基础架构,它整合了多个流行的开源技术,如Bootstrap、SpringMVC、Shiro、MyBatis和JSP,以提供快速开发和高效管理的能力。这个框架已被优化为Maven项目结构,...

    分享6个国内优秀Java后台管理框架的开源项目,建议收藏!.docx

    ### 国内优秀Java后台管理框架的开源项目 #### 一、引言 随着企业信息化建设和电子政务的发展,后台管理系统(Content Management System, CMS)成为了一个不可或缺的部分。良好的后台管理系统不仅能够提升工作效率...

    java后台精美模板(一共25个)

    总之,这个Java后台模板集合是一个宝贵的资源库,无论是对于个人提升编程技巧,还是团队提高开发效率,都有着显著的帮助。请务必花时间去深入理解和利用这些模板,让它们在你的开发工作中发挥出最大的价值。

Global site tag (gtag.js) - Google Analytics