Java 无法通过Spring引导通过STOMP连接到ActiveMQ代理

Java 无法通过Spring引导通过STOMP连接到ActiveMQ代理,java,spring-boot,jms,activemq,stomp,Java,Spring Boot,Jms,Activemq,Stomp,我正在尝试使用Spring Boot连接到本地计算机上运行的ActiveMQ代理,如下所示: 在链接中,使用了内存中的代理,但我更喜欢使用代理服务器,在我的例子中,我使用的是ActiveMQ 我指定activemq代理通过类路径中的文件application.properties中的以下配置跳转 spring.activemq.broker-url=stomp://localhost:61611 spring.activemq.password=password spring.activemq.

我正在尝试使用Spring Boot连接到本地计算机上运行的ActiveMQ代理,如下所示:

在链接中,使用了内存中的代理,但我更喜欢使用代理服务器,在我的例子中,我使用的是ActiveMQ

我指定activemq代理通过类路径中的文件application.properties中的以下配置跳转

spring.activemq.broker-url=stomp://localhost:61611
spring.activemq.password=password
spring.activemq.user=admin
下面是my pom.xml中的依赖项

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>

<properties>
    <java.version>1.8</java.version>
</properties>

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

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-stomp -->
    <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-stomp</artifactId>
    </dependency>

</dependencies>
Application.java

@SpringBootApplication
@EnableJms
public class Application {

@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    // This provides all boot's default to this factory, including the message converter
    configurer.configure(factory, connectionFactory);
    // You could still override some of Boot's default if necessary.
    return factory;
}

@Bean // Serialize message content to json using TextMessage
public MessageConverter jacksonJmsMessageConverter() {
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
    converter.setTargetType(MessageType.TEXT);
    converter.setTypeIdPropertyName("_type");
    return converter;
}

public static void main(String[] args) {
    // Launch the application
    ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);

    JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);

    // Send a message with a POJO - the template reuse the message converter
    System.out.println("Sending an email message.");
    jmsTemplate.convertAndSend("mailbox", new Email("info@example.com", "Hello"));
}

}
对类的响应****

@Component
public class Receiver {

@JmsListener(destination = "mailbox", containerFactory = "myFactory")
public void receiveMessage(Email email) {
    System.out.println("Received <" + email + ">");
}

}
因此,我无法通过Spring Boot连接到本地机器上运行的ActiveMQ代理

我的要求是仅在Spring Boot中通过ActiveMQ代理在STOMP上构建JMS发送方和接收方。但我无法连接到在本地服务器上运行的ActiveMQ实例的STOMP URL

更新:2017年5月11日: 经过大量调试后,我发现在
org.apache.activemq.transport.TransportFactory
类的第120行有以下代码
transport transport=createTransport(location,wf)
正在调用
org.apache.activemq.transport.tcp.tcpttransportfactory
org.apache.activemq.transport.TransportFactory的实现,而不是
org.apache.activemq.transport.stomp.StompTransportFactory
,或者实际上,在activemq-stomp.jar中提供的任何StompTransportFactory实现存在于类路径中。我想知道是否有人能告诉我如何选择合适的TransportFactory实现

我被困在这个几乎3天。任何类型的帮助或建议都将不胜感激:)


干杯

您有什么理由希望在Java中使用STOMP来代替普通的ActiveMQ Java客户端和协议(如VM或TCP)? STOMP是为纯文本设计的。。。您的异常是因为您正在使用ActiveMQ客户机讲STOMP,而这是它无法做到的,要做到这一点,您需要一些其他库来支持spring STOMP,但这并不是您想要做的

如果需要STOMP,可以使用这个库并配置相应的bean

更新

正如我在这次测试中看到的 这个库很容易集成到任何java或spring客户机,因为它实现了JMS API。 您必须为ConnectionFactory定义一个bean:

添加到应用程序。属性

public class Email {

private String to;
private String body;

//getter setters for fields
//constructors 

@Override
public String toString() {
    return String.format("Email{to=%s, body=%s}", getTo(), getBody());
}

}
jms.broker.url=tcp://localhost:61611
并更新您的配置:

@Value("${jms.broker.url}")
public String host;

@Bean
public ConnectionFactory connectionFactory() throws Exception {
   StompJmsConnectionFactory result = new StompJmsConnectionFactory();
   result.setBrokerURI(host);
   return result;
}

我有一个通过ActiveMQ代理通过STOMP进行通信的现有python服务器。所以STOMP是我在Spring BOOT中进行通信的唯一协议。您提到的fusesource stomp jms库,它可以与Spring boot一起使用吗?我已经更新了我的答案,您只需要添加建议的bean和相应的依赖项。可以在myFactory定义上覆盖ConnectionFactory属性。如果您在创建bean期间设置代理URL,则不会依赖于代理URL或类路径中application.properties中提到的任何其他代理属性。是否可以通过从属性文件加载的值设置这些属性?另外,您提到的url使用TCP协议,这是否也包括STOMP协议?我已经更新了属性的答案,StompJmsConnectionFactory使用TCP上的STOMP,请注意,url指向AMQQ的STOMP端口。您可以删除所有ActiveMQ依赖项,因为您使用的是STOMP JMS客户端
jms.broker.url=tcp://localhost:61611
@Value("${jms.broker.url}")
public String host;

@Bean
public ConnectionFactory connectionFactory() throws Exception {
   StompJmsConnectionFactory result = new StompJmsConnectionFactory();
   result.setBrokerURI(host);
   return result;
}