java工程笔记

start.sh

#TITLE=jetty

DEPLOY_PATH=$(cd $(dirname $0)/../ && pwd)
export DEPLOY_PATH

CLASSPATH=${CLASSPATH}:${DEPLOY_PATH}/lib/start.jar:${DEPLOY_PATH}/configs
export CLASSPATH

JAVA_OPTIONS="-server -XX:PermSize=64m -XX:MaxPermSize=128m -Xmx512m -Xms256m"
export JAVA_OPTIONS

DEBUG_PORT=8081
export DEBUG_PORT

JAVA_DEBUG="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=${DEBUG_PORT},server=y,suspend=n"
export JAVA_DEBUG

${JAVA_HOME}/bin/java ${JAVA_OPTIONS} ${JAVA_DEBUG} -Dclasspath=${DEPLOY_PATH}/lib -Dbasepath=${DEPLOY_PATH} com.dc.jetty.start.Start
if [ "${doExitFlag}" = "true" ] ; then
    exit
fi

log4j.properties

log4j.rootLogger=info,console,debug,info,warn,error,fatal

log4j.appender.console=org.apache.log4j.ConsoleAppender 
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
log4j.appender.console.layout.ConversionPattern=%d [%-5p]  (%F.%M:%L) - %m%n

log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File=./log/rest/rest_debug
log4j.appender.debug.DatePattern='.'yyyyMMdd'.log'
log4j.appender.debug.layout=org.apache.log4j.PatternLayout 
log4j.appender.debug.layout.ConversionPattern=%d [%-5p]  (%F.%M:%L) - %m%n
log4j.appender.debug.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.debug.filter.F1.LevelMin=debug
log4j.appender.debug.filter.F1.LevelMax=debug

log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.File=./log/rest/rest_info
log4j.appender.info.DatePattern='.'yyyyMMdd'.log'
log4j.appender.info.layout=org.apache.log4j.PatternLayout 
log4j.appender.info.layout.ConversionPattern=%d [%-5p]  (%F.%M:%L) - %m%n
log4j.appender.info.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.info.filter.F1.LevelMin=info
log4j.appender.info.filter.F1.LevelMax=info

log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.File=./log/rest/rest_warn
log4j.appender.warn.DatePattern='.'yyyyMMdd'.log'
log4j.appender.warn.layout=org.apache.log4j.PatternLayout 
log4j.appender.warn.layout.ConversionPattern=%d [%-5p]  (%F.%M:%L) - %m%n
log4j.appender.warn.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.warn.filter.F1.LevelMin=warn
log4j.appender.warn.filter.F1.LevelMax=warn

log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File=./log/rest/rest_error
log4j.appender.error.DatePattern='.'yyyyMMdd'.log'
log4j.appender.error.layout=org.apache.log4j.PatternLayout 
log4j.appender.error.layout.ConversionPattern=%d [%-5p]  (%F.%M:%L) - %m%n
log4j.appender.error.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.error.filter.F1.LevelMin=error
log4j.appender.error.filter.F1.LevelMax=error

log4j.appender.fatal=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fatal.File=./log/rest/rest_fatal
log4j.appender.fatal.DatePattern='.'yyyyMMdd'.log'
log4j.appender.fatal.layout=org.apache.log4j.PatternLayout 
log4j.appender.fatal.layout.ConversionPattern=%d [%-5p]  (%F.%M:%L) - %m%n
log4j.appender.fatal.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.fatal.filter.F1.LevelMin=fatal
log4j.appender.fatal.filter.F1.LevelMax=fatal

#log4j.logger.com.dc.oauth.server=debug

#----------------------------------------------------Ibaits----------------------------------------------------
#log4j.logger.com.ibatis=debug
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
#log4j.logger.java.sql.Connection=debug
#log4j.logger.java.sql.Statement=debug

#log4j.logger.java.sql.PreparedStatement=debug,stdout
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.Target=System.out
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601}[%-5p][%c][%t]:%m%n

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <!--
    <welcome-file-list>
        <welcom-file>index.jsp</welcom-file>
    </welcome-file-list>
    -->
    <servlet>
        <servlet-name>restServlet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.dc.jetty.server</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>restServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

config.properties

#jetty
port=8080
contextPath=/
resourceBase=../web
descriptor=../web/WEB-INF/web.xml
maxThread=5000
minThread=100

#返回时间(单位毫秒)
sleepTime=100

