2016-08-03 3 views
3

스프링 부트 (버전 1.4.X)로 임베디드 ActiveMQ를 설정하고 실행하는 간단한 예제를 따라했습니다. 내가 떠날만큼스프링 부트로 임베디드 ActiveMQ 브로커 URL을 구성하는 방법

apply plugin: 'java' 
apply plugin: 'maven' 

group = 'jms.activemq' 
version = '0.0.1-SNAPSHOT' 

description = """jms.activemq""" 

sourceCompatibility = 1.5 
targetCompatibility = 1.5 

repositories { 
    maven { url "http://repo.maven.apache.org/maven2" } 
} 
dependencies { 
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-activemq', version:'1.4.0.RELEASE' 
    testCompile(group: 'org.springframework.boot', name: 'spring-boot-starter-test', version:'1.4.0.RELEASE') { 
exclude(module: 'commons-logging') 
} 
} 

모두 잘 지금까지 작동합니다 (:

@SpringBootApplication 
@EnableJms 
public class Application { 

@Autowired 
ConfigurableApplicationContext context; 

@Bean 
JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory) { 
    SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory); 

    return factory; 
} 

@JmsListener(destination = "mailbox-destination", containerFactory = "myJmsContainerFactory") 
public void receiveMessage(String message) { 
    System.out.println("Message received: " + message); 
    context.close(); 
} 

public static void main(String[] args) throws Exception { 
    FileSystemUtils.deleteRecursively(new File("active-data")); 
    ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); 

    JmsTemplate template = context.getBean(JmsTemplate.class); 
    MessageCreator messageCreator = new MessageCreator() { 
     public Message createMessage(Session session) throws JMSException { 
      return session.createTextMessage("Test"); 
     } 
    }; 
    template.send("mailbox-destination", messageCreator); 
} 
} 

그리고 아래와 같이 build.gradle : 여기 https://spring.io/guides/gs/messaging-jms/

내 클래스는 다음과 같이 구성되어 예 링크입니다 application.properties empty). 그러나 application.properties 파일에 다음을 추가하여 브로커 URL을 구성하려고하면 (원격 클라이언트가 연결할 수 있음)

spring.activemq.broker-url=tcp://localhost:61616 
spring.activemq.user=admin 
spring.activemq.password=admin 
난 아직도 문제의 원인을 확인할 수없는 몇 가지 링크를 쳐다 보면서 한

2016-08-03 12:46:00.938 WARN 88180 --- [   main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'org.springframework.jms.config.internalJmsListenerEndpointRegistry'; nested exception is org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect 
2016-08-03 12:46:00.939 INFO 88180 --- [   main] o.s.j.e.a.AnnotationMBeanExporter  : Unregistering JMX-exposed beans on shutdown 
2016-08-03 12:46:00.945 INFO 88180 --- [   main] utoConfigurationReportLoggingInitializer : 
org.springframework.context.ApplicationContextException: Failed to start bean 'org.springframework.jms.config.internalJmsListenerEndpointRegistry'; nested exception is org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect 
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:176) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:51) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:346) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:149) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:112) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:874) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
at jms.activemq.Application.main(Application.java:37) [main/:na] 
Caused by: org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect 
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:169) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.jms.listener.AbstractJmsListeningContainer.start(AbstractJmsListeningContainer.java:273) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.jms.config.JmsListenerEndpointRegistry.startIfNecessary(JmsListenerEndpointRegistry.java:243) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.jms.config.JmsListenerEndpointRegistry.start(JmsListenerEndpointRegistry.java:206) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:173) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
... 12 common frames omitted 
Caused by: javax.jms.JMSException: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect 
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:373) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:303) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:243) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.springframework.jms.support.JmsAccessor.createConnection(JmsAccessor.java:180) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.jms.listener.AbstractJmsListeningContainer.createSharedConnection(AbstractJmsListeningContainer.java:413) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.jms.listener.AbstractJmsListeningContainer.establishSharedConnection(AbstractJmsListeningContainer.java:381) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.jms.listener.AbstractJmsListeningContainer.doStart(AbstractJmsListeningContainer.java:285) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.jms.listener.SimpleMessageListenerContainer.doStart(SimpleMessageListenerContainer.java:210) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
at org.springframework.jms.listener.AbstractJmsListeningContainer.start(AbstractJmsListeningContainer.java:270) ~[spring-jms-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
... 15 common frames omitted 
Caused by: java.net.ConnectException: Connection refused: connect 
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_92] 
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_92] 
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_92] 
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_92] 
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_92] 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_92] 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_92] 
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_92] 
at org.apache.activemq.transport.tcp.TcpTransport.connect(TcpTransport.java:525) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.transport.tcp.TcpTransport.doStart(TcpTransport.java:488) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:55) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.transport.AbstractInactivityMonitor.start(AbstractInactivityMonitor.java:168) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.transport.InactivityMonitor.start(InactivityMonitor.java:52) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.transport.WireFormatNegotiator.start(WireFormatNegotiator.java:72) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:58) ~[activemq-client-5.13.4.jar:5.13.4] 
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:353) ~[activemq-client-5.13.4.jar:5.13.4] 
... 23 common frames omitted 

