我正在尝试将骆驼上下文中的消息从Bean发送到路由。如何正确执行操作以及如何重用ProducerTemplate?
我尝试将所需的端点注入到我的bean中并从中创建一个ProducerTemplate。我有一种怀疑,它在名为onSubscriptionValueReceived的方法中为我提供了值。在那种方法中,我尝试将值发送到注入的端点。我还尝试在端点上设置block = true,因为我怀疑某个地方存在竞争状况,但这也无济于事。
这是我注入端点的方式:
@EndpointInject(uri="direct:onSubscriptionValue?block=true")
ProducerTemplate producer;
这是我的方法,应该将新值发送到direct:onSub ...:
public void onSubscriptionValue(UaMonitoredItem item, DataValue value) throws Exception {
producer = context.createProducerTemplate();
producer.setDefaultEndpointUri("direct:onSubscriptionValue?block=true");
producer.requestBody(new MutablePair<NodeId, DataValue>(item.getReadValueId().getNodeId(), value));
producer.stop();
}
我也尝试过:
public void onSubscriptionValue(UaMonitoredItem item, DataValue value) throws Exception {
producer.requestBody(new MutablePair<NodeId, DataValue>(item.getReadValueId().getNodeId(), value));
}
但是,同样的错误。
这是我的骆驼上下文代码:
<route startupOrder="1">
<from uri="direct:onSubscriptionValue?block=true"/>
<choice>
<when>
<simple>${bodyAs(String)} regex ".*LKM27_laufmeter.*"</simple>
<to uri="direct:LKM27_laufmeter"/>
</when>
<when>
<simple>${bodyAs(String)} regex ".*LKM27_lfm_reset.*"</simple>
<to uri="direct:LKM27_lfm_reset"/>
</when>
<when>
<simple>${bodyAs(String)} regex ".*LKM27_geschwindigkeit.*"</simple>
<to uri="direct:LKM27_geschwindigkeit"/>
</when>
</choice>
</route>
如您所见,它只是基于内容的路由器。
我希望这个结构将我从bean内的订阅中获得的所有新值发送到注入的端点。这适用于我从订阅中获得的第一组值,但是对于后续的那些,我总是得到以下WARN消息:
org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: direct://onSubscriptionValue?block=true due to: Cannot auto create component: direct
java.lang.IllegalStateException: ProducerTemplate has not been started
我不了解。它对第一组值进行处理没有问题,但是对于第二组和后续值,它突然抛出这些WARN消息。有趣的是,尽管有WARN消息,但所有消息均到达所需的端点,并且可以毫无问题地进行进一步处理。这些WARN消息不断弹出真是令人讨厌。