activeMQ的broker可以在java代码中内嵌一个微型的MQ代理,当我们服务器挂了实在开不起来MQ时,可以临时启用一个broker来应急!

但是我跟着搞了一遍,发现MQ刚连接上就马上关闭了!

网上搜了一下方法,发现也是有人跟我看了同样的视频,他居然生搬硬套。

这个教学视频,的上一个视频是教人集群时,如何使用其他的配置并启动。

然后他就傻乎乎的把这个加了这个上去了,然后我也傻乎乎的被他误导了!

而且他的那个命令都写错了,这里我就不多吐槽了!

回到主题,因为这个情况是刚启动就马上关闭,结束了,而视频中的教程是会一直挂着的!于是我就想起了那条神奇的命令。

System.in.read();

果然加了这个命令以后,就不会直接关闭MQ,而是启动后就挂着,然后就可以成功的发送消息和读取消息了。

Broker代码:

public class EmbedBroker {
    public static void main(String[] args) throws Exception {
        BrokerService brokerService = new BrokerService();
        brokerService.setUseJmx(true);
        brokerService.addConnector("tcp://localhost:61616");
        brokerService.start();
        System.in.read();
    }
}

生产者代码:

public class JmsProduce {
    //public static final String DEFAULT_BROKER_URL="tcp://192.168.133.131:61616";//MQ地址
    public static final String DEFAULT_BROKER_URL="tcp://localhost:61616";//本地应急地址
    public static final String QUEUE_NAME="queue1";//队列名称
    public static void main(String[] args) throws JMSException {
        //获取MQ连接工厂,记得填自定义的地址!因为没有修改账号和密码,否则需要三参数构造
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(DEFAULT_BROKER_URL);
        //通过工厂获取连接
        Connection connection = activeMQConnectionFactory.createConnection();
        //通过连接创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //通过会话创建队列
        Queue queue = session.createQueue(QUEUE_NAME);
        //通过会话创建队列型的生产者
        MessageProducer messageProducer = session.createProducer(queue);
        for (int i = 1; i <=3 ; i++) {
            //通过会话创建消息
            TextMessage textMessage = session.createTextMessage("msg-------" + i);
            //通过生产者发送消息
            messageProducer.send(textMessage);

        }
        //释放资源
        messageProducer.close();
        //session.commit();
        session.close();
        connection.close();
        System.out.println("发送信息完毕");

    }
}

消费者代码:

public class JmsConsumer {
    //public static final String DEFAULT_BROKER_URL="tcp://192.168.133.131:61616";//MQ地址
    public static final String DEFAULT_BROKER_URL="tcp://localhost:61616";//本地应急地址

    public static final String QUEUE_NAME="queue1";//队列名称
    public static void main(String[] args) throws JMSException, IOException {
        System.out.println("broker");
        //获取MQ连接工厂,记得填自定义的地址!因为没有修改账号和密码,否则需要三参数构造
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(DEFAULT_BROKER_URL);
        //通过工厂获取连接
        Connection connection = activeMQConnectionFactory.createConnection();
        //记得要启动连接啊!
        connection.start();
        //通过连接创建会话
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //通过会话创建队列
        Queue queue = session.createQueue(QUEUE_NAME);
        //通过会话创建指定队列的消费者
        MessageConsumer messageConsumer = session.createConsumer(queue);
        /*while (true){
            System.out.println("进来了?");
            TextMessage receive = (TextMessage) messageConsumer.receive();
            if (null!=receive){
                System.out.println("获取到消息-------"+receive.getText());
            }else {
                break;
            }
        }*/
        messageConsumer.setMessageListener((message)->{
            if (null!=message&&message instanceof TextMessage){
                try {
                    System.out.println("获取到消息broker-------"+((TextMessage) message).getText());

                } catch (JMSException e) {
                    e.printStackTrace();
                }

            }
        });
        // 使主线程不要结束,如果主线程结束了,那么消息监听的线程也会被迫结束,实际应用中程序会一直启动,就不需要这一句代码了
        System.in.read();
        messageConsumer.close();
        session.close();
        connection.close();
    }
}