您的位置:首页 > 产品设计 > 产品经理

SSH整合JBPM4.4

2010-11-29 17:33 369 查看
第一步:导入所需jar包

具体所需jar包见附件图片



第二步:修改jbpm配置文件:

1、src目录下建立jbpm.cfg.xml(注意注释部分)

Xml代码



<?xml version="1.0" encoding="UTF-8"?>

<jbpm-configuration>

<process-engine-context>

<string name="spring.cfg" value="applicationContext.xml" />

</process-engine-context>

<import resource="jbpm.default.cfg.xml" />

<import resource="jbpm.tx.spring.cfg.xml" />

<import resource="jbpm.jpdl.cfg.xml" />

<import resource="jbpm.bpmn.cfg.xml" />

<import resource="jbpm.identity.cfg.xml" />

<import resource="jbpm.businesscalendar.cfg.xml" />

<import resource="jbpm.console.cfg.xml" />

<import resource="jbpm.spring.default.cfg.xml"/>

<!--

<import resource="jbpm.jobexecutor.cfg.xml" />

-->

</jbpm-configuration>

<?xml version="1.0" encoding="UTF-8"?>
<jbpm-configuration>
<process-engine-context>
<string name="spring.cfg" value="applicationContext.xml" />
</process-engine-context>
<import resource="jbpm.default.cfg.xml" />
<import resource="jbpm.tx.spring.cfg.xml" />
<import resource="jbpm.jpdl.cfg.xml" />
<import resource="jbpm.bpmn.cfg.xml" />
<import resource="jbpm.identity.cfg.xml" />
<import resource="jbpm.businesscalendar.cfg.xml" />
<import resource="jbpm.console.cfg.xml" />
<import resource="jbpm.spring.default.cfg.xml"/>
<!--
<import resource="jbpm.jobexecutor.cfg.xml" />
-->
</jbpm-configuration>


2、src目录下建立jbpm.spring.default.cfg.xml

Xml代码



<?xml version="1.0" encoding="UTF-8"?>

<jbpm-configuration>

<process-engine-context>

<repository-service />

<repository-cache />

<execution-service />

<history-service />

<management-service />

<identity-service />

<task-service />

<!--

<hibernate-configuration>

<cfg resource="jbpm.hibernate.cfg.xml" />

</hibernate-configuration>

<hibernate-session-factory />

-->

<script-manager default-expression-language="juel"

default-script-language="juel"

read-contexts="execution, environment, process-engine"

write-context="">

<script-language name="juel" factory="org.jbpm.pvm.internal.script.JuelScriptEngineFactory" />

</script-manager>

<authentication />

<id-generator />

<types resource="jbpm.variable.types.xml" />

<address-resolver />

<business-calendar>

<monday hours="9:00-12:00 and 12:30-17:00"/>

<tuesday hours="9:00-12:00 and 12:30-17:00"/>

<wednesday hours="9:00-12:00 and 12:30-17:00"/>

<thursday hours="9:00-12:00 and 12:30-17:00"/>

<friday hours="9:00-12:00 and 12:30-17:00"/>

<holiday period="01/07/2008 - 31/08/2008"/>

</business-calendar>

<mail-template name='task-notification'>

<to users="${task.assignee}"/>

<subject>${task.name}</subject>

<text><![CDATA[Hi ${task.assignee},

Task "${task.name}" has been assigned to you.

${task.description}

Sent by JBoss jBPM

]]></text>

</mail-template>

<mail-template name='task-reminder'>

<to users="${task.assignee}"/>

<subject>${task.name}</subject>

<text><![CDATA[Hey ${task.assignee},

Do not forget about task "${task.name}".

${task.description}

Sent by JBoss jBPM

]]></text>

</mail-template>

</process-engine-context>

<transaction-context>

<repository-session />

<db-session />

<message-session />

<timer-session />

<history-session />

<mail-session>

<mail-server>

<session-properties resource="jbpm.mail.properties" />

</mail-server>

</mail-session>

</transaction-context>

</jbpm-configuration>

<?xml version="1.0" encoding="UTF-8"?>

<jbpm-configuration>

<process-engine-context>

<repository-service />
<repository-cache />
<execution-service />
<history-service />
<management-service />
<identity-service />
<task-service />
<!--
<hibernate-configuration>
<cfg resource="jbpm.hibernate.cfg.xml" />
</hibernate-configuration>