build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="jetty" default="package" basedir=".">
    
    <path id="classpath">
        <pathelement location="."/>
        <fileset dir="${basedir}/lib">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    
    <target name="clean">
        <delete dir="${basedir}/all"/>
    </target>
    
    <target name="prepare" depends="clean">
        <mkdir dir="${basedir}/all"/>
        <mkdir dir="${basedir}/all/bin"/>
        <mkdir dir="${basedir}/all/lib"/>
        <mkdir dir="${basedir}/all/web"/>
        <mkdir dir="${basedir}/all/classes"/>
        <mkdir dir="${basedir}/all/configs"/>
    </target>
    
    <target name="copy" depends="prepare">
        <copy todir="${basedir}/all/bin">
            <fileset dir="${basedir}/bin" excludes="**/.svn/**/*.*">
                <include name="**/*"/>
            </fileset>
        </copy>
        <copy todir="${basedir}/all/lib">
            <fileset dir="${basedir}/lib" excludes="**/.svn/**/*.*">
                <include name="**/*"/>
            </fileset>
        </copy>
        <copy todir="${basedir}/all/web">
            <fileset dir="${basedir}/web" excludes="**/.svn/**/*.*">
                <include name="**/*"/>
            </fileset>
        </copy>
        <copy todir="${basedir}/all/configs">
                    <fileset dir="${basedir}/configs" excludes="**/.svn/**/*.*">
                        <include name="**/*"/>
                    </fileset>
                </copy>
    </target>
    
    <target name="compile" depends="copy">
        <javac srcdir="${basedir}/src" destdir="${basedir}/all/classes" debug="true" deprecation="off" failonerror="true" encoding="utf8" nowarn="on">
            <classpath refid="classpath"></classpath>
        </javac>
    </target>
    
    <target name="package" depends="compile">
        <jar destfile="${basedir}/all/lib/start.jar">
            <fileset dir="${basedir}/all/classes" includes="**/Start.class"/>
        </jar>
        <jar destfile="${basedir}/all/lib/jetty.jar">
            <fileset dir="${basedir}/all/classes"/>
        </jar>
        <delete dir="${basedir}/all/classes"/>
    </target>
    
</project>

Start.java

package com.dc.jetty.start;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;

public class Start {

