Konfigurieren von embedded ActiveMQ-Broker-URL mit Spring Boot
Folgte ich ein einfaches Beispiel zur Errichtung und zum Betrieb von embedded ActiveMQ mit Spring Boot (version 1.4.X). Hier der link zu dem Beispiel https://spring.io/guides/gs/messaging-jms/
Meiner Klasse ist strukturiert wie folgt:
@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);
}
}
Und zu bauen.gradle wie unten:
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')
}
}
Alles funktioniert so weit gut (solange ich die Anwendung verlassen.Eigenschaften leer ist), aber wenn ich versuche zu konfigurieren broker-url (also remote-clients eine Verbindung herstellen können), indem Sie folgende Anwendung.Eigenschaften Datei:
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
Bekomme ich eine exception:
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
Ich habe mir ein paar links und noch nicht in der Lage, um zu bestimmen, was das Problem verursacht. Würde wirklich zu schätzen einige Einsicht, oder material, das helfen kann.
Mein Erster Gedanke war, dass Spring Boot wird Lesen Sie sich diese Werte und verwenden Sie zum konfigurieren der ActiveMQ-broker, sondern wie es aussieht, nutzt diese Werte, um die Verbindung zum broker (der broker bereits konfiguriert mit unterschiedlichen Einstellungen). Wie kann ich ändern Sie die broker-Konfiguration, so dass externe clients (nicht ausgeführt mit derselben JVM wie der Makler), können auf den broker über tcp://localhost:61616
UPDATE:
Folge ich einer der Wege, um das einbetten eines broker aufgeführt hier und eingebettet werden konnten, die einen Makler mit der gewünschten url und in der Lage, sich zu verbinden. Allerdings scheint es, dass ich am Ende mit zwei Maklern, da es scheint, Spring Boot geht immer noch vor und erstellen Sie ein wie vorher.
Grundsätzlich bin nur das hinzufügen dieses Stück code am Anfang der main-Methode vor dem Aufruf SpringApplication.run(Application.class, args);
BrokerService broker = new BrokerService();
broker.addConnector("tcp://localhost:61617");
broker.setPersistent(false);
broker.start();
Fühlt sich nicht richtig an alle, nachdem zwei broker-Instanzen(glaube ich) läuft.
1) Ist das der richtige Weg, um die Einbettung eines broker
2) Wenn ja, wie kann ich verhindern, Spring Boot aus mit dem nächsten anfange? (Ohne entfernen spring-boot-starter-activemq-Abhängigkeiten).
Vielen Dank im Voraus.
netstat -nat|grep LISTEN
(auf Windows netstat -nat|findstr LISTEN
)Ja, ich habe geprüft und es gibt keine solche Schnittstelle (verwendet Hatte resmon sowie überwachen der ports vor). Ich denke, meine Frage ist eher, wie bekomme ich Spring boot konfigurieren der Makler, so dass er lauscht auf diesem port? Ich dachte, hinzufügen, dass die Informationen in der Anwendung.Eigenschaften Sag ' s spring "dies ist die url/port, wo ich konfigurieren wollen mein broker", sondern scheint nur sagt er "hier, wo zu finden die broker". Ich habe bearbeitet die Frage ein wenig klarer.
hier eine vollständige Probe
InformationsquelleAutor Aliyu Fonyuy | 2016-08-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, ich dachte mir, diese nach dem spielen, um mit dieser für irgendwann. Ich dachte, zwei Instanzen ausgeführt wurden, weil ich versuchte, eine Verbindung zu schaffen, um die STANDARD-embedded-broker (in einem Versuch, um herauszufinden, ob es erstellt wurde/vorhanden ist) wie folgt:
Aber anscheinend Spring-Boot-zahlen existiert nicht und schafft es in dieser Zeit.
So, um nur meine erstellte Instanz läuft, alle die ich tun musste, war geben Sie eine URL, die ich Hinzugefügt, um den Stecker, wenn ich die Instanz erstellt (in diesem Fall
tcp://localhost:61616
) in derapplication.properties
- Datei, wie untenund Spring Boot wird eine Verbindung zu dieser Instanz und kein anderes erstellen. In Abwesenheit von den oben genannten Eintrag in der properties-Datei (oder wenn Sie den Versuch machen, die Verbindung zu einem embedded-Instanz mithilfe von vm://localhost?... wie ich oben), Spring Boot wird weiter gehen, und instanziiert für Sie.
Habe ich auch noch gelesen das in den Dokumentation:
Aber meiner Meinung nach ist es nicht gut geschrieben (aber es bekam mir denken in die richtige Richtung, obwohl).
Bitte lassen Sie uns wissen, wenn Sie hatten andere Erkenntnisse oder wenn meine Schlussfolgerung ist nicht richtig. Danke!!!
erstellen Sie eine neue
application-{profile}.yml
Konfigurationsdatei und setzen Sie inspring.activemq.broker-url: vm://localhost?broker.persistent=false
"solange keine broker URL, die angegeben ist durch die Konfiguration", dh NICHT über eine Feder.activemq.broker-url in der Konfiguration. Dann Spring Boot macht seine Magie.
InformationsquelleAutor Aliyu Fonyuy