我将使用JGroups构建一个由三台Lunix机器组成的集群。代码运行正常,但每台机器独立工作,显然没有集群。
然而,当我在单机中运行代码作为独立的并且我创建3个实例时,它工作正常并形成一个集群。所以我认为问题不在于代码。
以下是java代码和UDP.XML
文件。
package com.github.dustinbarnes;
import org.jgroups.JChannel;
import org.jgroups.ReceiverAdapter;
import org.jgroups.View;
import org.jgroups.blocks.locking.LockService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
@SuppressWarnings("FieldCanBeLocal")
public class Node extends ReceiverAdapter
{
private static final Logger LOG = LoggerFactory.getLogger(Node.class);
private AtomicBoolean isMaster = new AtomicBoolean(false);
private Thread statusPrinter;
private Thread acquiringThread;
private LockService lockService;
private JChannel channel;
private Lock masterLock;
public static void main(String[] args) throws Exception
{
Node node = new Node();
node.start();
}
public Node() throws Exception
{
this.channel = new JChannel(Node.class.getClassLoader().getResourceAsStream("udp.xml"));
this.channel.setReceiver(this);
this.channel.connect("master-cluster");
this.lockService = new LockService(this.channel);
}
public void start()
{
this.startAcquiringThread();
this.startStatusPrintingThread();
}
@Override
public void viewAccepted(View view)
{
LOG.info("Cluster event has happened!");
}
private void startAcquiringThread()
{
acquiringThread = new Thread()
{
@Override
public void run()
{
Thread.currentThread().setName("acquire-lock");
getLock();
}
};
acquiringThread.setDaemon(true);
acquiringThread.start();
}
private void getLock()
{
masterLock = lockService.getLock("master");
masterLock.lock();
isMaster.set(true);
LOG.info("I have become the master!");
}
private void startStatusPrintingThread()
{
statusPrinter = new Thread() {
@Override
public void run()
{
Thread.currentThread().setName("status-printer");
//noinspection InfiniteLoopStatement
while ( true ) {
try
{
LOG.info("is master [" + isMaster + "]");
LOG.info("cluster view [" + channel.getViewAsString() + "]");
sleep(2000L);
}
catch ( InterruptedException e )
{
// If the sleep gets interrupted, that's fine.
}
}
}
};
statusPrinter.setDaemon(true);
statusPrinter.start();
}
}
这是UDP文件: -
<!--
Default stack using IP multicasting. It is similar to the "udp"
stack in stacks.xml, but doesn't use streaming state transfer and flushing
author: Bela Ban
-->
<config xmlns="urn:org:jgroups" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/JGroups-3.1.xsd">
<UDP mcast_port="${jgroups.udp.mcast_port:45588}" tos="8" ucast_recv_buf_size="20M" ucast_send_buf_size="640K" mcast_recv_buf_size="25M" mcast_send_buf_size="640K" loopback="true" max_bundle_size="64K" max_bundle_timeout="30" ip_ttl="${jgroups.udp.ip_ttl:8}" enable_bundling="true" enable_diagnostics="true" thread_naming_pattern="cl"
timer_type="old" timer.min_threads="4" timer.max_threads="10" timer.keep_alive_time="3000" timer.queue_max_size="500"
thread_pool.enabled="true" thread_pool.min_threads="2" thread_pool.max_threads="8" thread_pool.keep_alive_time="5000" thread_pool.queue_enabled="true" thread_pool.queue_max_size="10000" thread_pool.rejection_policy="discard"
oob_thread_pool.enabled="true" oob_thread_pool.min_threads="1" oob_thread_pool.max_threads="8" oob_thread_pool.keep_alive_time="5000" oob_thread_pool.queue_enabled="false" oob_thread_pool.queue_max_size="100" oob_thread_pool.rejection_policy="discard" />
<PING timeout="2000" num_initial_members="20" />
<MERGE2 max_interval="30000" min_interval="10000" />
<FD_SOCK />
<FD_ALL />
<VERIFY_SUSPECT timeout="1500" />
<BARRIER />
<pbcast.NAKACK2 xmit_interval="1000" xmit_table_num_rows="100" xmit_table_msgs_per_row="2000" xmit_table_max_compaction_time="30000" max_msg_batch_size="500" use_mcast_xmit="false" discard_delivered_msgs="true" />
<UNICAST xmit_interval="2000" xmit_table_num_rows="100" xmit_table_msgs_per_row="2000" xmit_table_max_compaction_time="60000" conn_expiry_timeout="60000" max_msg_batch_size="500" />
<pbcast.STABLE stability_delay="1000" desired_avg_gossip="50000" max_bytes="4M" />
<pbcast.GMS print_local_addr="true" join_timeout="3000" view_bundling="true" />
<UFC max_credits="2M" min_threshold="0.4" />
<MFC max_credits="2M" min_threshold="0.4" />
<FRAG2 frag_size="60K" />
<RSVP resend_interval="2000" timeout="10000" />
<pbcast.STATE_TRANSFER />
<CENTRAL_LOCK/>
<!-- pbcast.FLUSH /-->
答案 0 :(得分:0)