简体   繁体   中英

Spring embedded ActiveMQ, how to configure queue

I define the ActiveMQConnectionFactory in the Spring context, and define it as a Camel Component as follows

@Bean
@Qualifier("jms1")
public JmsComponent jms1() {
    ConnectionFactory f = new ActiveMQConnectionFactory("vm://localhost:7777");
    return JmsComponent.jmsComponentAutoAcknowledge(f);
}

Spring will automatically start ActiveMQ JMS server on the local VM, listening on port 7777. But how do I configure a named queue on the server? I would like to @Autowire the queue anywhere I need it, like retrieving it from JNDI in the Java EE world.

here is an example below, you need to add tcp Connector to the broker by defining the broker bean.

By default AMQ supports jndi.

take a look at http://activemq.apache.org/jndi-support.html

import java.util.Properties;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.camel.component.jms.JmsComponent;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@SpringBootApplication
@Configuration
public class ActiveMQConfigurationWithJndi {
    public static final String DESTINATION_NAME = "TEST";

    public static void main(String[] args) {
        ConfigurableApplicationContext app = SpringApplication.run(ActiveMQConfigurationWithJndi.class, args);
        Connection conn = null;
        try {
            String factoryName = "ConnectionFactory";
            Properties props = new Properties();
            props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
            props.put(Context.PROVIDER_URL, "tcp://localhost:61616");
            props.put("queue." + DESTINATION_NAME, DESTINATION_NAME);
            InitialContext ic = new InitialContext(props);
            ConnectionFactory cf = (ConnectionFactory) ic.lookup(factoryName);
            ActiveMQQueue dest = (ActiveMQQueue) ic.lookup(DESTINATION_NAME);
            conn = cf.createConnection();
            conn.start();
            Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
            MessageProducer producer = session.createProducer(dest);
            TextMessage message = session.createTextMessage("textt");
            producer.send(message);
            System.out.println("ok");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                }
            }
        }
    }

    @Bean
    public BrokerService broker() throws Exception {
        final BrokerService broker = new BrokerService();
        broker.addConnector("tcp://localhost:61616");
        broker.addConnector("vm://localhost:7777");
        broker.setPersistent(false);
        broker.setDestinations(new ActiveMQDestination[] { queue() });
        return broker;
    }

    @Bean
    public ActiveMQDestination queue() {
        return new ActiveMQQueue(DESTINATION_NAME);
    }

    @Bean
    public ConnectionFactory jmsConnectionFactory() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        return connectionFactory;
    }

    @Bean
    @Qualifier("jms1")
    public JmsComponent jms1() {
        return JmsComponent.jmsComponentAutoAcknowledge(jmsConnectionFactory());
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM