Как направить Apache Camel в очередь ActiveMQ JMS в памяти - PullRequest
0 голосов
/ 30 декабря 2018

TLDR: я хочу знать, как подключиться к очереди JMS в памяти, созданной с помощью весенней загрузки java и конфигурации по умолчанию, с использованием верблюжьей вершины apache.В настоящее время я пытаюсь подключиться, но он продолжает показывать ошибку:

Не удалось подключиться к [tcp: // localhost: 61616] после: 10 попыток повторных попыток.

Я попытался отредактировать свойства, чтобы изменить конфигурацию и маршрутизацию, добавив параметры, но безуспешно.Любая помощь приветствуется.Я оставляю весь код ниже для тех, кому нужны подробности.

MainApplication.java

public class MainApplication{
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

JmsConfiguration.java:

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.core.JmsTemplate;

import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Queue;

@Configuration
@EnableJms
public class JmsConfiguration {

@Autowired
private BeanFactory springContextBeanFactory;

@Bean
public Queue queue(){
    return new ActiveMQQueue("inmemory.queue");
}

@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) throws JMSException {
    return new JmsTemplate(connectionFactory);
}

}

Producer.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.web.bind.annotation.*;
import javax.jms.Queue;

@RestController
@RequestMapping("publish")
public class Producer {

    @Autowired
    private JmsTemplate jmsTemplate;

    @Autowired
    private Queue queue;

    @GetMapping("/{message}")
    public String publishString(@PathVariable("message") final String message){
        jmsTemplate.convertAndSend(queue, message);
        return "published succesfully";
    }
}

Consumer.java

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class Consumer {

    @JmsListener(destination = "inmemory.queue")
    public void listener(String message){
        System.out.println("Receiveage: -> " +message);
    }
}

application-default.yml

spring:    
  activemq:
    in-memory: true
    pool:
      enabled: false

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-camel</artifactId>
</dependency>

Затем настроен маршрут Apache Camel:

import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
@Component
public class FooRoute extends RouteBuilder {
    @Override
    public void configure() {
// sender
    from("foo-bar")
    .to("activemq:queue:inmemory.queue");
// receiver
    from("activemq:queue:inmemory.queue")
    .to("bar-foo");
    }
}

Журнал с сервера:

2018-12-30 15:12:04,549 INFO  [main] org.apache.activemq.broker.BrokerService : Using Persistence Adapter: MemoryPersistenceAdapter
2018-12-30 15:12:04,624 INFO  [JMX connector] org.apache.activemq.broker.jmx.ManagementContext : JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
2018-12-30 15:12:04,757 INFO  [main] org.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.14.5 (localhost, ID:hostname-12345-1234567890123-0:1) is starting
2018-12-30 15:12:04,770 INFO  [main] org.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.14.5 (localhost, ID:hostname-12345-1234567890123-0:1) started
2018-12-30 15:12:04,770 INFO  [main] org.apache.activemq.broker.BrokerService : For help or more information please see: http://activemq.apache.org
2018-12-30 15:12:04,995 INFO  [main] org.apache.activemq.broker.TransportConnector : Connector vm://localhost started
2018-12-30 16:01:49,872 WARN  [ActiveMQ Task-1] org.apache.activemq.transport.failover.FailoverTransport : Failed to connect to [tcp://localhost:61616] after: 10 attempt(s) continuing to retry.

1 Ответ

0 голосов
/ 11 января 2019

Недостающим элементом является конфигурация компонента Camel ActiveMQComponent, на который ссылаются конечные точки маршрута JMS как activemq:

Обратите внимание на аннотацию @Qualifier, чтобы убедиться, что имя компонента соответствует имени в вашем маршруте JMSконечные точки.

Вы вводите ConnectionFactory в компонент.Таким образом, компонент получает URL-адрес брокера и т. Д.

Пример для такой конфигурации с использованием транзакционных сообщений:

@Bean
@Qualifier("activemq")
ActiveMQComponent activeMQComponent(ConnectionFactory connectionFactory) {
    ActiveMQComponent activeMQComponent = new ActiveMQComponent();
    activeMQComponent.connectionFactory = connectionFactory;
    activeMQComponent.transacted = true;
    activeMQComponent.lazyCreateTransactionManager = false;
    activeMQComponent.cacheLevelName = 'CACHE_CONSUMER';
    activeMQComponent.concurrentConsumers = 5;
    return activeMQComponent;
}
...