    private static void getJars(List<URL> urls, File cpdir)
            throws MalformedURLException {

        for (File f : cpdir.listFiles()) {
            if (f.isDirectory()) {
                getJars(urls, f);
            }
            if (f.getName().endsWith(".jar")) {
                URL url = f.toURI().toURL();
                urls.add(url);
            }
        }
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        
        String classpath = System.getProperty("classpath");
        List<URL> urls = new ArrayList<URL>();
        File cpdir = new File(classpath);
        if (!cpdir.exists() || !cpdir.isDirectory()) {
            System.err.println("Please set system property "classpath" properly");
        } else {
            try {
                getJars(urls, cpdir);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }
        URL[] urlArray = urls.toArray(new URL[0]);
        URLClassLoader cl = new URLClassLoader(urlArray);
        Thread.currentThread().setContextClassLoader(cl);
        try {
            Class clz = Class.forName("com.dc.jetty.start.StartServer", false, cl);
            Method method =  clz.getDeclaredMethod("getInstance");
            method.setAccessible(true);
            Object instance = method.invoke(clz);
            Method m = clz.getDeclaredMethod("start");
            m.invoke(instance);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

}

StartServer.java

package com.dc.jetty.start;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.dc.jetty.util.ConfigUtil;

public class StartServer {
    
    private static StartServer instance = null;
    
    private StartServer() {
        
    }
    
    public static StartServer getInstance() {
        if (instance == null) {
            instance = new StartServer();
        }
        return instance;
    }
    
    public void start() {
        ConfigUtil.getInstance().getProperty("");
        Server server = new Server(Integer.valueOf(ConfigUtil.getInstance().getProperty("port")));
        
        WebAppContext webapp = new WebAppContext();
        webapp.setContextPath(ConfigUtil.getInstance().getProperty("contextPath"));
        webapp.setResourceBase(ConfigUtil.getInstance().getProperty("resourceBase"));
        webapp.setDescriptor(ConfigUtil.getInstance().getProperty("descriptor"));
        webapp.setParentLoaderPriority(true);
        webapp.setClassLoader(Thread.currentThread().getContextClassLoader());
        
        server.setHandler(webapp);
        QueuedThreadPool pool = new QueuedThreadPool();
        pool.setMaxThreads(Integer.valueOf(ConfigUtil.getInstance().getProperty("maxThread")));
        pool.setMinThreads(Integer.valueOf(ConfigUtil.getInstance().getProperty("minThread")));
        pool.setName("RestServer");
        server.setThreadPool(pool);
        try {
            server.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Logger logger = LoggerFactory.getLogger(StartServer.class);
        logger.info("server starts");
        
        
    }
    
    public static void main(String[] args) {
        StartServer.getInstance().start();
    }

}

ConfigUtil.java

package com.dc.jetty.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

public class ConfigUtil {

    private static ConfigUtil instance = null;
    private Properties properties = null;

    private ConfigUtil() {

    }

    public static ConfigUtil getInstance() {
        if (instance == null) {
            instance = new ConfigUtil();
        }
        return instance;
    }

    public void load() {
        if (properties == null) {
            properties = new Properties();
            InputStream input = null;
            try {
                URL url = ConfigUtil.class.getClassLoader().getResource(
                        "config.properties");
                if (url == null) {
                    throw new FileNotFoundException(
                            "config.properties not found!");
                }
                input = new FileInputStream(url.getPath());
                // input = new FileInputStream(
                // "E:\paas\01工作库\09-代码\trunks\PaaS_NewFeatureLine\Code\OAuth\configs\oauth_conf\config.properties");
                properties.load(input);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void reload() {
        properties = new Properties();
        InputStream input = null;
        try {
            URL url = ConfigUtil.class.getClassLoader().getResource(
                    "config.properties");
            if (url == null) {
                throw new FileNotFoundException("config.properties not found!");
            }
            input = new FileInputStream(url.getPath());
            properties.load(input);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String getProperty(String name) {
        if (properties == null) {
            load();
        }
        return properties.getProperty(name);
    }

    public static void main(String[] args) {
        System.out.println(ConfigUtil.getInstance().getProperty("port"));
    }

}

ServiceBeanContext.java

package com.dc.multiwrite.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ServiceBeanContext {

    private static final Logger log = LoggerFactory
            .getLogger(ServiceBeanContext.class);

    private static ServiceBeanContext context = null;

    private static ApplicationContext ctx = null;

    private ServiceBeanContext() {

    }

    public static ServiceBeanContext getInstance() {
        if (context == null) {
            synchronized (ServiceBeanContext.class) {
                if (context == null) {
                    context = new ServiceBeanContext();
                }
            }
        }
        return context;
    }

    public void loadContext(String path) {
        try {
            ctx = new ClassPathXmlApplicationContext(path);
        } catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage(), e);
        }
    }

    public Object getBean(String bean) {
        return ctx.getBean(bean);
    }
}

DispatcherServlet.java

package com.dc.multiwrite.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServlet;

import com.dc.multiwrite.util.ServiceBeanContext;

public class DispatcherServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void init(ServletConfig config) {
        ServiceBeanContext.getInstance().loadContext("applicationContext.xml");
    }
}

applicationContext.xml

<?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:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd
                        http://www.springframework.org/schema/aop
                        http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                        http://www.springframework.org/schema/tx
                        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <context:property-placeholder location="classpath*:jdbc.properties" />

    <!-- proxool连接池 -->
    <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
        <property name="driver">
            <value>${jdbc.driverClassName}</value>
        </property>
        <property name="driverUrl">
            <value>${jdbc.url}</value>
        </property>
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="alias" value="Pool_dbname" />
        <property name="maximumActiveTime" value="600000" />
        <property name="prototypeCount" value="0" />
        <property name="maximumConnectionCount" value="50" />
        <property name="minimumConnectionCount" value="2" />
        <property name="simultaneousBuildThrottle" value="50" />
        <property name="houseKeepingTestSql" value="select CURRENT_DATE" />
    </bean>

    <!-- mybatis 配置 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:${jdbc.configLocation}" />
    </bean>
    
    <bean id="sqlMapClient"
        class="com.dc.multiwrite.dao.SqlMapClientTemplate">
        <property name="sqlSession" ref="sqlSession" />
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>

    <!-- 事务管理器 -->
    <bean id="transactionmanager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 方法事务参数 -->
    <tx:advice id="serviceAdvice" transaction-manager="transactionmanager">
        <tx:attributes>
            <tx:method name="updateAppScalableStatus" propagation="REQUIRES_NEW"
                isolation="READ_UNCOMMITTED" rollback-for="Exception" />
            <tx:method name="updateDefaultProtocol" propagation="REQUIRES_NEW"
                isolation="READ_UNCOMMITTED" rollback-for="Exception" />
            <tx:method name="saveProtocol" propagation="REQUIRES_NEW"
                isolation="READ_UNCOMMITTED" rollback-for="Exception" />
            <tx:method name="saveNewNode" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" />
            <tx:method name="run*" propagation="REQUIRED" rollback-for="Exception" />
            <tx:method name="save*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="saveUpgrade" propagation="SUPPORTS"
                isolation="READ_COMMITTED" rollback-for="Exception" />
            <tx:method name="update*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="del*" propagation="REQUIRED" rollback-for="Exception" />
            <tx:method name="start*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="stop*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="destroy*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="deploy*" propagation="REQUIRED" isolation="READ_COMMITTED"
                rollback-for="Exception" />
            <tx:method name="reapply" propagation="REQUIRED" isolation="READ_COMMITTED"
                rollback-for="Exception" />
            <tx:method name="redeploy*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="isolate*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="return*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="unisolate*" propagation="REQUIRED"
                rollback-for="Exception" />
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>

    <!-- 配置切面 -->
    <aop:config proxy-target-class="true">
        <aop:pointcut id="servicePointcut"
            expression="execution(* com.dc.multiwrite.service.impl.*.*(..))" />
        <aop:advisor pointcut-ref="servicePointcut" advice-ref="serviceAdvice" />
    </aop:config>

    <context:component-scan
        base-package="com.dc.multiwrite.dao.impl, com.dc.multiwrite.service.impl" />

</beans>

jdbc.properties

#oracle
#jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:PAAS
#jdbc.username=PAAS
#jdbc.password=PAAS
#jdbc.configLocation=sql-map-oracle-config.xml

#mysql
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://10.126.253.38:3306/test_guojwe?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
jdbc.username=root
jdbc.password=root
jdbc.configLocation=sql-map-mysql-config.xml

sql-map-mysql-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "ibatis-3-config.dtd">

<configuration>
    
    <settings>
        <setting name="lazyLoadingEnabled" value="false" />
        <setting name="cacheEnabled" value="true"/>
    </settings>
    
    <mappers>
        <mapper resource="db/mapping/mysql/test.xml"/>
    </mappers>
    
</configuration>

test.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "ibatis-3-mapper.dtd">
<mapper namespace="test">

    <insert id="insert" parameterType="java.util.List">
        insert into test(id, count)
        values
        <foreach collection="list" item="item" index="index" separator=",">
            (#{item.id}, #{item.count})
        </foreach>
    </insert>
    
    <update id="update" parameterType="java.util.List">
        <foreach collection="list" item="item" index="index" separator="">
            update test
            <set>
                count = #{item.count}
            </set>
            where id = #{item.id};
        </foreach>
    </update>
    
    <delete id="delete" parameterType="java.util.List">
        delete from test
        where id in
        <foreach collection="list" item="item" index="index" separator="," open ="(" close=")">
            #{item.id}
        </foreach>
    </delete>
    
</mapper>

ExecutorServicePool.java

package com.dc.multiwrite.util;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadFactory;

public class ExecutorServicePool {
    
    private static ExecutorServicePool pool;

    private transient ExecutorService services;
    
    private ExecutorServicePool(){
        int size = Integer.parseInt(ConfigUtil.getInstance().getProperty("multiwrite.threadPoolSize"));
        services = Executors.newFixedThreadPool( size, new ThreadFactory() {
            private static final String name = "multiwrite-thread";
            public Thread newThread(Runnable r) {
                return new Thread(r, name);
            }
        });
    }
    
    public static ExecutorServicePool getInstance(){
        if( pool == null ){
            synchronized( ExecutorServicePool.class ){
                if( pool == null ){
                    pool = new ExecutorServicePool();
                }
            }
        }
        return pool;
    }


    public ExecutorService getServices() {
        return services;
    }
    
    public <T> Future<T> submit( Callable<T> task ){
        return services.submit( task );
    }
    
    public Future<?> submit( Runnable task ){
        return services.submit( task );
    }
    
    public void execute( Runnable command ){
        services.execute( command );
    }
}
原文地址:https://www.cnblogs.com/sayaoailun/p/4923911.html