RabbitMq发送和接收消息(自动创建队列、交换机和绑定)

news/2024/8/27 21:39:53

自动创建队列、交换机和绑定

一、pom.xml

<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit</artifactId>
    <version>2.0.5.RELEASE</version>
</dependency>

二、发送者(producer)

@Resource
private RabbitAdmin rabbitAdmin;
@Override
protected void ext() {
    // 创建交换机
    rabbitAdmin.declareExchange(new DirectExchange("exchangeName", true, false));
    // 创建队列
    rabbitAdmin.declareQueue(new Queue("queueName", true));
    // 绑定队列到交换机
    rabbitAdmin.declareBinding(new Binding("queueName",
            Binding.DestinationType.QUEUE, "exchangeName",
            "routingKey", new HashMap<>()));
}

发送消息封装

/**
 * 发送消息接口
 */
public interface IMessageQueueProducer<T extends Message> {
    void push(T var1);
}

/**
 * 发送消息实现
 * message必须设置Exchange和Routing,否则会使用默认的交换机和路由key
 */
@Component
public class RabbitMessageQueueProducer<T extends Message<?>> implements IMessageQueueProducer<T> {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public RabbitMessageQueueProducer() {
    }

    public void push(T message) {
        String exchange = "exchangeName";
        String routing = "routingKey";
        if (StrUtil.isNotBlank(message.getExchange())) {
            exchange = message.getExchange();
        }

        if (StrUtil.isNotBlank(message.getRouting())) {
            routing = message.getRouting();
        }

        this.logger.debug("send to exchange {}, routing {} of message {}.", new Object[]{exchange, routing, message});
        this.rabbitTemplate.convertAndSend(exchange, routing, message);
    }
}


/**
 * 发送消息实体接口
 */
@JsonDeserialize(
    as = DefaultMessage.class
)
public interface Message<D extends Serializable> extends Serializable {
    String getTenantId();

    void setCommunicationType(String var1);

    void setMessageType(String var1);

    void setCommandType(String var1);

    String getExchange();

    void setExchange(String var1);

    String getRouting();

    void setRouting(String var1);

    String getQueue();

    void setQueue(String var1);

    String getSenderId();

    String getSenderName();

    List<String> getReceivers();

    List<String> getReceiverNames();

    MessageTemplate getTemplate();

    D getData();

    void setData(D var1);

    Map<String, Object> getVariables();
}

/**
 * 发送消息实体实现
 */
@Data
public class DefaultMessage<D extends Serializable> implements Message<D> {
    private static final long serialVersionUID = 1L;
    private String tenantId;
    private String exchange;
    private String routing;
    private String queue;
    private String communicationType;
    private String commandType;
    private String messageType;
    private String messageTypeName;
    private String senderId;
    private String senderName;
    private List<String> receivers;
    private List<String> receiverNames;
    private MessageTemplate template;
    private D data;
    private Map<String, Object> variables;
 }

发送消息

@Autowired
private IMessageQueueProducer<DefaultMessage<?>> messageQueueProducer;
......
Message<String> message = new DefaultMessage<>();
message.setExchange("exchangeName");
message.setRouting("routingKey");
message.setData("test helllo");
messageQueueProducer.push(message);

三、消费者(consumer)

方式一:

@RabbitListener(bindings = {
        @QueueBinding(
                exchange = @Exchange(value = "exchangeName"),
                key = "routingKey",
                value = @Queue(value = "queueName")
        )
})
public void consume(Message message) {
    // do something
}

方式二:

@RabbitListener(queues = "queueName")
public void consume(Message message) {
    // do something
}

推荐第一种方式,防止发送方服务自动创建还未完成

建议:

1、这里的Message都是自定义的类,在发送消息时会自动转换成spring的Message
2、建议交换机、队列、路由Key使用常量(不会经常变),减少配置文件的配置项

对有帮助的小伙伴记得点个赞哟~


http://www.niftyadmin.cn/n/3654688.html

相关文章

OWC资料收集-OWC简介及其属性

Figure 3 Office Web Components (version 10)组件描述PivotTable使用户连接到支持 OLE DB Provider for OLAP Services 8.0 或更高版的 OLAP 数据源上 (也可连接到 Excel 电子数据表单 和 SQL Server 、 Access 关系数据库)。PivotTable 控件允许用户对数据进行透视、分组、筛…

右键文件关联

// 获取桌面文件夹 LPSHELLFOLDER lpDeskFolder NULL; ::SHGetDesktopFolder(&lpDeskFolder); if( lpDeskFolder NULL ) { ASSERT(FALSE); return; } int nPathLen m_strFolder.GetLength(); LPITEMIDLIST ParentPidl NULL; DWORD dwEaten 0; USES_CONVERSION; DWORD …

java中什么是装饰者模式? 装饰者模式的使用!!

其实无论是代理模式还是装饰模式。本质上我认为就是对原有对象增强的方式~ 一、对象增强的常用方式 很多时候我们可能对Java提供给我们的对象不满意&#xff0c;不能满足我们的功能。此时我们就想对Java原对象进行增强&#xff0c;能够实现我们想要的功能就好~ 一般来说&…

OWC资料收集-如何将 Office 图表组件绑定到数据透视表

如何将 Office 图表组件绑定到数据透视表 <script type"text/javascript">function loadTOCNode(){}</script> 注意&#xff1a;这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的…

在Win2K/XP/2K3中 模拟实现VISITA效果对话框

文章发表在http://www.codeproject.com/useritems/VisitaLookingDialog.asp

OWC资料收集-绑定到数据源 Office XP 图表组件

注意&#xff1a;这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度&#xff0c;也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责…

C++编译器检索VTABLE的具体方法不同

以前没太注意过这个问题&#xff0c;只知道C代码调用某个虚函数时要到虚函数表里去查找&#xff0c;然后执行特定的函数。这两天跟别人调程序时发现&#xff0c;VC和gcc对这个检索操作的实现方法是不一样的&#xff1a;早期的gcc&#xff08;2001年5月前&#xff1f;&#xff0…

23种设计模式 - 创建型模式 - 单例模式

单例模式有 3 个特点&#xff1a; 单例类只有一个实例对象&#xff1b;该单例对象必须由单例类自行创建&#xff1b;单例类对外提供一个访问该单例的全局访问点。 单例模式的优点和缺点 单例模式的优点&#xff1a;1.单例模式可以保证内存里只有一个实例&#xff0c;减少了内…