文章目录
1. 集成思想
storm集成spring的总的思想,是在storm容器中加载spring容器,达到使用spring提供的各个控件的目的。
2. 集成步骤
下面以集成spring jpa mysql为实例(依赖管理通过MAVEN方式管理),来讲解集成过程
2.1 引入pom依赖
<!-- 对mysql的支持 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2.2 引入spring配置文件 demo-spring.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:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
<!-- 开启定时任务 -->
<task:annotation-driven />
<context:component-scan base-package="com.xxx.*" />
<!--属性文件位置-->
<context:property-placeholder location="classpath:config-spring.properties"/>
<!--使用spring JPA 配置 start-->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${datasource.username}"></property>
<property name="password" value="${datasource.password}"></property>
<property name="driverClass" value="${datasource.driver-class-name}"></property>
<property name="jdbcUrl" value="${datasource.url}"></property>
</bean>
<!-- 配置 JPA 的 EntityManagerFactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property><!-- 添加数据源 -->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
</property>
<property name="packagesToScan" value="com.xxx.*"></property>
<!-- hibernate 配置 -->
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
<prop key="hibernate.show_sql">${jpa.show-sql}</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.dialect">${jpa.database-platform}</prop>
</props>
</property>
</bean>
<!-- 配置事务 纯事物 jpa事物 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<!-- dao包-->
<jpa:repositories base-package="com.xxx.repository" repository-impl-postfix="Impl" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>
</beans>
2.3 属性文件 config-spring.properties
##########################################
#######spring集成相关配置###################
#########################################
#mysql配置
datasource.driver-class-name=com.mysql.jdbc.Driver
datasource.url=jdbc:mysql://192.168.1.2:3306/demo?useSSL=false
datasource.username=root
datasource.password=123456
jpa.database-platform=org.hibernate.dialect.MySQLDialect
jpa.show-sql=true
2.4 仓库类
/**
* 测试仓库类
* @author shengshi_feiyang@yeah.net;
* @create 2018-03-23 9:30
**/
@Repository
public interface DemoRepository extends PagingAndSortingRepository<Demo, String> {
/**
* 获取Demo
* @param status 0删除 1正常
*/
List<Demo> findByStatus(int status);
}
2.5 初始化spring容器
在storm的每个bolt ,prepare方法总进行初始化spring context容器,从而达到使用spring控件的目的。
public class SpringTestBolt extends BaseBasicBolt {
private final static Logger logger = LoggerFactory.getLogger(SpringTestBolt.class);
protected ConfigurableApplicationContext applicationContext;
@Override
public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
}
@Override
public void prepare(Map stormConf, TopologyContext context) {
super.prepare(stormConf, context);
try {
if (applicationContext == null) {
applicationContext = new ClassPathXmlApplicationContext("/demo-spring.xml");
}
logger.info("{}",applicationContext);
}catch (Exception e){
logger.error("初始化配置信息失败,{}", e.getMessage());
}
}
}
2.6 打包
打包需要将所有依赖都打入jar包,提交到storm集群,在pom中引入打包属性。
<build>
<finalName>storm-test</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>${project.name}-${version}</finalName>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.provides</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.factories</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>