http://tangxininjava.iteye.com/blog/2276211
在上面这篇基础上 使用rabbitmq 当然首先需要安装rabbitmq。关于rabbitmq的安装就不说了。
我安装的windows版本的 安装好了之后访问地址:http://localhost:15672/#/
默认登录用户名:guest 密码:guest
因为使用的spring boot 代码如下:
Application.java
package com.zmall;
import com.rabbitmq.client.Channel;
import com.zmall.service.Receiver;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.Connection;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.embedded.MultipartConfigFactory;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import javax.servlet.MultipartConfigElement;
import javax.sql.DataSource;
@Configuration
@EnableAutoConfiguration
@MapperScan(basePackages = "com.zmall.mapper")
@ComponentScan(basePackages = "com.zmall")
public class Application extends SpringBootServletInitializer {
final static String queueName = "o2o.zmall.goods";
@Bean
Queue queue() {
return new Queue(queueName, false);
}
@Bean
TopicExchange exchange() {
return new TopicExchange("o2o.zmall");
}
@Bean
Binding binding(Queue queue, TopicExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with(queueName);
}
@Bean
SimpleMessageListenerContainer container(MessageListenerAdapter listenerAdapter) {
com.rabbitmq.client.ConnectionFactory client = new com.rabbitmq.client.ConnectionFactory();
client.setHost("localhost");
client.setPort(5672);
ConnectionFactory connectionFactory = new CachingConnectionFactory(client);
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(queueName);
container.setMessageListener(listenerAdapter);
return container;
}
@Bean
Receiver receiver() {
return new Receiver();
}
@Bean
MessageListenerAdapter listenerAdapter(Receiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("5MB");
factory.setMaxRequestSize("5MB");
return factory.createMultipartConfig();
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
return sessionFactory.getObject();
}
}
然后控制器中发送信息 IndexController.java
package com.zmall.controller;
import com.zmall.model.City;
import com.zmall.service.CityService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* Created by Administrator on 2016/2/10.
*/
@Controller
@RequestMapping(value = "/index")
public class IndexController {
@Autowired
RabbitTemplate rabbitTemplate;
@Autowired
private CityService cityService;
@RequestMapping(value = "/get",method = RequestMethod.GET)
@ResponseBody
public String index(){
City city = cityService.getCity(1L);
rabbitTemplate.convertAndSend("o2o.zmall.goods","Hello from RabbitMQ!");
return city.getName();
}
}
在上面的Application.java中我们可以看到这个代码:
@Bean
MessageListenerAdapter listenerAdapter(Receiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
这个Receiver就是我们自己手动创建的 代码如下 Receiver.java
package com.zmall.service;
/**
* Created by Administrator on 2016/2/12.
*/
public class Receiver {
public void receiveMessage(String message) {
System.out.println("Received <" + message + ">");
}
}
启动tomcat 访问地址:http://localhost:8080/index/get
看到控制台打印信息:Received <Hello from RabbitMQ!>
总结:RabbitMQ和我们数据库连接 hibernate spring 都有工厂 都有类似连接这样的概念。
Connection 这种概念就是我们配置上面都有类似性,可以通过查询源码来看到这些信息。
比如看下这个com.rabbitmq.client.ConnectionFactory的源码
/** @deprecated */
@Deprecated
public static final int DEFAULT_NUM_CONSUMER_THREADS = 5;
public static final String DEFAULT_USER = "guest";
public static final String DEFAULT_PASS = "guest";
public static final String DEFAULT_VHOST = "/";
public static final int DEFAULT_CHANNEL_MAX = 0;
public static final int DEFAULT_FRAME_MAX = 0;
public static final int DEFAULT_HEARTBEAT = 0;
public static final String DEFAULT_HOST = "localhost";
public static final int USE_DEFAULT_PORT = -1;
public static final int DEFAULT_AMQP_PORT = 5672;
public static final int DEFAULT_AMQP_OVER_SSL_PORT = 5671;
public static final int DEFAULT_CONNECTION_TIMEOUT = 0;
public static final int DEFAULT_SHUTDOWN_TIMEOUT = 10000;
private static final String DEFAULT_SSL_PROTOCOL = "TLSv1";
private String username = "guest";
private String password = "guest";
private String virtualHost = "/";
private String host = "localhost";
private int port = -1;
private int requestedChannelMax = 0;
private int requestedFrameMax = 0;
private int requestedHeartbeat = 0;
private int connectionTimeout = 0;
private int shutdownTimeout = 10000;
private Map<String, Object> _clientProperties = AMQConnection.defaultClientProperties();
private SocketFactory factory = SocketFactory.getDefault();
private SaslConfig saslConfig;
private ExecutorService sharedExecutor;
private ThreadFactory threadFactory;
private SocketConfigurator socketConf;
private ExceptionHandler exceptionHandler;
private boolean automaticRecovery;
private boolean topologyRecovery;
private long networkRecoveryInterval;
从上面的源码我们可以看出 凡是都是可配置的。这些代码的配置替代xml也是可以的。xml有时候明朗化都可以。不同的方式配置不一样而已。