<hibernate-session-factory />
-->
<script-manager default-expression-language="juel"
default-script-language="juel"
read-contexts="execution, environment, process-engine"
write-context="">
<script-language name="juel" factory="org.jbpm.pvm.internal.script.JuelScriptEngineFactory" />
</script-manager>

<authentication />

<id-generator />
<types resource="jbpm.variable.types.xml" />

<address-resolver />

<business-calendar>
<monday    hours="9:00-12:00 and 12:30-17:00"/>
<tuesday   hours="9:00-12:00 and 12:30-17:00"/>
<wednesday hours="9:00-12:00 and 12:30-17:00"/>
<thursday  hours="9:00-12:00 and 12:30-17:00"/>
<friday    hours="9:00-12:00 and 12:30-17:00"/>
<holiday period="01/07/2008 - 31/08/2008"/>
</business-calendar>

<mail-template name='task-notification'>
<to users="${task.assignee}"/>
<subject>${task.name}</subject>
<text><![CDATA[Hi ${task.assignee},
Task "${task.name}" has been assigned to you.
${task.description}

Sent by JBoss jBPM
]]></text>
</mail-template>

<mail-template name='task-reminder'>
<to users="${task.assignee}"/>
<subject>${task.name}</subject>
<text><![CDATA[Hey ${task.assignee},
Do not forget about task "${task.name}".
${task.description}

Sent by JBoss jBPM
]]></text>
</mail-template>

</process-engine-context>

<transaction-context>
<repository-session />
<db-session />

<message-session />
<timer-session />
<history-session />
<mail-session>
<mail-server>
<session-properties resource="jbpm.mail.properties" />
</mail-server>
</mail-session>
</transaction-context>

</jbpm-configuration>


第三步:修改Spring配置文件

1、applicationContext.xml中加入springHelper配置,作为jbpm processEngine的factory bean

Xml代码



<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">

<property name="jbpmCfg" value="jbpm.cfg.xml" />

</bean>

<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">
<property name="jbpmCfg" value="jbpm.cfg.xml" />
</bean>


2、applicationContext.xml中加入processEngine配置,并以此为factory bean创建JBPM本身的各种Service

Xml代码



<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />

<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>

<bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService"/>

<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>

<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>

<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>

<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine"  />

<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
<bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService"/>
<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>
<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>

3、applicationContext.xml的hibernate配置中加入jbpm所需的hbm.xml配置

Xml代码



<property name="mappingLocations">

<list>

<value>classpath:jbpm.execution.hbm.xml</value>

<value>classpath:jbpm.history.hbm.xml</value>

<value>classpath:jbpm.identity.hbm.xml</value>

<value>classpath:jbpm.repository.hbm.xml</value>

<value>classpath:jbpm.task.hbm.xml</value>

</list>

</property>

<property name="mappingLocations">
<list>
<value>classpath:jbpm.execution.hbm.xml</value>
<value>classpath:jbpm.history.hbm.xml</value>
<value>classpath:jbpm.identity.hbm.xml</value>
<value>classpath:jbpm.repository.hbm.xml</value>
<value>classpath:jbpm.task.hbm.xml</value>
</list>
</property>

4、完整的applicationContext.xml(包括其余DataSource、SessionFacotry、事务控制等)

applicationContext.xml

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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="true">

<import resource="serviceContext.xml" />

<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">

<property name="jbpmCfg" value="jbpm.cfg.xml" />

</bean>

<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />

<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>

<bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService"/>

<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>

<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>

<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>

<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">

<property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />

<property name="jdbcUrl" value="jdbc:oracle:thin:@XXXXX:1521:XE" />

<property name="username" value="jbpm4" />

<property name="password" value="jbpm" />

<property name="idleConnectionTestPeriod" value="60" />

<property name="idleMaxAge" value="240" />

<property name="maxConnectionsPerPartition" value="60" />

<property name="minConnectionsPerPartition" value="20" />

<property name="partitionCount" value="3" />

<property name="acquireIncrement" value="10" />

<property name="preparedStatementCacheSize" value="50" />

<property name="statementsCachedPerConnection" value="30" />

<property name="releaseHelperThreads" value="3" />

</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">

<property name="targetDataSource">

<ref local="mainDataSource" />

</property>

</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

<property name="dataSource">

<ref bean="dataSource" />

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</prop>

<prop key="hibernate.show_sql">true</prop>

</props>

</property>

<property name="mappingLocations">

<list>

<value>classpath:jbpm.execution.hbm.xml</value>

<value>classpath:jbpm.history.hbm.xml</value>

