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();
}
}