2016-01-15 66 views
0

我正在嘗試在駱駝JMS(ActiveMQ)使用者上設置預取策略。根據駱駝文檔http://camel.apache.org/activemq.html#ActiveMQ-UsingActiveMQDestinationOptions,我應該能夠通過將?destination.consumer.prefetchSize=1添加到端點URL來完成此操作。無法在駱駝端點中設置ActiveMQ目標選項

不幸的是我做到這一點時,我得到以下異常

Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: activemq://queue:ToSynchronize?destination.consumer.prefetchSize=1 due to: There are 1 parameters that couldn't be set on the endpoint. Check the uri if the parameters are spelt correctly and that they are properties of the endpoint. Unknown parameters=[{destination.consumer.prefetchSize=1}] 
    at org.apache.camel.impl.DefaultComponent.validateParameters(DefaultComponent.java:183) 
    at org.apache.camel.impl.DefaultComponent.createEndpoint(DefaultComponent.java:128) 
    at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:558) 
    ... 48 more 

我有一個簡單的路線建設者

@Component 
public class IntegrationRout extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 
     from("activemq:queue:ToSynchronize?destination.consumer.prefetchSize=1") 
      .unmarshal().jaxb("com.foo.jms.model") 
      .beanRef("Service", "upload") 
    } 
} 

而且在Java Spring的配置(一些教程如何配置JMS事務採取客戶端)

@Configuration 
@EnableTransactionManagement 
@ComponentScan(basePackages = {"com.foo"}) 
public class SynchronizationConfiguration extends CamelConfiguration { 

    @Bean 
    public ConnectionFactory jmsConnectionFactory() { 
     return new ActiveMQConnectionFactory("tcp://localhost:61616"); 
    } 

    @Bean 
    @Autowired 
    public PlatformTransactionManager jmsTransactionManager(final ConnectionFactory jmsConnectionFactory) { 
     return new JmsTransactionManager(jmsConnectionFactory); 
    } 

    @Bean 
    @Autowired 
    public JmsComponent activemq(final ConnectionFactory jmsConnectionFactory, final PlatformTransactionManager jmsTransactionManager) { 
     return JmsComponent.jmsComponentTransacted(jmsConnectionFactory, jmsTransactionManager); 
    } 
} 

回答

1

如果配置了ActiveMQ目標選項像?destination.consumer.prefetchSize=1你必須明確地使用ActiveMQComponent類。使用通用JmsComponent將不起作用。

所以,你有東西來取代

@Bean 
    @Autowired 
    public JmsComponent activemq(final ConnectionFactory jmsConnectionFactory, final PlatformTransactionManager jmsTransactionManager) { 
     return JmsComponent.jmsComponentTransacted(jmsConnectionFactory, jmsTransactionManager); 
    } 

@Bean 
    @Autowired 
    public JmsComponent activemq(final ConnectionFactory jmsConnectionFactory, final PlatformTransactionManager jmsTransactionManager) { 
     final ActiveMQComponent activemq = new ActiveMQComponent(); 
     activemq.setConnectionFactory(jmsConnectionFactory); 
     activemq.setTransactionManager(jmsTransactionManager); 
     activemq.setTransacted(true); 
     return activemq; 
    }