先来个localhost:8161web操作页面小翻译
原版
翻译
我们可以通过http://localhost:8161访问管理页面,通过tcp://localhost:61616来连接消息服务器,用到的用户名和密码都在以下文件中(默认为admin=admin)
本人用的是SpringBoot框架,下面是application.yml的配置信息
server:
port: 39527
spring:
jms:
pub-sub-domain: false #配置消息的类型, 如果是true表示为topic消息,如果为false则是queue队列消息
activemq:
user: admin
password: admin
broker-url: tcp://localhost:61616 #消息组件的连接主机信息
消息队列需要一个生产者/制造者/Producer,和一个消费者/接收者/Consumer,而且他有两种模式一个是queue点对点消息模式
另一个是Topic订阅者模式。
下面是queue消息模式基本代码小示例
Producer
@Service
public class MessageProduceImpl{
@Autowired
private JmsMessagingTemplate jmsmessagingtemplate;
public void sendMessage(String msg) {
// TODO Auto-generated method stub
//这个是给两方设定一个点,生产点和接收点的标记 例:eclipse
ActiveMQQueue activeMQQueue = new ActiveMQQueue("eclipse");
this.jmsmessagingtemplate.convertAndSend(activeMQQueue,msg);
}
}
JmsMessagingTemplate是一个自带的消息模型,springboot很简单,然后把两个参数交给JmsMessagingTemplate就好了
假如设定一些参数运行那么web界面会是这样
会显示有一个名字为eclipse的点,刚才我自己测试放了两百条数据,但是没有设定接收点,所以他Number Of Pending Messages 会显示有200条数据没有处理
下面是消费者
Comsumer
@Service
public class MessageConsumerService {
@JmsListener(destination = "eclipse")
public void receiveMessage(String text){
System.out.println("------------接收消息------------"+text);
}
}
也很简单,只要在方法上加一个注解@JmsListener(destination = "eclipse")就ok
假如只运行消费者,接收点是"eclipse" 那么只要一运行他就会接收到之前在点eclipse存储的200条数据
下面是一个发消息的小测试类
package com.cn.sola;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.cn.sola.producer.MessageProduceImpl;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ActiveMqApplicationTests {
@Autowired
private MessageProduceImpl messagerproducerservice;
@Test
public void contextLoads() {
for (int i = 0; i < 200; i++) {
messagerproducerservice.sendMessage(i+"");
}
}
}
queue基本小示例结束
基本订阅者模式小示例
订阅者模式相当于创建一个点,然后很多人来这里取东西,每个人有自己的标识
application.yml还是哪个yml不变
首先多一个配置类
package com.cn.sola.config;
import javax.jms.ConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
@Configuration
public class config {
@Bean
JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory){
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(true);
return factory;
}
}
Topic发布消息类
Publisher
package com.cn.sola.topic.publisher;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;
@Service
public class Publisher {
@Autowired
private JmsMessagingTemplate jmssagingtemplate;
public void publish(String destinationName,String message){
ActiveMQTopic activeMQTopic = new ActiveMQTopic(destinationName);
System.out.println("================>>>发布topic订阅消息"+message);
this.jmssagingtemplate.convertAndSend(activeMQTopic,message);
}
}
类对象变成了new ActiveMQTopic 别的没有什么变化
Topic接收消息类
本人闲的 多建立了几个
Subscriber
package com.cn.sola.topic.subscriber;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
@Service
public class Subscriber {
@JmsListener(destination = "topic.9981",containerFactory = "myJmsContainerFactory")
public void subscribeone(String text){
System.out.println("===============<<subscribeone收到订阅者消息"+text);
}
@JmsListener(destination = "topic.9981",containerFactory = "myJmsContainerFactory")
public void subscribethree(String text){
System.out.println("===============<<SubscriberCopyThree收到订阅者消息"+text);
}
}
package com.cn.sola.topic.subscriber;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
@Service
public class SubscriberCopy {
@JmsListener(destination = "topic.9981",containerFactory = "myJmsContainerFactory")
public void subscribetwo(String text){
System.out.println("===============<<subscribetwo收到订阅者消息"+text);
}
}
package com.cn.sola.topic.subscriber;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;
@Service
public class SubscriberCopytwo {
@JmsListener(destination = "topic.9981",containerFactory = "myJmsContainerFactory")
public void subscribethree(String text){
System.out.println("===============<<subscribethree收到订阅者消息"+text);
}
}
测试类
package com.cn.sola;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.cn.sola.producer.MessageProduceImpl;
import com.cn.sola.topic.publisher.Publisher;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ActiveMqApplicationTests {
@Autowired
private MessageProduceImpl messagerproducerservice;
@Autowired
private Publisher publisher;
@Test
public void contextLoads() {
publisher.publish("topic.9981", "topic.9981小测试一");
publisher.publish("topic.9981", "topic.9981小测试二");
publisher.publish("topic.9981", "topic.9981小测试三");
}
}
对应的消费者全都可以接收到测试信息。