java 使用rabbitmq_Java如何使用rabbitMQ实现消息收发的实例

RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统,本文通过实例来给大家分享通过操作rabbitMQ实现消息的收发,感兴趣的朋友可以参考下。

java实现rAMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

本文不介绍amqp和rabbitmq相关知识,请自行网上查阅

本文是基于spring-rabbit中间件来实现消息的发送接受功能

see http://www.rabbitmq.com/tutorials/tutorial-one-java.html

see http://www.springsource.org/spring-amqp

Java编程通过操作rabbitMQ消息的收发实现代码如下:

com.rabbitmq

amqp-client

2.8.2

org.springframework.amqp

spring-amqp

1.1.1.RELEASE

org.springframework.amqp

spring-rabbit

1.1.1.RELEASE

com.caucho

hessian

4.0.7

首先我们需要一个用来在app和rabbitmq之间传递消息的持有对象

public class EventMessage implements Serializable{

private String queueName;

private String exchangeName;

private byte[] eventData;

public EventMessage(String queueName, String exchangeName, byte[] eventData) {

this.queueName = queueName;

this.exchangeName = exchangeName;

this.eventData = eventData;

}

public EventMessage() {

}

public String getQueueName() {

return queueName;

}

public String getExchangeName() {

return exchangeName;

}

public byte[] getEventData() {

return eventData;

}

@Override

public String toString() {

return "EopEventMessage [queueName=" + queueName + ", exchangeName="

+ exchangeName + ", eventData=" + Arrays.toString(eventData)

+ "]";

}

}

为了可以发送和接受这个消息持有对象,我们还需要需要一个用来序列化和反序列化的工厂

public interface CodecFactory {

byte[] serialize(Object obj) throws IOException;

Object deSerialize(byte[] in) throws IOException;

}

下面是编码解码的实现类,用了hessian来实现,大家可以自行选择序列化方式

public class HessionCodecFactory implements CodecFactory {

private final Logger logger = Logger.getLogger(HessionCodecFactory.class);

@Override

public byte[] serialize(Object obj) throws IOException {

ByteArrayOutputStream baos = null;

HessianOutput output = null;

try {

baos = new ByteArrayOutputStream(1024);

output = new HessianOutput(baos);

output.startCall();

output.writeObject(obj);

output.completeCall();

} catch (final IOException ex) {

throw ex;

} finally {

if (output != null) {

try {

baos.close();

} catch (final IOException ex) {

this.logger.error("Failed to close stream.", ex);

}

}

}

return baos != null ? baos.toByteArray() : null;

}

@Override

public Object deSerialize(byte[] in) throws IOException {

Object obj = null;

ByteArrayInputStream bais = null;

HessianInput input = null;

try {

bais = new ByteArrayInputStream(in);

input = new HessianInput(bais);

input.startReply();

obj = input.readObject();

input.completeReply();

} catch (final IOException ex) {

throw ex;

} catch (final Throwable e) {

this.logger.error("Failed to decode object.", e);

} finally {

if (input != null) {

try {

bais.close();

} catch (final IOException ex) {

this.logger.error("Failed to close stream.", ex);

}

}

}

return obj;

}

}

接下来就先实现发送功能,新增一个接口专门用来实现发送功能

public interface EventTemplate {

void send(String queueName,String exchangeName,Object eventContent) throws SendRefuseException;

void send(String queueName,String exchangeName,Object eventContent,CodecFactory codecFactory) throws SendRefuseException;

}

SendRefuseException是自定义的发送失败异常类

下面是它的实现类,主要的任务就是将数据转换为EventMessage

public class DefaultEventTemplate implements EventTemplate {

private static final Logger logger = Logger.getLogger(DefaultEventTemplate.class);

private AmqpTemplate eventAmqpTemplate;

private CodecFactory defaultCodecFactory;

//private DefaultEventController eec;

//public DefaultEventTemplate(AmqpTemplate eopAmqpTemplate,

//CodecFactory defaultCodecFactory, DefaultEventController eec) {

//this.eventAmqpTemplate = eopAmqpTemplate;

//this.defaultCodecFactory = defa

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值