- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个相对较大的文件(大约 100MB),我想将其多播给集群的所有成员。如何使用 jgroups 以 block 的形式发送文件(最好有代码演示)?该文件应该在接收端以 block 的形式读取。另外,我如何确保在接收方维护 block 的顺序。
编辑 1到目前为止,这是我尝试过的。我只是将文件作为一个整体发送,并将接收方的内容写入临时文件
public class SimpleFileTransfer extends ReceiverAdapter {
JChannel channel;
private void start() throws Exception{
channel = new JChannel();
channel.setReceiver(this);
channel.connect("FileCluster");
// channel.getState(null, 10000);
File file = new File("/res/test.txt"); //the file to be sent
eventLoop(file);
channel.close();
}
private void eventLoop(File file) throws IOException{
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
try {
Message msg = new Message(null, null, in);
channel.send(msg);
}
catch (Exception e){
e.printStackTrace();
}
}
public void receive(Message msg)
{
try {
File temp = new File("/res/temp.txt");
FileWriter writer = new FileWriter(temp);
InputStream in = new ByteArrayInputStream(msg.getBuffer());
int next = in.read();
while (next != -1){
writer.write(next);
next = in.read();
}
}
catch (IOException ie)
{
ie.printStackTrace();
}
}
}
最佳答案
下面是更好的版本,它将大文件分成 8K block 。文件 X 被写入/tmp/X。请注意,必须更改/home/bela/fast.xml 配置,当然:
public class SimpleFileTransfer extends ReceiverAdapter {
protected String filename;
protected JChannel channel;
protected Map<String,OutputStream> files=new ConcurrentHashMap<>();
protected static final short ID=3500;
private void start(String name, String filename) throws Exception {
ClassConfigurator.add((short)3500, FileHeader.class);
this.filename=filename;
channel=new JChannel("/home/bela/fast.xml").name(name);
channel.setReceiver(this);
channel.connect("FileCluster");
eventLoop();
}
private void eventLoop() throws Exception {
while(true) {
Util.keyPress(String.format("<enter to send %s>\n", filename));
sendFile();
}
}
protected void sendFile() throws Exception {
FileInputStream in=new FileInputStream(filename);
try {
for(;;) {
byte[] buf=new byte[8096];
int bytes=in.read(buf);
if(bytes == -1)
break;
sendMessage(buf, 0, bytes, false);
}
}
catch(Exception e) {
e.printStackTrace();
}
finally {
sendMessage(null, 0, 0, true);
}
}
public void receive(Message msg) {
byte[] buf=msg.getRawBuffer();
FileHeader hdr=(FileHeader)msg.getHeader(ID);
if(hdr == null)
return;
OutputStream out=files.get(hdr.filename);
try {
if(out == null) {
File tmp=new File(hdr.filename);
String fname=tmp.getName();
fname="/tmp/" + fname;
out=new FileOutputStream(fname);
files.put(hdr.filename, out);
}
if(hdr.eof) {
Util.close(files.remove(hdr.filename));
}
else {
out.write(msg.getRawBuffer(), msg.getOffset(), msg.getLength());
}
}
catch(Throwable t) {
System.err.println(t);
}
}
protected void sendMessage(byte[] buf, int offset, int length, boolean eof) throws Exception {
Message msg=new Message(null, buf, offset, length).putHeader(ID, new FileHeader(filename, eof));
// set this if the sender doesn't want to receive the file
// msg.setTransientFlag(Message.TransientFlag.DONT_LOOPBACK);
channel.send(msg);
}
protected static class FileHeader extends Header {
protected String filename;
protected boolean eof;
public FileHeader() {} // for de-serialization
public FileHeader(String filename, boolean eof) {
this.filename=filename;
this.eof=eof;
}
public int size() {
return Util.size(filename) + Global.BYTE_SIZE;
}
public void writeTo(DataOutput out) throws Exception {
Util.writeObject(filename, out);
out.writeBoolean(eof);
}
public void readFrom(DataInput in) throws Exception {
filename=(String)Util.readObject(in);
eof=in.readBoolean();
}
}
public static void main(String[] args) throws Exception {
if(args.length != 2) {
System.out.printf("%s <name> <filename>\n", SimpleFileTransfer.class.getSimpleName());
return;
}
new SimpleFileTransfer().start(args[0], args[1]); // name and file
}
关于java - 如何在 jgroups 中多播大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34951375/
我想向我的 JGroup 集群中的节点发送消息,不是通过其中一个节点,而是从外部资源。 这可能吗? 最佳答案 STOMP 协议(protocol)允许 STOMP 客户端连接到任何 Jgroups 集
我可以在前往伊朗的应用程序中使用 JGroups 库吗? 我发现了一些与加密相关的代码:org.jgroups.protocols.ENCRYPT.class 更精确的问题是,上面的代码是否使用或提供
我目前的 jgroups 配置存在问题,导致数千条消息卡在 NAKACK.xmit_table 中。实际上,它们似乎都最终出现在 xmit_table 中,并且几个小时后的另一个转储表明它们也从未打算
我有两台机器正在运行 JGroups。我面临的问题是,一旦在其中一台机器中创建了实例,几秒钟后我就会启动其他实例。它们都是单独启动的(同一集群),即它们不一起加入集群。 10 到 15 秒后,他们互相
我想在具有多个节点的 JVM 上创建一个分布式应用程序,并且需要一个允许我执行以下操作的库: 管理集群/网格成员,即我想在离开/加入时收到通知 管理集群成员之间的消息 我找到了两个解决方案: JGro
我通过 jgroups 创建了一个到集群的连接器。我的连接器实例在同一台计算机上运行时可以正常工作并获取其他消息,但当它们在两台不同的计算机上运行时它们不会捕获其他消息。我的 JGroups 连接器类
我有一个用 Java 编写的分布式应用程序,它使用 JGroups 在位于不同计算机上的应用程序的不同实例之间进行通信。 每台机器上都有 3 个网卡。每个网卡都有自己的IP,它们不能桥接在一起,因为我
所以我目前正在学习官方 JGroups 教程 here 我编译该类,指定了正确的 JGroups 类路径,但是当我运行 SimpleChat 时,我收到以下错误消息。 User@0001-Macboo
我在我的服务器上使用 Wildfly 8,在我的服务器中我使用 Infinispan(使用 Jgroups)作为集群缓存。我想知道 Jgroups/Infinispan 使用哪些端口,这样我就可以打开
我有一些使用 JGroup 镜像的服务器。最近有一些不同步的意外行为,根据日志,Jgroup 会不时断开连接。我想在 JGroup 代码中编写一个小程序,以便在 JGroup 断开连接后通过电子邮件发
有一个由3个服务器节点(美属萨摩亚,阿拉斯加,阿拉巴马州)和1个客户端节点(VoterClient)组成的 View 。每当我尝试在 View 中的第一台服务器(在以下情况下为美属萨摩亚)中调用表决方
我的基于 Spring 的 Web 应用程序已部署到具有粘性 session 的 Tomcat 集群(4 个以上节点)中的生产环境。几年内节点数量上限不会超过8-10个。 我需要缓存一些数据(主要是配
我们可以使用 Message() 对象向协调器发送消息。这里我们要设置发送者地址和接收者地址。如果我想向协调器发送消息,那么我可以从 View 中获取 get(0) 成员并将其用作目标地址。但是如何设
因此,我尝试跨集群发送消息,该消息将包含一个 User 对象,该对象是一个可序列化类。 当我发送 String 或 int 时,它工作正常,消息发送没有问题,并且集群上的所有 channel 都收到它
当使用 JGroups 时,通过 Infinispan 等组件,可以配置 JGroups 将使用的端口和地址。 http://www.jgroups.org/manual/html/user-adva
我想使用 JGroups 开发一些分布式应用程序。但不幸的是,我无法在集群上获得超过一个成员。他们总是加入同一个地址: this.channel = new JChannel("udp.xml
如果我们查看 Jgroups 的 DefaultThreadFactory 内部,会出现以下代码 protected Thread newThread(Runnable r,String name,S
我们正在使用jGroups构建两个集群:“server”和“app”。它们是独立的集群,运行在不同的机器上(通过 JMS 相互通信)。我们的一些代码只需要在集群中的一个节点上运行,因此我们使用 jGr
我正在使用 JGroups 开发一个简单的聊天应用程序。该应用程序在我的计算机上运行良好,但是当我尝试在同一网络上的另一台计算机上运行它时,它不起作用。 void start() throws Exc
假设我有一个相对较大的文件(大约 100MB),我想将其多播给集群的所有成员。如何使用 jgroups 以 block 的形式发送文件(最好有代码演示)?该文件应该在接收端以 block 的形式读取。
我是一名优秀的程序员,十分优秀!