通过消息服务器传递Java对象,Java类必须实现序列化接口,可以把Java对象转化为字节数组,从消费者或生产者传递到另外一个JVM中,一定需要两个JVM共享这个类,比如是UserInfo类。
2、消费者中,实例化UserInfo的对象,并取出它的字节数组
3、编写生产者
代码:
UserInfo.java
package com.test.rfc;
public class UserInfo implements java.io.Serializable{
private String name = null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Server.java
package com.test.rfc;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class Server {
public byte[] getUserByte() throws Exception
{
UserInfo u = new UserInfo();
u.setName("Hello I come from MQ server");
ByteArrayOutputStream baos = new
ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(u);
oos.close();
baos.close();
return baos.toByteArray();
}
public static void main(String[] argv) {
Server s = new Server();
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername("admin");
factory.setPassword("admin");
factory.setHost("192.168.169.142");
//使用默认端口5672
Connection connection = null;
try {
connection = factory.newConnection();
final Channel channel = connection.createChannel();
//序列化对象
final byte[] data = s.getUserByte();
System.out.println(data.length);
String queueName = "queue_rpc";
channel.queueDeclare(queueName, false, false, false,
null);
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException
{
System.out.println("rfc=" + new String(body));
AMQP.BasicProperties replyProps = new
AMQP.BasicProperties.Builder()
.correlationId(properties.getCorrelationId())
.build();
channel.basicPublish("", properties.getReplyTo(),
replyProps, data);
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
channel.basicConsume(queueName, false, consumer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client.java
package com.test.rfc;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import com.rabbitmq.client.*;
public class Client {
public static void main(String[] argv) {
try
{
//发送消息的队列,Server在这个队列上接受消息
String queueName = "queue_rpc";
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername("admin");
factory.setPassword("admin");
factory.setHost("192.168.169.142");
//使用默认端口5672
Connection connection = null;
connection = factory.newConnection();
Channel channel = connection.createChannel();
//生成临时的队列,Client在这队列上等待Server返回信息,Server向这个队列发消息
String replyQueueName =
channel.queueDeclare().getQueue();
//生成唯一ID
final String corrId = UUID.randomUUID().toString();
AMQP.BasicProperties props = new
AMQP.BasicProperties.Builder()
.correlationId(corrId).replyTo(replyQueueName).build();
//客户端发送RFC请求
channel.basicPublish("", queueName, props,
"GetUserInfo".getBytes());
//Server返回消息
final BlockingQueue response = new
ArrayBlockingQueue(1);
channel.basicConsume(replyQueueName, true,
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
System.out.println(properties.getCorrelationId()+",body="+body.length);
if (properties.getCorrelationId().equals(corrId)) {
response.offer(body);
}
}
});
byte[] b = response.take();
System.out.println(b.length);
//反序列化对象
ByteArrayInputStream bais = new ByteArrayInputStream(b);
ObjectInputStream oii = new ObjectInputStream(bais);
UserInfo u = (UserInfo)oii.readObject();
System.out.println(u.getName());
channel.close();
connection.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
- RabbitMQ(3) Java客户端使用
RabbitMQ针对不同的开发语言(java,python,c/++,Go等等),提供了丰富对客户端,方便使用.就Java而言,可供使用的客户端有RabbitMQ Java client. Rabbi ...
- 关于 Java 对象序列化您不知道的 5 件事
数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...
- 疯狂Java学习笔记(84)----------大约 Java 对象序列化,你不知道 5 事
几年前,.当一个软件团队一起用 Java 书面申请.我认识比一般程序猿多知道一点关于 Java 对象序列化的知识所带来的优点. 关于本系列 您认为自己懂 Java 编程?其实,大多数程序猿对于 Jav ...
- RabbitMQ与java、Spring结合实例详细讲解(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了rabbitMq,提供了如何在Ubuntu下安装RabbitMQ 服务的方法. ...
- (转)关于 Java 对象序列化您不知道的 5 件事
关于 Java 对象序列化您不知道的 5 件事 转自:http://developer.51cto.com/art/201506/479979.htm 数年前,当和一个软件团队一起用 Java 语言编 ...
- RabbitMQ的Java API编程
1.创建Maven工程,pom.xml引入依赖: <dependency> <groupId>com.rabbitmq</groupId> <artifact ...
- RabbitMQ与java、Spring结合实例详细讲解
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了rabbitMq,提供了如何在Ubuntu下安装RabbitMQ 服务的方法. ...
- Java对象序列化剖析
对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...
- 通过JAXB完成Java对象与XML之间的转换
Java对象转换XML的过程叫marshal. XML转换到Java对象的过程叫unmarshal. 一.Java对象转化为XML 这里省略getter和setter方法 通过标注@XMLRootEl ...
随机推荐
- python 爬取头条视频
知识点总结 1. 利用webdriver 模拟浏览器访问 from selenium import webdriver 2.import requests 3. from bs4 import Bea ...
- python -jieba 安装+分词+定位
1.jieba 库安装 方法1:全自动安装(容易失败):easy_install jieba 或者 pip install jieba / pip3 install jieba 方法2:半自动安装(推 ...
- Redis中存储对象区别
1.最常用的是String结构,key和value都是字符串类型: 2.哈希:比较是用于对对象的操作: 3.List:按照插入数据顺序保存,value是可以重复的,底层是双向链表: 4.集合:是Str ...
- common配置文件
<dependencies> <dependency> <groupId>com.github.pagehelper</groupId> <art ...
- java poi导出Excel合并单元格并设置边框
import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; i ...
- 序列递推——cf1204E(好题)
/* 显然用dp[i][j]来表示i个1,j个-1的结果 dp[i][j]由dp[i-1][j]和dp[i][j-1]转移而来 即dp[i][j]对应的所有序列,都可以由dp[i-1][j]在前面加一 ...
- mac os 下安装mysql
在 http://dev.mysql.com/downloads/mysql/ 选择下载mysql 注册并选择相应的版本后,得到下载链接:: wget http://dev.mysql.com/get ...
- TeleportArea可瞬移的目标位置
TeleportArea.png 1.可以自定义mesh ,想要什么区域就可以设置什么区域的mesh网格.2.Collider 组件必须有,否则无法进行位置移动,它用来检测激光笔是否打到该区域.3.M ...
- 5. Jmeter常用快捷键
快捷键 功能 备注 Ctrl + C 复制 可复制组件 Ctrl + V 粘贴 可粘贴组件 Ctrl + Shift + C 复制粘贴当前组件到下一行 Ctrl + R 运行测试计划 Ctrl ...
- 拾遗:systemctl --user
参考:https://wiki.gentoo.org/wiki/Systemd systemd 支持普通用户定义的 unit[s] 开机启动 systemctl --user enable/disab ...