Mule:在 spring bean 上设置 属性

Mule: Setting a property on a spring bean

我正在使用 Mule v3.5.0

目前我有一个名为 flowContextEnricher 的 bean,它将一个对象设置为一个包含一些关于流的信息的 eventContext 会话。此信息稍后用于审核日志记录:

@Component
public abstract class AbstractContextEnricher implements Callable {

public Stream buildStream() {
    final Stream stream = ...
    return stream;
}

@Override
public Object onCall(MuleEventContext eventContext) throws Exception {

    final Stream stream = buildStream();

    eventContext.getSession().setProperty("stream", stream);

    return eventContext.getMessage().getPayloadAsString();
}

我想将此 ContextEnricher 重用于在线服务和模拟服务,但对于模拟服务,必须将额外的布尔值 属性 模拟设置为 'TRUE'。

我可以通过添加一个单独的增强器来做到这一点:MockContectEnricher:

@Component
public class MockContextEnricher implements Callable {

    @Override
    public Object onCall(MuleEventContext eventContext) throws Exception {
        eventContext.getSession().setProperty("mock", Boolean.TRUE);
        return eventContext.getMessage().getPayloadAsString();
    }
}

然后我必须为所有模拟流程调用附加组件。我的总流量是这样的:

<flow name="xxxFlowMock" processingStrategy="synchronous">
    <servlet:inbound-endpoint path="/xxx/mock" responseTimeout="10000" />
    <component>
        <spring-object bean="mockContextEnricher"/>
    </component>
    <component>
        <spring-object bean="xxxContextEnricher"/>
    </component>
    <component>
        <spring-object bean="auditLogger"/>
    </component>
    ...
</flow>

这可行,但看起来有点奇怪。难道不能将 xxxContextEnricher 重用于在线服务和模拟服务,并且只在 bean 上设置一个 属性 吗?

<property name="mock" value="true">

实现它的最佳方法是什么?

再有一个 MockContextEnricher 应该不会太糟糕。虽然我认为如果 MockContextEnricher class 只是扩展 xxxContextEnricher,你可以做得更好。这样,你就可以拥有这样的东西了。

@Component
public class MockContextEnricher extends xxxContextEnricher {

    @Override
    public Object onCall(MuleEventContext eventContext) throws Exception {
        eventContext.getSession().setProperty("mock", Boolean.TRUE);
        return super.onCall(eventContext);
    }
}

或者,如果您想真正删除 MockContextEnricher。试试这个。

将字段(可能是布尔类型)添加到 xxxContextEnricher class 用于 'mock' 属性,添加使用它有条件地添加 'mock' 会话 属性。

示例初始化:

<spring:bean id="mockContextEnricher" name="mockContextEnricher" class="com.example.xxxContextEnricher">
   <spring:property name="mock" value="true"/>
</spring:bean>
...
<flow name="xxxFlowMock" processingStrategy="synchronous">
    <servlet:inbound-endpoint path="/xxx/mock" responseTimeout="10000" />
    <component>
        <spring-object bean="mockContextEnricher"/>
    </component>
    <component>
        <spring-object bean="auditLogger"/>
    </component>
    ...
</flow>

现在我通过向每个模拟流添加一个 message-properties-transformer 组件来解决它。默认情况下,如果未指定,我将其设置为 false,仅在模拟流程中我将 属性 设置为 true。

<message-properties-transformer scope="session">
        <add-message-property key="mock" value="true"/>
</message-properties-transformer>

尽管如此,通过 spring-bean 对象设置它会更清晰...