:

나는 예외를 얻을. 도울 수있는 약간 통찰력 또는 물질을 진짜로 평가할 것입니다.

나의 초기 생각은 Spring Boot가이 값을 읽고 ActiveMQ 브로커를 구성하는 데 사용하지만 대신이 값을 사용하여 브로커 (다른 설정으로 이미 구성된 브로커)에 연결하는 것처럼 보입니다. 어떻게 그렇게 외부 클라이언트 (브로커와 동일한 JVM과에서 실행되지 않음) 브로커의 구성을 변경할 수 있습니다, TCP를 사용하여 브로커에 액세스 할 수 있습니다 : // localhost를 : 61,616

UPDATE :

내가 하나를 따랐다 브로커를 삽입하는 방법은 here이며 브로커를 필수 URL과 함께 포함 할 수 있으며 브로커에 연결할 수 있습니다. 그러나, 스프링 부트가 여전히 앞으로 나아가고 이전처럼했던 것처럼 보이기 때문에 나는 2 명의 브로커를 갖게 될 것 같습니다.

기본적으로 SpringApplication.run (Application.class, args)을 호출하기 전에이 코드를 추가하고 main 메소드의 시작 부분에 추가합니다.

BrokerService broker = new BrokerService(); 
broker.addConnector("tcp://localhost:61617"); 
broker.setPersistent(false); 
broker.start(); 

두 개의 브로커 인스턴스 (내가 믿는) 실행을 가진, 오른쪽에있는 모든 생각하지 않습니다.

1)이 어떻게 봄 부팅 다른 하나를 시작 중지 할 수 있습니다, 브로커

2) 그렇다면 포함하는 적절한 방법이 있나요? (spring-boot-startter-activemq 의존성을 제거하지 않고).

미리 감사드립니다.

+1

ActiveMQ 브로커가 실행 중이 아니거나 구성된 포트와 다른 포트에서 수신 대기중인 것처럼 보입니다. 게시물을 편집하고'netstat -nat | grep LISTEN'의 출력을 추가하십시오. (윈도우'netstat -nat | findstr LISTEN') –

+0

예, 확인했는데 그런 포트가 없습니다. 전에 포트 모니터링). 내 질문에 더 많은 것 같아, 어떻게 봄 부팅이 브로커를 구성 할 수 있도록이 포트를 수신 대기? 나는 application.properties의 정보를 봄에 추가한다고 생각했다. "이것은 내 브로커를 구성하고자하는 URL/포트입니다."대신 "브로커를 찾을 수있는 곳"이라고 알려줍니다. 질문을 좀 더 명확하게 편집했습니다. –

+0

[여기] (전체 https://stackoverflow.com/a/44600306/2979435) 전체 샘플 – deFreitas

답변

7

나는 언젠가 이것으로 놀고 난 후에 이것을 생각했다.

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false"); 

을하지만, 분명히 봄 부팅 아무튼 한 인물 : 나는 기본 내장 된 브로커에 대한 연결을 만들려고했기 때문에 두 인스턴스 (이 생성 된 경우 파악하기위한 시도/존재) 아래와 같이 실행 알았는데 그 당시에는 존재하지 않는다.

그래서 단지 내 생성 된 인스턴스가 실행 한하기 위해, 내가 할하는 데 필요한 모든 아래로 application.properties 파일 (이 경우 tcp://localhost:61616에) 내가 인스턴스를 만들 때 I 커넥터에 추가 URL을 제공했다

spring.activemq.broker-url=tcp://localhost:61616 

및 스프링 부트가이 인스턴스에 연결하고 다른 인스턴스를 만들지 않습니다. 속성 파일에 위의 항목이 없거나 (위에서 설명한 것처럼 vm : // localhost? ...를 사용하여 포함 된 인스턴스에 연결하려는 경우) Spring Boot가 진행되어 사용자를 대신하여 인스턴스를 생성합니다 .

나는 또한 documentation이 읽었다 : 그것은 ActiveMQ를 클래스 패스로 볼 수 있습니다 을 감지 할 때

봄 부팅도 ConnectionFactory를 구성 할 수 있습니다. 브로커가있는 경우 브로커가 시작되고 구성됩니다 (구성을 통해 브로커 URL이 지정되지 않은 경우).

제 의견으로는 철자가 잘 맞지 않습니다 (하지만 올바른 방향으로 생각하고 있습니다).

다른 결과가 있거나 내 결론이 옳지 않다면 알려주십시오. 감사!!!

+0

다른 스프링 부팅 응용 프로그램이 설정 한 브로커에 연결하는 데 필요한 구성을 추가 할 수 있습니까? 나는 그것을 성공적으로 만들고 메시지를 생성 한 응용 프로그램에서 보내는 메시지를 받고 있습니다. – MaxG

+2

@MaxG는 새로운'application- {profile} .yml' 설정 파일을 만들고'spring.activemq.broker-url : vm : // localhost? broker.persistent = false' 파일을 넣습니다. – kpentchev

관련 문제