如何为python接收器编写spring boot rabbitmq发送器?

时间:2018-03-27 12:54:39

标签: java spring-boot rabbitmq spring-amqp

我想写一个应用程序,其中我需要一个生产者使用spring boot rabbitmq发送消息,接收器是用python编写的。接收器部分很简单 -

receive.py

#!/usr/bin/env python
import pika
import sys

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.exchange_declare(exchange='topic_logs',
                     exchange_type='topic')

result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue

binding_keys = sys.argv[1:]
if not binding_keys:
    sys.stderr.write("Usage: %s [binding_key]...\n" % sys.argv[0])
    sys.exit(1)

for binding_key in binding_keys:
    channel.queue_bind(exchange='topic_logs',
                   queue=queue_name,
                   routing_key=binding_key)

print(' [*] Waiting for logs. To exit press CTRL+C')

def callback(ch, method, properties, body):
    print(" [x] %r:%r" % (method.routing_key, body))

channel.basic_consume(callback,
                  queue=queue_name,
                  no_ack=True)

channel.start_consuming()

如何为此编写一个spring boot rabbitmq发送者代码?那里有什么必要的东西要宣布?请帮忙。

2 个答案:

答案 0 :(得分:1)

Spring Boot首先是Java应用程序。

所以,你需要熟悉那种语言。

选择是正确的:你真的可以从Java发送到RabbitMQ并从任何其他客户端的队列中接收。

Spring Boot为您提供了RabbitTemplate bean。因此,如果故事即将发送,您只需要注入这样的bean并使用其API发送:

@Autowired
RabbitTemplate rabbitTemplate;
...
this.rabbitTemplate.convertAndSend("topic_logs", binding_key, data);

有关详细信息,请参阅Reference Manual

答案 1 :(得分:0)

使用spring集成,首先需要创建一个配置类:

@Configuration
public class RabbitConfig {

    @Autowired
    private ConnectionFactory connectionFactory;

    @Bean
    DirectExchange dropfileExchange() {
        return new DirectExchange("exchange_name", true, false);
    }

    @Bean
    public Queue dropfileQueue() {
        return new Queue("queue_name", true);
    }

    @Bean
    Binding dropfileExchangeBinding(DirectExchange dropfileExchange, Queue dropfileQueue) {
        return BindingBuilder.bind(dropfileQueue).to(dropfileExchange).with("key_name");
    }

    @Bean
    public RabbitTemplate dropfileExchangeTemplate() {
        RabbitTemplate rt = new RabbitTemplate(connectionFactory);
        rt.setExchange("exchange_name");
        rt.setRoutingKey("key_name");
        rt.setConnectionFactory(connectionFactory);
        return rt;
    }

    @Bean
    public RabbitMessagingTemplate rabbitMessagingTemplate() {
        return new RabbitMessagingTemplate(dropfileExchangeTemplate());
    }
}

然后创建一个网关服务:

@MessagingGateway
public interface DropfileMessageGateway {
        @Gateway(requestChannel = "channel_name")
        void generate(String payload);
}

然后使用Java DSL指定生产者流程,如下所示:

@Bean
    public IntegrationFlow toOutboundQueueFlow() {
        return IntegrationFlows.from("channel_name")
                .transform(Transformers.toJson())
                .handle(Amqp.outboundAdapter(rabbitConfig.dropfileExchangeTemplate())).get();

    }

这将从通道读取消息,将其转换为JSON,然后使用出站适配器将其分配给兔子交换。

请注意,消息通过消息传递网关进入通道,因此两者中的通道名称应相同。

不要忘记包含适当的依赖项。