<value>classpath:jbpm.identity.hbm.xml</value>

<value>classpath:jbpm.repository.hbm.xml</value>

<value>classpath:jbpm.task.hbm.xml</value>

</list>

</property>

<property name="annotatedClasses">

<list>

<value>com.fish119.jssh.pojo.Test</value>

</list>

</property>

</bean>

<!-- 事务配置开始 -->

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory" />

</bean>

<!--事务配置-->

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">

<property name="transactionManager">

<ref bean="transactionManager" />

</property>

<!-- 配置事务属性 -->

<property name="transactionAttributes">

<props>

<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="delete*">PROPAGATION_REQUIRED</prop>

<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="*Save*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="exchange*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="remove*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="set*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="Test*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="*Test">PROPAGATION_REQUIRED,-Exception</prop>

</props>

</property>

</bean>

<bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<property name="beanNames">

<list>

<value>*Service</value>

</list>

</property>

<property name="interceptorNames">

<list>

<value>transactionInterceptor</value>

</list>

</property>

</bean>

<!-- 事务配置结束 -->

<bean id="testDAO" class="com.fish119.jssh.dao.TestDAO" autowire="byType">

<property name="sessionFactory">

<ref bean="sessionFactory" />

</property>

</bean>

</beans>

<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-lazy-init="true">
<import resource="serviceContext.xml" />

<bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper"> <property name="jbpmCfg" value="jbpm.cfg.xml" /> </bean>

<bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" /> <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/> <bean id="executionService" factory-bean="processEngine" factory-method="getExecutionService"/> <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/> <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/> <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>

<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@XXXXX:1521:XE" />
<property name="username" value="jbpm4" />
<property name="password" value="jbpm" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="idleMaxAge" value="240" />
<property name="maxConnectionsPerPartition" value="60" />
<property name="minConnectionsPerPartition" value="20" />
<property name="partitionCount" value="3" />
<property name="acquireIncrement" value="10" />
<property name="preparedStatementCacheSize" value="50" />
<property name="statementsCachedPerConnection" value="30" />
<property name="releaseHelperThreads" value="3" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource">
<ref local="mainDataSource" />
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingLocations"> <list> <value>classpath:jbpm.execution.hbm.xml</value> <value>classpath:jbpm.history.hbm.xml</value> <value>classpath:jbpm.identity.hbm.xml</value> <value>classpath:jbpm.repository.hbm.xml</value> <value>classpath:jbpm.task.hbm.xml</value> </list> </property>
<property name="annotatedClasses">
<list>
<value>com.fish119.jssh.pojo.Test</value>
</list>
</property>
</bean>

<!-- 事务配置开始 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--事务配置-->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="*Save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="exchange*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="remove*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="set*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="Test*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="*Test">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
<bean id="autoproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<!-- 事务配置结束 -->
<bean id="testDAO" class="com.fish119.jssh.dao.TestDAO" autowire="byType">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
</beans>


第四步:配置Struts2(使用了convention plugin)

struts.xml

Xml代码



<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<constant name="struts.objectFactory" value="spring" />

<!--

<constant name="struts.objectFactory.spring.autoWire" value="type"/>

-->

<constant name="struts.devMode" value="true" />

<constant name="struts.convention.classes.reload" value="true" />

<!-- 结果资源所在路径 -->

<constant name="struts.convention.result.path" value="/" />

<!-- 默认action所在的包 -->

<constant name="struts.convention.default.parent.package"

value="myPackage" />

<!-- 不被convention组件扫描的包 -->

<!-- <constant name="struts.convention.exclude.packages" value=""/> -->

<package name="myPackage" extends="json-default">

<global-results>

<result name="exception">/error.jsp</result>

<result name="error">/error.jsp</result>

<result name="none">/error.jsp</result>

<result name="login">/login.jsp</result>

</global-results>

<global-exception-mappings>

<exception-mapping result="exception" exception="java.lang.Exception">

</exception-mapping>

</global-exception-mappings>

</package>

</struts>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<constant name="struts.objectFactory" value="spring" />
<!--
<constant name="struts.objectFactory.spring.autoWire" value="type"/>
-->

<constant name="struts.devMode" value="true" />
<constant name="struts.convention.classes.reload" value="true" />

<!-- 结果资源所在路径 -->
<constant name="struts.convention.result.path" value="/" />
<!-- 默认action所在的包 -->
<constant name="struts.convention.default.parent.package"
value="myPackage" />
<!-- 不被convention组件扫描的包  -->
<!-- <constant name="struts.convention.exclude.packages" value=""/>  -->

