一.導入包
implementation ‘com.rabbitmq:amqp-client:4.2.0’
二.項目使用
1.設置工程連接
factory = new ConnectionFactory();
factory.setHost(hostname);
factory.setPort(port);
factory.setUsername(MQConfig.username);
factory.setVirtualHost("/");
factory.setPassword(MQConfig.password);
factory.setConnectionTimeout(10000); //連接時間設置爲10秒
factory.setAutomaticRecoveryEnabled(true); //恢復連接,通道
factory.setTopologyRecoveryEnabled(true); //恢復通道中 轉換器,隊列,綁定關係等
factory.setNetworkRecoveryInterval(10000); //恢復連接間隔,默認5秒
factory.setRequestedHeartbeat(10);
2.監聽消息與發送消息
定義線程池
ExecutorService executor = Executors.newFixedThreadPool(2);
監聽隊列消息
executor.execute(new Runnable() {
@Override
public void run() {
if (instance != null) {
receiveMessageByQueue(queueName);
}
}
});
public void receiveMessageByQueue(final String queueName) {
try {
if (connection == null || !connection.isOpen()) {
connection = factory.newConnection();
}
if (!channelMap.containsKey(FLAG_RECEIVE + queueName)) {
final Channel channel = connection.createChannel();
channel.queueDeclare(queueName, true, false, false, null);
channel.basicQos(100);
channel.basicConsume(queueName, false, 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");
if (mqMessageReceiver != null) {
mqMessageReceiver.onMQMessage(queueName, message, channel, envelope);
}
}
});
channelMap.put(FLAG_RECEIVE + queueName, channel);
}
} catch (IOException | TimeoutException | AlreadyClosedException e) {
SystemClock.sleep(5000);
receiveMessageByQueue(queueName);
}
}
發送消息
executor.execute(new Runnable() {
@Override
public void run() {
try {
if (connection == null || !connection.isOpen()) {
connection = factory.newConnection();
}
Channel channel;
if (channelMap.containsKey(FLAG_SEND + queueName)) {
channel = channelMap.get(FLAG_SEND + queueName);
} else {
channel = connection.createChannel();
channel.queueDeclare(queueName, true, false, false, null);
channelMap.put(FLAG_SEND + queueName, channel);
}
channel.confirmSelect();
channel.basicPublish("", queueName, null, message.getBytes());
boolean success = channel.waitForConfirms();
if (success) {
if (listener != null) {
listener.sendMessage(true);
}
} else {
if (listener != null) {
listener.sendMessage(false);
}
}
} catch (IOException | InterruptedException | TimeoutException e) {
e.printStackTrace();
if (listener != null) {
listener.sendMessage(false);
}
}
}
});
關閉資源
public void close() {
instance = null;
if(executor!=null){
executor.shutdown();
}
if(factory!=null){
factory=null;
}
if (channelMap != null && channelMap.size() > 0) {
for (Channel channel : channelMap.values()) {
if (channel != null && channel.isOpen()) {
try {
Connection connection = channel.getConnection();
if(channel!=null&&channel.isOpen()){
channel.close();
}
if(connection!=null&&connection.isOpen()){
connection.close();
}
} catch (IOException | TimeoutException e) {
e.printStackTrace();
}catch (Exception e1){
e1.printStackTrace();
}
}
}
channelMap.clear();
}
if (connection != null && connection.isOpen()) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}