Java 无法通过Spring引导通过STOMP连接到ActiveMQ代理
我正在尝试使用Spring Boot连接到本地计算机上运行的ActiveMQ代理,如下所示: 在链接中,使用了内存中的代理,但我更喜欢使用代理服务器,在我的例子中,我使用的是ActiveMQ 我指定activemq代理通过类路径中的文件application.properties中的以下配置跳转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.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;
}