网上的方法很多,但我自己装的时候总会报一个奇怪的错
collect2: ld returned 1 exit status
make: *** [amqp.la] Error 1 rabbitmq
安装rabbitmq有三步
第一步安装rabbitmq
这里我用的是yum源安装,当然也可以自行编译,找到相关的依赖,一个一个下,但是保不奇会遇到一些蛇皮错误。
yum install rabbitmq-server
第二步安装rabbitmq-c
yum 源安装的rabbitmq-server版本不高,当时我安的是最新版,可以是这个原因报错
nohup rabbitmq-server >/dev/null 2>/dev/null &
wget https://github.com/alanxz/rabbitmq-c/releases/download/v2.0/rabbitmq-c-0.5.2.tar.gz
tar zxvf rabbitmq-c-0.5.2.tar.gz
cd rabbitmq-c-0.5.2
./configure --prefix=/usr/local/rabbitmq-c
make && make install
第三步安装php扩展so文件
pecl install amqp
第四步
vim php.ini
添加以下语句
extension=amqp.so
搞定
你也可以去下载相应的amqp的c扩展源码包进行安装,也许可以成功,但是我就是编译不成功,只能用pecl来安装
还可以启用web管理插件
cd /usr/lib/rabbitmq/bin
./rabbitmq-plugins enable rabbitmq_management
默认是在15672端口有一个web管理界面。
返正阿里云跟腾迅云就是边不上15672端口,所有我要修改,web管理界面的端口
修改配配置文件
vim /etc/rabbitmq/rabbitmq.config
添加以下
{rabbitmq_management,
[%% Pre-Load schema definitions from the following JSON file. See
%% http://www.rabbitmq.com/management.html#load-definitions
%%
%% {load_definitions, "/path/to/schema.json"},
%% Log all requests to the management HTTP API to a file.
%%
%% {http_log_dir, "/path/to/access.log"},
%% Change the port on which the HTTP listener listens,
%% specifying an interface for the web server to bind to.
%% Also set the listener to use SSL and provide SSL options.
%%
%% {listener, [{port, 12345},
%% {ip, "127.0.0.1"},
%% {ssl, true},
%% {ssl_opts, [{cacertfile, "/path/to/cacert.pem"},
%% {certfile, "/path/to/cert.pem"},
%% {keyfile, "/path/to/key.pem"}]}]},
%% Configure how long aggregated data (such as message rates and queue
%% lengths) is retained. Please read the plugin's documentation in
%% https://www.rabbitmq.com/management.html#configuration for more
%% details.
%%
%% {sample_retention_policies,
%% [{global, [{60, 5}, {3600, 60}, {86400, 1200}]},
%% {basic, [{60, 5}, {3600, 60}]},
%% {detailed, [{10, 5}]}]}
{listener, [{port, 8080},
{ip, "0.0.0.0"},
{ssl, false}
]}
]},
改为80端口,一串注释不用理他,只要管{listen就行了,开8080端口就行
用php -m查看一下
关于windows的安装
首先要安装erlang22和rabbitmq3.8
er跟ra版本要对应上
再把erlang的安装目录,弄一个EARLANG_HOME的用户变量和系统变量
再把bin目录放到时path变量中
rabbitmq-plugins enable rabbitmq_management
rabbitmq-server.bat start
二、关于rabbitmq发送消息的一些基本概念
发送消息是通过Exchange的rouute key的不同,来发送的指定的消息给指定的队列queue的。
而Exchange本身有三种常见匹配规则来匹配到指定的queue。
这三种常见的匹配规则分别是
1。direct
2。fanout
3。topic
如图所示
1。direct (单播)
这种匹配规则是全匹配路由键的。也就是routingkey要完全相等,才能匹配到指定的队列。
2。fanout(广播)
这种匹配规则是匹配所有的routingkey,也就是发给所有队列。
3.topic
这种匹配规则是带正则的
代码例 子
配置
<!-- rabbitmq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
yml
rabbitmq:
host: 127.0.0.1
username: guest
password: guest
主applicatit要启用注解
@SpringBootApplication
@EnableRabbit
public class VuelogApplication {
public static void main(String[] args) {
SpringApplication.run(VuelogApplication.class, args);
}
}
一、发送
@Autowired
RabbitTemplate rabbitTemplate;
@PostMapping("/test")
public void test(HttpServletRequest httpServletRequest){
System.out.println(httpServletRequest.getParameter("test"));
Map<String,Object> map=new HashMap<>();
map.put("msg","这是第一个消息");
map.put("data", Arrays.asList("hellowo",123,true));
rabbitTemplate.convertAndSend("exchange.direct","atguigu.news",map);//单播
rabbitTemplate.convertAndSend("exchange.fanout","",map);//广播
}
二、接收
@Service
public class BookService {
@RabbitListener(queues = "atguigu.news")
public void receive(Object object){
System.out.println("receive"+object);
}
@RabbitListener(queues = "atguigu")
public void receive02(Message message){
System.out.println(message.getBody());
System.out.println(message.getMessageProperties());
}
}
三、管理
@Test
public void createExchange(){
amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
System.out.println("创建exchange完成");
amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
System.out.println("queue完成");
//绑定时,要确保exchange和queue己经创建完成
amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE,"amqpadmin.exchange","amqpadmin.haha",null));
System.out.println("绑定完成");
}
概念:
exchange交换器里面绑了多个队列,生产者发送消息时要指定交换器和路由键,交换器收到路由键由自身规则类型匹配到自身指定的队列里进行存储。