前一段时间在读《领域特定语言》这本书,回顾之前项目,有几个似乎用到领域特定语言(DSL)的例子。
第一个例子:消息处理流程
1、背景:应用系统A要对其它系统传递过来的消息进行处理,传递消息的方式可以有kafka消息中间件或直接调用应用系统A的接口。
上图是消息处理的流程,kafkaMessageSource作为一个消息源需要把kafka消息转换成MessageProcessor能处理的消息。MessageProcessor能处理实现Message接口的消息,不同类型的消息由不同的消息过滤器和处理器。
上图描述消息处理流程的领域模型。
2、以下配置用于描述整个处理流程的结构:
// 消息处理配置示例
<!-- handler处理器 -->
<bean id="aiHandler" class="com.xxxx.message.handler.AIHandler"/>
<bean id="pushHandler" class="com.xxxx.message.handler.PushHandler"/>
<!-- handler处理器 -->
<!-- filter过滤器 -->
<bean id="securityFilter" class="com.xxxx.message.filter.SecurityFilter"/>
<!-- filter过滤器 -->
<bean id="messageProcessor" class="com.xxxx.message.processor.MessageProcessor">
<constructor-arg index="0">
<list>
<bean class="com.xxxx.message.MessageHandleConfig">
<property name="messageClass" value="com.xxxx.message.XxxxxMessage"/>
<property name="filters">
<list>
<ref bean="securityFilter"/>
</list>
</property>
<property name="handlers">
<list>
<ref bean="aiHandler"/>
<ref bean="pushHandler"/>
</list>
</property>
</bean>
<!-- 其它消息处理 -->
<bean class="com.xxxx.message.MessageHandleConfig">
<property name="messageClass" value="com.xxxx.message.XxxxxMessage"/>
<property name="filters">
<list>
</list>
</property>
<property name="handlers">
<list>
</list>
</property>
</bean>
</list>
</constructor-arg>
</bean>
<!-- 消息源 -->
<bean id="kafkaMssageSource" class="com.xxxx.message.source.KafkaMessageSource">
<constructor-arg index="0">
<list>
<bean class="com.xxxx.message.source.CommonKafkaMessageConfig">
<property name="kafkaMessageClass" value="com.xxxx.message.XxxxxKafkaMessage" />
<property name="converter" ref="kafkaMessageConverter"/>
</bean>
</list>
</constructor-arg>
</bean>
<!-- 设备消息源 -->
</beans>
这个配置文件被放在spring 项目,借助spring框架自动完成配置文件的解析工作,这已有DSL的味道。
参考资料:马丁·福勒的《领域特定语言》