RabbitMq在spring boot中集成和应用

来源:互联网 发布:2017淘宝买家信息出售 编辑:程序博客网 时间:2024/04/30 11:31

具体如果安装rabbitmq在本例子中不涉及,主要讲解在springboot中如果发送和接收rabbitmq消息。

1.添加依赖

    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-amqp</artifactId>    </dependency>

2.spring-rabbitmq 配置
本示例中使用了maven的filter
开发环境:
#rabbitMq配置
spring.rabbitmq.addresses=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=/
spring.rabbitmq.exchange=site
spring.rabbitmq.createTopic=dev.gov.site.createormodify
spring.rabbitmq.changeTopic=dev.gov.site.statuschange

在application.properties文件中:
#rabbitMq配置
spring.rabbitmq.addresses=@spring.rabbitmq.addresses@
spring.rabbitmq.port=@spring.rabbitmq.port@
spring.rabbitmq.username=@spring.rabbitmq.username@
spring.rabbitmq.password=@spring.rabbitmq.password@
spring.rabbitmq.virtual-host=@spring.rabbitmq.virtual-host@
spring.rabbitmq.exchange=@spring.rabbitmq.exchange@
spring.rabbitmq.createTopic=@spring.rabbitmq.createTopic@
spring.rabbitmq.changeTopic=@spring.rabbitmq.changeTopic@

3.使用java配置rabbitmq具体细节

@Configuration@ComponentScan("com.trs.comms.amqp")@ConfigurationProperties(prefix = "spring.rabbitmq")public class CommsAmqpAutoConfiguration {    private String exchange;    private String createTopic;    private String changeTopic;    //构造ConnectionFactory     @Bean    @ConfigurationProperties(prefix = "spring.rabbitmq")    public ConnectionFactory connectionFactory() {        CachingConnectionFactory factory = new CachingConnectionFactory();        factory.setPublisherConfirms(Boolean.TRUE);        return factory;    }    @Bean    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)    public RabbitTemplate rabbitTemplate() {        return new RabbitTemplate(connectionFactory());    }    //指定从哪个exchange接收数据    @Bean    public TopicExchange topicExchange() {        return new TopicExchange(exchange);    }    // 持久化队列    @Bean    public Queue queue() {        return new Queue("site", true);    }    //绑定队列,并接收指定topic的数据    @Bean    public Binding bindingCreate() {        return BindingBuilder.bind(queue()).to(topicExchange()).with(createTopic);    }    @Bean    public Binding bindingChange() {        return BindingBuilder.bind(queue()).to(topicExchange()).with(changeTopic);    }    //设置监听    @Bean    public SimpleMessageListenerContainer messageContainer(ConnectionFactory connectionFactory, AmqpConsumer amqpConsumer) {        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);        container.setQueues(queue());        container.setExposeListenerChannel(true);        container.setMaxConcurrentConsumers(1);        container.setConcurrentConsumers(1);        container.setAcknowledgeMode(AcknowledgeMode.MANUAL);        //设置监听器,执行具体的业务        container.setMessageListener(amqpConsumer);        return container;    }    public void setExchange(String exchange) {        this.exchange = exchange;    }    public void setCreateTopic(String createTopic) {        this.createTopic = createTopic;    }    public void setChangeTopic(String changeTopic) {        this.changeTopic = changeTopic;    }}

4.具体监听器:

/** * Description: 消息监听 */@Componentpublic class AmqpConsumer implements ChannelAwareMessageListener{    private static final Log logger = LogFactory            .getLog(AmqpConsumer.class);    private final AmqpSiteService amqpSiteServiceImpl;    @Autowired    public AmqpConsumer(AmqpSiteService amqpSiteServiceImpl) {        this.amqpSiteServiceImpl = amqpSiteServiceImpl;    }    @Override    public void onMessage(Message message, Channel channel) throws Exception {        try {            //具体业务            amqpSiteServiceImpl.doWithSite(new String(message.getBody(), "UTF-8"));//手动应答,告诉rabbitmq我业务执行完成,消息可以丢弃了           channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);            logger.info("站点同步成功!");        } catch (Exception e) {            throw new RuntimeException("站点同失败!!" + e);        }    }}

5.测试用例

@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = CommsISearchConfiguration.class)public class AmqpTest {    @Autowired    public RabbitTemplate rabbitTemplate;    @Test    public void testSend() {        String siteData = "{" +                "\"TYPE\": 11," +                "\"DATA\":{" +                "\"HASCHILDREN\":\"true\"," +                "\"OPERTIME\":\"\"," +                "\"CRTIME\":\"2017-06-14 19:22:05\"," +                "\"MEDIATYPE\":\"1\"," +                "\"TRUENAME\":\"刘珍华\"," +                "\"ISSUBSCRIBE\":\"1\"," +                "\"STATUS\":\"0\"," +                "\"DATAPATH\":\"chengdushi1\"," +                "\"MPID\":\"89011234567890\"," +                "\"SCHEDULE\":\"0\"," +                "\"CHNLOUTLINETEMP\":\"641\"," +                "\"ISDISTRIBUTABLE\":\"1\"," +                "\"SITENAME\":\"成都市\"," +                "\"OUTLINETEMPLATE\":\"250\"," +                "\"ATTRIBUTE\":\"PUBLISHLIMIT=&PUBSTARTDATE=\"," +                "\"CHNLDATAPATH\":\"chengdushi2\"," +                "\"PUBLISHPRO\":\"1\"," +                "\"SITEORDER\":\"188\"," +                "\"CLASSIFICATIONID\":\"95\"," +                "\"SITEID\":\"176\"," +                "\"LASTMODIFYTIME\":\"2017-08-31 16:00:35\"," +                "\"SITETYPE\":\"4\"," +                "\"VIEWINFOID\":\"111\"," +                "\"DETAILTEMPLATE\":\"446\"," +                "\"SITEDESC\":\"成都市\"," +                "\"ISMOBILE\":\"0\"," +                "\"PARENTID\":\"0\"," +                "\"ISPUSHABLE\":\"1\"," +                "\"CRUSER\":\"dev\"" +                "}" +                "}";        rabbitTemplate.convertAndSend("site", "dev.gov.site.createormodify", siteData);    }}