Spring 4.15配置中如何在服务启动时动态生成时间戳/UUID作为路径值?
Absolutely, you can dynamically use a timestamp or UUID as a value in your Spring configuration when the service starts—even with Spring 4.1.5 (no upgrade required). Below are two practical approaches to get your Atomikos log directories to use unique, runtime-generated paths:
Approach 1: Use Spring Expression Language (SpEL) Directly in XML
Spring 4.x supports SpEL in XML configurations, which lets you generate a timestamp directly within your <prop> tags. This is the quickest solution if you don't need complex logic.
Update your Atomikos bean configuration like this:
<bean id="atomikosUserTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp" init-method="init" destroy-method="shutdownForce"> <constructor-arg> <props> <!-- Generate a timestamp in yyyyMMddHHmmss format --> <prop key="com.atomikos.icatch.output_dir">#{T(java.text.SimpleDateFormat).newInstance('yyyyMMddHHmmss').format(new java.util.Date())}/log/</prop> <prop key="com.atomikos.icatch.log_base_dir">#{T(java.text.SimpleDateFormat).newInstance('yyyyMMddHHmmss').format(new java.util.Date())}/log/</prop> <!-- Uncomment if needed --> <!--<prop key="com.atomikos.icatch.max_actives">1000</prop>--> </props> </constructor-arg> </bean>
- Note:
SimpleDateFormatisn't thread-safe, but since this runs only once during bean initialization, there's no risk of concurrency issues here. - To use UUID instead: Replace the timestamp SpEL with
#{T(java.util.UUID).randomUUID().toString()}.
Approach 2: Custom FactoryBean for Flexible Property Generation
If you need more control (e.g., reusable logic, custom timestamp formats, or additional properties), create a custom FactoryBean to generate the Properties object dynamically.
Step 1: Create the FactoryBean class
import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; import org.springframework.beans.factory.FactoryBean; public class AtomikosDynamicPropsFactory implements FactoryBean<Properties> { @Override public Properties getObject() throws Exception { Properties props = new Properties(); // Customize the timestamp format as needed String timestamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date()); // Or use UUID: String uuid = java.util.UUID.randomUUID().toString(); props.setProperty("com.atomikos.icatch.output_dir", timestamp + "/log/"); props.setProperty("com.atomikos.icatch.log_base_dir", timestamp + "/log/"); // Add other Atomikos properties here if required return props; } @Override public Class<?> getObjectType() { return Properties.class; } @Override public boolean isSingleton() { return true; } }
Step 2: Update your Spring XML configuration
<!-- Register the custom FactoryBean --> <bean id="atomikosDynamicProps" class="your.package.name.AtomikosDynamicPropsFactory"/> <!-- Inject the dynamically generated Properties into Atomikos --> <bean id="atomikosUserTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp" init-method="init" destroy-method="shutdownForce"> <constructor-arg ref="atomikosDynamicProps"/> </bean>
This approach keeps your XML clean and lets you modify the dynamic path logic without touching the configuration file.
内容的提问来源于stack exchange,提问作者paul

