Java Message Service - RabbitMQ

来源:互联网 发布:淘宝出国旅游医疗保险 编辑:程序博客网 时间:2024/06/05 01:01

       1.概念

       jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

       2.实现

       今天使用的是实现JMS的两个主打产品-RabbitMQ和ActiveMQ之一的RabbitMQ.

       开发环境:MyEclipse 10 + jdk8 + RabbitMQ 3.4

      3.步骤

      1)安装otp_win64_17.4.exe

      这个是Rabbit的基础组件,由于RabbitMQ底层不是JAVA语言开发的,所以需要安装这样的一个基础组件。

      2)安装 rabbitmq-server-3.4.3.zip

      安装这个service之后会创建一个windows service

       

      3)在MyEclipse中创建java项目

      项目结构如下:

      

        4)核心类

        EndPoint

        

package co.syntx.examples.rabbitmq;import java.io.IOException;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;/** * Represents a connection with a queue * @author syntx * */public abstract class EndPoint{    protected Channel channel;    protected Connection connection;    protected String endPointName;    public EndPoint(String endpointName) throws IOException{         this.endPointName = endpointName;         //Create a connection factory         ConnectionFactory factory = new ConnectionFactory();             //hostname of your rabbitmq server         factory.setHost("localhost");         //getting a connection         connection = factory.newConnection();             //creating a channel         channel = connection.createChannel();             //declaring a queue for this channel. If queue does not exist,         //it will be created on the server.         channel.queueDeclare(endpointName, false, false, false, null);    }    /**     * Close channel and connection. Not necessary as it happens implicitly any way.      * @throws IOException     */     public void close() throws IOException{         this.channel.close();         this.connection.close();     }}
Producer

package co.syntx.examples.rabbitmq;import java.io.IOException;import java.io.Serializable;import org.apache.commons.lang.SerializationUtils;/** * The producer endpoint that writes to the queue. * @author syntx * */public class Producer extends EndPoint{public Producer(String endPointName) throws IOException{super(endPointName);}public void sendMessage(Serializable object) throws IOException {    channel.basicPublish("",endPointName, null, SerializationUtils.serialize(object));}}
Consumer
package co.syntx.examples.rabbitmq;import java.io.IOException;import java.util.HashMap;import java.util.Map;import org.apache.commons.lang.SerializationUtils;import com.rabbitmq.client.AMQP.BasicProperties;import com.rabbitmq.client.Consumer;import com.rabbitmq.client.Envelope;import com.rabbitmq.client.ShutdownSignalException;/** * The endpoint that consumes messages off of the queue. Happens to be runnable. * @author syntx * */public class QueueConsumer extends EndPoint implements Runnable, Consumer{public QueueConsumer(String endPointName) throws IOException{super(endPointName);}public void run() {try {//start consuming messages. Auto acknowledge messages.channel.basicConsume(endPointName, true,this);} catch (IOException e) {e.printStackTrace();}}/** * Called when consumer is registered. */public void handleConsumeOk(String consumerTag) {System.out.println("Consumer "+consumerTag +" registered");}/** * Called when new message is available. */public void handleDelivery(String consumerTag, Envelope env,BasicProperties props, byte[] body) throws IOException {Map<?, ?> map = (HashMap<?, ?>)SerializationUtils.deserialize(body);    System.out.println("Message Number "+ map.get("message number") + " received.");}public void handleCancel(String consumerTag) {}public void handleCancelOk(String consumerTag) {}public void handleRecoverOk(String consumerTag) {}public void handleShutdownSignal(String consumerTag, ShutdownSignalException arg1) {}}
Main

package co.syntx.examples.rabbitmq;import java.io.IOException;import java.sql.SQLException;import java.util.HashMap;public class Main {public Main() throws Exception{QueueConsumer consumer = new QueueConsumer("queue");Thread consumerThread = new Thread(consumer);consumerThread.start();Producer producer = new Producer("queue");for (int i = 0; i < 100000; i++) {HashMap<String, Integer> message = new HashMap<String, Integer>();message.put("message number", i);producer.sendMessage(message);System.out.println("Message Number "+ i +" sent.");}}/** * @param args * @throws SQLException  * @throws IOException  */public static void main(String[] args) throws Exception{  new Main();}}
运行效果:



0 0
原创粉丝点击