简单的介绍一下整个ITOO项目维护流程。首先是开发阶段,使用Eclipse开发工具进行开发。
开发所需要的Jar包,通过Maven+Negiux进行统一的管理,Negiux将本地Maven仓库和中央管理仓库解耦和,先将中央仓库中的某些资料下载到私服器(Negiux)上面,本地的Maven就可以直接访问局域网中的Negiux,而无需远程中央仓库了。这样好处就是节省网络带宽,加速本地快速搭建。
开发的代码首先经过Junit测试,本地测试通过后才能提交到版本控制工具SVN上面。与此同时,项目进行过程中遇到的问题及解决方案、会议、技术点、管理经验等等,都需要通过文档保留下来。这些文档统一由Confluence进行知识管理。
代码通过Jekins进行持续集成,Jekins各个子系统需要配置几个重要的地址:1.SVN本模块的地址 2.Negiux在局域网中的位置信息 3.Jboss的地址信息。
代码可以边集成,边测试 ,我们通过禅道创建产品,关联项目,创建测试用例,进行测试和bug修复工作。
整个系统前台web容器主要采用SpringMVC框架,有助于页面显示、业务逻辑的解耦,使整个Web页面更加整洁。SpringMVC中的Bean通过IOC容器来进行管理。通过SET的方式进行IOC依赖注入。
后台主要采用EJB容器,业务逻辑层主要采用的sessionBean中的无状态会话Bean,当客户端请求服务端的时候,无状态会话bean处理单一请求或商务过程。无需从之前的请求中提取任何状态。事务必须在一个方法中结束,通常资源占有量小,可以被共享。
持久层采用的JPA规范的实现之一EclipseLink。它和Hibernate同属于ORM思想的产物。它将EntityBean持久化到数据库,并且支持多租户。它对多租户的支持细化到了表,很不错的持久层框架。
在进行JNDI查找前,设置应用服务器的上下文信息(一般通过配置jndi.properties文件实现),主要是设置JNDI驱动的类名(java.naming.factory.initial)和命名服务提供者的URL(java.naming.prvoider.url)
java.naming.factory.initial=bitronix.tm.jndi.BitronixInitialContextFactory
在EJB中,一个实体Bean应用由实体类和persistence.xml文件文件组成,共同完成持久化工作。
<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <!-- Name属性用于定义持久化单元的名字,transaction-type指定事务类型 --> <persistence-unit name="MT_HOTEL_SERVICE" transaction-type="JTA"> <!-- javax.persistence.PersistenceProvider接口的一个实现类(可选) --> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <!-- Jta-data-source和 non-jta-data-source用于分别指定持久化提供商使用的JTA和/或non-JTA数据源的全局JNDI名称(可选) --> <jta-data-source>java:jboss/datasources/CloudMysqlDS</jta-data-source> <!-- 厂商专有属性(可选) --> <properties> <!-- 修改第一次加载时间长的问题 --> <property name="eclipselink.deploy-on-startup" value="True" /> <property name="eclipselink.jdbc.allow-native-sql-queries" value="true" /> <!-- 设置服务器类型 --> <property name="eclipselink.target-server" value="JBoss" /> <!-- logging --> <property name="eclipselink.logging.level" value="FINE" /> <property name="eclipselink.weaving" value="static" /> <property name="eclipselink.session.customizer" value="com.tgb.itoo.base.util.uuid.UUIDSequence" /> </properties> </persistence-unit> </persistence> </span>
Jar文件信息
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: itoo-basic-api Bundle-SymbolicName: itoo-basic-api Bundle-Version: 1.0.0.qualifier Export-Package: com.tgb.itoo.basic.entity, com.tgb.itoo.basic.service
POM包含了一个project所需要的所有信息,当然也就包含了构建过程中所需要的插件的配置信息,事实上,这里申明了"who","what",和"where",然而构建生命周期(buildlifecycle)s中说的是"when"和"how"。POM定义的三坐标,标记了仓库中的特定位置,groupId :artifactId:version
<span style="font-size:14px;"><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 基本设置 --> <parent> <groupId>com.tgb</groupId> <artifactId>itoo-basic-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../itoo-basic-parent/pom.xml</relativePath> </parent> <artifactId>itoo-basic-api</artifactId> <packaging>ejb</packaging> <dependencies> <dependency> <groupId>com.tgb</groupId> <artifactId>itoo-base</artifactId> </dependency> <dependency> <groupId>com.tgb</groupId> <artifactId>itoo-tool</artifactId> <!-- <version>${project.version}</version> --> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.jpa</artifactId> <version>${org.eclipse.persistence.jpa.version}</version> <!-- <scope>provided</scope> --> </dependency> </dependencies> <!-- 构建的过程 --> <build> <pluginManagement> <plugins> <plugin> <groupId>au.com.alderaan</groupId> <artifactId>eclipselink-staticweave-maven-plugin</artifactId> <version>1.0.3</version> <executions> <execution> <phase>process-classes</phase> <goals> <goal>weave</goal> </goals> <configuration> <persistenceXMLLocation>META-INF/persistence.xml</persistenceXMLLocation> <logLevel>FINE</logLevel> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.6.0</version> </dependency> </dependencies> </plugin> </plugins> </pluginManagement> </build> </project></span>
目的找到War包里面的jndi配置。
<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <sub-deployment name="itoo-basic-course-web-0.0.1-SNAPSHOT.war"> <dependencies> <module name="org.jboss.xnio" /> <module name="org.apache.shiro"> <imports> <include path="META-INF**" /> <include path="org**" /> </imports> </module> <module name="org.jasig.cas.client"> <imports> <include path="META-INF**" /> <include path="org**" /> </imports> </module> <module name="org.springframework.data"> <imports> <include path="META-INF**" /> <include path="org**" /> </imports> </module> <module name="org.crazycake"> <imports> <include path="META-INF**" /> <include path="org**" /> </imports> </module> <module name="commons-fileupload"> <imports> <include path="META-INF**" /> <include path="org**" /> </imports> </module> <module name="org.codehaus.jackson"> <imports> <include path="META-INF**" /> <include path="org**" /> </imports> </module> <module name="redis.clients"> <imports> <include path="META-INF**" /> <include path="org**" /> </imports> </module> <module name="commons-lang"> <imports> <include path="META-INF**" /> <include path="org**" /> </imports> </module> <module name="org.apache.commons.commons-pool2"> <imports> <include path="META-INF**" /> <include path="org**" /> </imports> </module> <module name="org.springframework"> <imports> <include path="META-INF**" /> <include path="org**" /> </imports> </module> </dependencies> </sub-deployment> </jboss-deployment-structure> </span>
配置远程调用
<span style="font-size:14px;"><?xml version="1.0" encoding="UTF-8"?> <jboss-ejb-client xmlns="urn:jboss:ejb-client:1.0"> <client-context> <ejb-receivers> <!--需要多个的话--> <!--远程调用基础的配置--> <remoting-ejb-receiver outbound-connection-ref="remote-ejb-connection-jc"/> </ejb-receivers> </client-context> </jboss-ejb-client></span>
这样的目的是通过evn找到相应的JBOSS的配置,也就是需要远程调用的JBOSS的ip,端口号,用户名和密码。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" 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-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 http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- 这样的目的是通过evn找到相应的JBOSS的配置,也就是需要远程调用的JBOSS的ip,端口号,用户名和密码。 --> <util:properties id="evn" location="classpath:config/jboss-ejb-client.properties"></util:properties> </beans>
2)Jboss-ejb-client.properties
主要是配置IP和端口号以及需要远程调用的JBOSS的账户名和密码,同时我们还可以再JBOSS中配置多个远程调用的接口。
endpoint.name=client-endpoint remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false org.jboss.ejb.client.scoped.context=true jboss.naming.client.ejb.context=true Context.URL_PKG_PREFIXES=org.jboss.ejb.client.naming javax.naming.Context.INITIAL_CONTEXT_FACTORY=org.jboss.naming.remote.client.InitialContextFactory remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false remote.connectionprovider.create.options.org.xnio.Options.SSL_STARTTLS=false jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false remote.connections=one,two remote.connection.one.host=192.168.24.115 remote.connection.one.port=4447 remote.connection.one.username=adminqx remote.connection.one.password=!admin123 #add log remote.connection.two.host=192.168.24.74 remote.connection.two.port=4447 remote.connection.two.username=adminjc remote.connection.two.password=!admin123
分为两种,snapshot快照仓库和release发布仓库。snapshot快照仓库用于保存开发过程中的不稳定的版本,release正式仓库则是用来保存稳定的发行版本。
四、总结
整个框架很庞大,先宏观的鸟瞰一下,接下来就是各个击破了。学习就是从宏观到细节,在细节实践,然后再从回到宏观补充整个知识网的过程。