<package name="myPackage" extends="json-default">

<global-results>
<result name="exception">/error.jsp</result>
<result name="error">/error.jsp</result>
<result name="none">/error.jsp</result>
<result name="login">/login.jsp</result>
</global-results>

<global-exception-mappings>
<exception-mapping result="exception" exception="java.lang.Exception">
</exception-mapping>
</global-exception-mappings>

</package>
</struts>


第五步:测试

1、建立action类:IndexAction

Java代码



public class IndexAction extends BaseAction{

private static final long serialVersionUID = 1L;

ProcessEngine processEngine;

RepositoryService repositoryService;

ExecutionService executionService;

TaskService taskService;

HistoryService historyService;

IdentityService identityService;

public ProcessEngine getProcessEngine(){

return processEngine;

}

public void setProcessEngine(ProcessEngine processEngine){

this.processEngine = processEngine;

}

public RepositoryService getRepositoryService(){

return repositoryService;

}

public void setRepositoryService(RepositoryService repositoryService){

this.repositoryService = repositoryService;

}

public ExecutionService getExecutionService(){

return executionService;

}

public void setExecutionService(ExecutionService executionService){

this.executionService = executionService;

}

public TaskService getTaskService(){

return taskService;

}

public void setTaskService(TaskService taskService){

this.taskService = taskService;

}

public HistoryService getHistoryService(){

return historyService;

}

public void setHistoryService(HistoryService historyService){

this.historyService = historyService;

}

public IdentityService getIdentityService(){

return identityService;

}

public void setIdentityService(IdentityService identityService){

this.identityService = identityService;

}

public String execute(){

System.out.println("processEngine:" + this.getProcessEngine());

System.out.println("repositoryService:"

+ this.getRepositoryService());

System.out

.println("executionServcie:" + this.getExecutionService());

System.out.println("taskService:" + this.getTaskService());

System.out.println("historyService:" + this.getHistoryService());

return SUCCESS;

}

}

public class IndexAction extends BaseAction{

private static final long serialVersionUID = 1L;

ProcessEngine processEngine;
RepositoryService repositoryService;
ExecutionService executionService;
TaskService taskService;
HistoryService historyService;
IdentityService identityService;

public ProcessEngine getProcessEngine(){
return processEngine;
}

public void setProcessEngine(ProcessEngine processEngine){
this.processEngine = processEngine;
}

public RepositoryService getRepositoryService(){
return repositoryService;
}

public void setRepositoryService(RepositoryService repositoryService){
this.repositoryService = repositoryService;
}

public ExecutionService getExecutionService(){
return executionService;
}

public void setExecutionService(ExecutionService executionService){
this.executionService = executionService;
}

public TaskService getTaskService(){
return taskService;
}

public void setTaskService(TaskService taskService){
this.taskService = taskService;
}

public HistoryService getHistoryService(){
return historyService;
}

public void setHistoryService(HistoryService historyService){
this.historyService = historyService;
}

public IdentityService getIdentityService(){
return identityService;
}

public void setIdentityService(IdentityService identityService){
this.identityService = identityService;
}

public String execute(){
System.out.println("processEngine:" + this.getProcessEngine());
System.out.println("repositoryService:"
+ this.getRepositoryService());
System.out
.println("executionServcie:" + this.getExecutionService());
System.out.println("taskService:" + this.getTaskService());
System.out.println("historyService:" + this.getHistoryService());
return SUCCESS;
}
}

2、启动tomcat,访问http://localhost:8080/ProjectName/index。控制台出现以下内容:

Java代码



processEngine:org.jbpm.pvm.internal.processengine.SpringProcessEngine@2553861

repositoryService:org.jbpm.pvm.internal.repository.RepositoryServiceImpl@22b044e

executionServcie:org.jbpm.pvm.internal.svc.ExecutionServiceImpl@220d12e

taskService:org.jbpm.pvm.internal.svc.TaskServiceImpl@22d9289

historyService:org.jbpm.pvm.internal.svc.HistoryServiceImpl@2257b64

、可以进一步进行事务测试,建立自己的Service类,添加测试方法,可以看到事务已由Spring统一管理,这里就不提供代码了

identityService:org.jbpm.pvm.internal.svc.IdentityServiceImpl@223f277

附件:所需的jar包(使用了hibernate annotation和struts2的convention-plugin,可能有多余的包,没做清理):
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: