rabbitmq与spring 结合

来源:互联网 发布:怎么看是淘宝客 编辑:程序博客网 时间:2024/05/16 13:57

maven 配置

     <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
             <version>4.3.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
             <version>4.3.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
             <version>4.3.9.RELEASE</version>
        </dependency>
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.amqp/spring-rabbit -->
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.7.3.RELEASE</version>
</dependency>


非spring集成方式

消息创建者

public class Producer {
private static final String TASK_QUEUE_NAME = "fenfatest.task_queue";


public static void main(String[] args)
throws IOException, TimeoutException, java.util.concurrent.TimeoutException, InterruptedException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.231.209");
factory.setPort(5672);
factory.setUsername("test");
factory.setPassword("test");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
// 分发信息
for (int i = 0; i < 10; i++) {
String message = "Hello RabbitMQ" + i;
channel.basicPublish("", TASK_QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
System.out.println("NewTask send '" + message + "'");
}
channel.close();
connection.close();
}
}

消息消费者

public class Work2 {


private static final String TASK_QUEUE_NAME = "fenfatest.task_queue";


public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.231.209");
factory.setPort(5672);
factory.setUsername("test");
factory.setPassword("test");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();


channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
System.out.println("Worker2  Waiting for messages");


// 每次从队列获取的数量
channel.basicQos(1);
final Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println("Worker2  Received '" + message + "'");
}
};
boolean autoAck = true;
// 消息消费完成确认
channel.basicConsume(TASK_QUEUE_NAME, autoAck, consumer);

}
}



/***************************************************************************************************************************/

与spring集成

消息生产者

application-mq.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 
    http://www.springframework.org/schema/rabbit
    http://www.springframework.org/schema/rabbit/spring-rabbit-1.7.xsd">


<description>rabbitmq 连接服务配置</description>
<!-- 连接配置 -->

    <!-- 连接配置 -->
    <rabbit:connection-factory id="connectionFactory" host="192.168.231.209" username="test"
        password="test" port="5672"  />
        
    <rabbit:admin connection-factory="connectionFactory"/>
    
    <!-- 消息队列客户端 -->
    <rabbit:template id="amqpTemplate" exchange="mq_exchange" connection-factory="connectionFactory"  />
    
    <!-- queue 队列声明 -->
    <!-- 
        durable 是否持久化 
        exclusive 仅创建者可以使用的私有队列,断开后自动删除 
        auto-delete 当所有消费端连接断开后,是否自动删除队列 -->
    <rabbit:queue id="mq_queue" name="Seckill_Queue" durable="true" auto-delete="false" exclusive="false" />
    
    <!-- 交换机定义 -->
    <!-- 
        交换机:一个交换机可以绑定多个队列,一个队列也可以绑定到多个交换机上。
        如果没有队列绑定到交换机上,则发送到该交换机上的信息则会丢失。
        
        direct模式:消息与一个特定的路由器完全匹配,才会转发
        topic模式:按规则转发消息,最灵活
     -->
    <rabbit:topic-exchange name="mq_exchange" durable="true" auto-delete="false">
        <rabbit:bindings>
            <!-- 设置消息Queue匹配的pattern (direct模式为key) -->
            <rabbit:binding queue="mq_queue" pattern="Seckill_mq_patt"/>
        </rabbit:bindings>
    </rabbit:topic-exchange>
    
</beans>


java 代码

public static void main(String[] arg) {


ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
AmqpTemplate amqpTemplate = (AmqpTemplate) context.getBean("amqpTemplate");
// convertAndSend 将Java对象转换为消息发送至匹配key的交换机中Exchange
for(int i=0;i<10;i++)
{
        amqpTemplate.convertAndSend("mq_exchange", "Seckill_mq_patt", "mg"+i);
}


}



消费者配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 
    http://www.springframework.org/schema/rabbit
    http://www.springframework.org/schema/rabbit/spring-rabbit-1.7.xsd">


<description>rabbitmq 连接服务配置</description>
    <!-- 连接配置 -->
    <rabbit:connection-factory id="connectionFactory" host="192.168.231.209" username="test"
        password="test" port="5672"  />
        
    <rabbit:admin connection-factory="connectionFactory"/>
    
    
    <!-- queue 队列声明 -->
    <!-- 
        durable 是否持久化 
        exclusive 仅创建者可以使用的私有队列,断开后自动删除 
        auto-delete 当所有消费端连接断开后,是否自动删除队列 -->
    <rabbit:queue id="mq_queue"   name="Seckill_Queue" durable="false" auto-delete="false" exclusive="false" auto-declare="false" />
   
  
    <!-- 配置监听 消费者 -->
    <rabbit:listener-container concurrency="2"  connection-factory="connectionFactory"  acknowledge="manual">
        <!-- 
            queues 监听队列,多个用逗号分隔 
            ref 监听器 -->
        <rabbit:listener  queues="mq_queue" ref="queueListenter"/>
    </rabbit:listener-container>
</beans>


java 代码

public class QueProducer {


public static void main(String[] arg) {


ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");



}
}




@Component
public class QueueListenter implements ChannelAwareMessageListener {






public void onMessage(Message message, Channel channel) throws Exception {
// TODO Auto-generated method stub

try{
MessageConverter converter = new SimpleMessageConverter();
String mes= (String)converter.fromMessage(message);
System.out.println(mes);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}catch(Exception ex){
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false,true);
}
}


}

原创粉丝点击