ActiveMQ有两种消息处理机制 queue和 topic
queue与topic的技术特点对比
![](https://img-blog.csdnimg.cn/img_convert/f7f2cc6fdada5c54d9ca1e19096f1818.jpeg)
Topic和queue的最大区别在于topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息;而queue则是以点对点的形式通知多个处于监听状态的客户端中的一个。
activemq 三个属性 delay、period、repeat 延迟、周期、重复
camel activemq代码
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.camel.builder.endpoint.EndpointRouteBuilder;
import org.apache.camel.component.jms.JmsComponent;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.jms.ConnectionFactory;
import java.util.concurrent.atomic.AtomicInteger;
@Component
public class ClientRouteV2 extends EndpointRouteBuilder {
AtomicInteger sendInteger = new AtomicInteger(0);
AtomicInteger handleInteger = new AtomicInteger(0);
@Value("${spring.activemq.user}")
String userName;
@Value("${spring.activemq.password}")
String passWord;
@Value("${spring.activemq.broker-url}")
String brokerUrl;
@Override
public void configure() throws Exception {
ConnectionFactory connectionfactory =
new ActiveMQConnectionFactory(userName, passWord, brokerUrl);
getContext().getRegistry().bind("activemq", JmsComponent.jmsComponentAutoAcknowledge(connectionfactory));
from("timer://foo?fixedRate=true&period=1000&repeatCount=10")
.process(exchange -> {
sendInteger.getAndIncrement();
exchange.getIn().setBody("HELLO from Camel!");
System.out.println("producer setBody----" + exchange.getIn().getBody() + "========" + sendInteger.get());
})
.to(activemq("queue:testCamel222").requestTimeout(200)
// .to(activemq("topic:testCamel222").requestTimeout(200)
);
from(activemq("queue:testCamel222"))
// from(activemq("topic:testCamel222"))
.threads(20) // 增加线程池,提高并发处理能力
.bean(TestBean.class, "test(String,String)")
.process(exchange -> {
handleInteger.getAndIncrement();
System.out.println("consumer getBody----" + exchange.getIn().getBody() + "========" + handleInteger.get());
})
;
}
}
下面是个bean拼装
import org.apache.camel.Headers;
public class TestBean {
public String test(@Headers String topic, String body) {
System.out.println("consumer body 拼装前----"+body);
return "test camel+activemq==="+body;
}
}
下面是配置文件
spring:
jms:
pub-sub-domain: true
activemq:
broker-url: xxx
in-memory: true
pool:
enabled: true
packages:
trust-all: true
user: xxx
password: xxx
server:
port: 8089
jms:
topic:
name: 1234dfd
引入jar包
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-timer-starter</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-activemq</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.17.4</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-endpointdsl</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>${camel.version}</version>
</dependency>
<properties>
<camel.version>3.14.2</camel.version>
</properties>
上述代码意思是:定时器进入,走十次,一秒一次,进入process 给 body赋值,发送请求到activemq,超时时间单位是毫秒,我写200就是图快。下面form是activemq 拉取消息内容并处理,需要注意的是topic 发完接不到也不管,但queue 发完了,会监听然后消费
原生activemq
太繁琐了,不写了,自定百度找demo吧