Java简单使用Rabbitmq

1.导入pom

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
package com.chem.www.service.impl;

import com.chem.www.domain.Notice;
import com.chem.www.domain.NoticeMail;
import com.chem.www.domain.NoticeMailMessageConverter;
import com.chem.www.domain.NoticeRowFile;
import com.chem.www.service.NoticeService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.stereotype.Service;

import javax.annotation.PreDestroy;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Slf4j
@RequiredArgsConstructor
@Service("noticeService")
public class RabbitNoticeService implements NoticeService {
    private static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor();
    private static final String MAIL_EXCHANGE = "mce.mail";
    private static final String ROW_FILE_EXCHANGE = "mce.row-file";

    private final RabbitTemplate rabbitTemplate;
    private final MessageConverter messageConverter = new Jackson2JsonMessageConverter();
    private final NoticeMailMessageConverter mailMessageConverter = new NoticeMailMessageConverter();

    /**
     * 在开发中我们如果要在关闭spring容器后释放一些资源,通常的做法有如下几种:
     * 1.在方法上加上@PreDestroy注解
     * 2.实现DisposableBean接口,实现其destroy方法
     */
    @PreDestroy
    public void shutdown() {
        EXECUTOR.shutdown();
    }

    @Override
    public void send(Notice notice) {
        EXECUTOR.execute(() -> {
            try {
                /**
                 * 将Java对象转换为消息。
                 * 参数:
                 * object -要转换消息的对象Properties-消息属性。
                 * 退货:
                 * 消息抛出:
                 * MessageConversionException -在转换失败时
                 */
                rabbitTemplate.send(messageConverter.toMessage(notice, new MessageProperties()));
            } catch (Exception e) {
                log.error("RabbitNoticeService.send(Notice)", e);
            }
        });
    }

    @Override
    public void mail(NoticeMail noticeMail) {
        EXECUTOR.execute(() -> {
            try {
                /**
                 * RabbitMQ 消息传递模型的核心思想是:生产者生产的消息从来不会直接发送到队列。实际上,通常生产者都不知道这些消息发送到了哪些队列中。
                 * 相反,生产者只能将消息发送到交换机(exchange)。交换机的工作内容非常简单,一方面它接受来自生产者的消息,另一方面将这些消息推入队列。
                 * 交换机必须知道如何处理收到的消息。是应该把这些消息放入特定队列还是说放到许多队列,或者直接丢弃,这就由交换机的类型决定。
                 */
                //发送
                rabbitTemplate.send(MAIL_EXCHANGE, "", mailMessageConverter.toMessage(noticeMail, new MessageProperties()));

            } catch (Exception e) {
                log.error("RabbitNoticeService.mail", e);
            }
        });
    }

    @Override
    public void extractRowFile(NoticeRowFile noticeRowFile) {
        if (noticeRowFile == null) {
            return;
        }
        EXECUTOR.execute(() -> {
            try {
                rabbitTemplate.send(ROW_FILE_EXCHANGE, "", messageConverter.toMessage(noticeRowFile, new MessageProperties()));
            } catch (Exception e) {
                log.error("RabbitNoticeService.extractRowFile", e);
            }
        });
    }
}

package com.chem.www.domain;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.support.converter.AbstractMessageConverter;
import org.springframework.amqp.support.converter.MessageConversionException;

public class NoticeMailMessageConverter extends AbstractMessageConverter {
    @Override
    protected Message createMessage(Object object, MessageProperties messageProperties) {
        if (object instanceof NoticeMail) {
            var notice = (NoticeMail) object;
            var bs = notice.toBytes();
            return new Message(bs, messageProperties);
        }
        return null;
    }

    @Override
    public Object fromMessage(Message message) throws MessageConversionException {
        return null;
    }
}

使用:

 noticeService.send(Notice.error("MCE::save user order", e.getMessage()));


package com.chem.www.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Notice {
    private Channel channel;
    private String title;
    private String text;

    public Notice() {
    }

    public Notice(Channel channel, String title, String text) {
        this.channel = channel;
        this.title = title;
        this.text = text;
    }

    public static Notice info(String title, String text) {
        return new Notice(Channel.MCE_DEBUG, title, text);
    }

    public static Notice error(String title, String text) {
        return new Notice(Channel.MCE_ERROR, title, text);
    }

    public static Notice erpError(String title, String text) {
        return new Notice(Channel.ERP_ERROR, title, text);
    }

    public enum Channel {
        MCE_DEVELOP,
        MCE_DEBUG,
        MCE_ERROR,

        ERP_ERROR,
        ;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值