изменение значения переменной одновременно на двух одинаковых модулях - PullRequest
0 голосов
/ 16 сентября 2018

Я написал модуль Java, который должен работать на двух контроллерах прожектора.У меня в mininet есть топология, которая состоит из 2 контроллеров прожектора (c1 и c2), коммутатора (s1), который подключен к c1, и 2 хостов (h1 и h2), которые подключены к этому коммутатору.Я пишу программу, в которой, когда c1 получает ICMP-пакет от s1, он отправит приветственное сообщение c2.

.
.
.

public class Mactracker implements IFloodlightModule, IOFMessageListener {

    protected static IHAControllerService hacontroller;
    protected static Logger logger = LoggerFactory.getLogger(Mactracker.class);
    protected IFloodlightProviderService floodlightProvider;
    protected Set<Long> macAddresses;
    private static NetworkNode network;
    private volatile int RFlag = 0;
    private String message;
    private static Map<String, String> config = new HashMap<>();
.
.
.

    @Override
    public void startUp(FloodlightModuleContext context) throws FloodlightModuleException {
        // TODO Auto-generated method stub
        floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
        ScheduledThreadPoolExecutor scheduledThreadPoolExecutor1 = new ScheduledThreadPoolExecutor(1);
        ThreadClass ts1 = new ThreadClass ();
        scheduledThreadPoolExecutor1.scheduleAtFixedRate(ts1, 2, 1, TimeUnit.MILLISECONDS);

    }
.
.
.

    @Override
    public net.floodlightcontroller.core.IListener.Command receive(IOFSwitch sw, OFMessage msg,
            FloodlightContext cntx) {
        // TODO Auto-generated method stub
        Ethernet eth =
                IFloodlightProviderService.bcStore.get(cntx,
                                            IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
        if (eth.getEtherType() == EthType.IPv4) {
            IPv4 ipv4 = (IPv4) eth.getPayload();

            if ( ipv4.getProtocol().equals(IpProtocol.ICMP)){
                logger.warn ("ICMP Packet Received!:-)");
                ICMP icmp = (ICMP) ipv4.getPayload();
                logger.warn ("icmp.getIcmpType: "+icmp.getIcmpType());

                //I will write codes for sending the message
                RFlag = 1;              
            }
        }

        return Command.CONTINUE;
    }

    class ThreadClass implements Runnable {

        ThreadClass(){};
        @Override
        public void run() {
            if (RFlag == 1) {
                //I will write codes for receiving the message          
            }
        }
    }
}

Для тех, кто не знаком с прожектором или мининетом, в этом модуле receive прослушивает сообщения, отправленные с коммутаторов (он прослушивает порт 6653 для c1, порт 7753 для c2).Поэтому в моей функции receive (), когда c1 получает сообщение от коммутатора, он отправляет сообщение на c2 и изменяет значение RFlag на 1.

У меня также есть поток в моем модуле (ThreadClass), который проверяет значение RFlag и, если RFlag = 1, этот поток будет реализовывать некоторые задачи как на c1, так и на c2.

Проблема заключается в том, что, поскольку значение RFlag изменяется, когда c1 получает сообщение, задачикоторый я определил в потоке, просто реализован в c1, а не в c2 (потому что c2 не получил сообщение и значение RFlag по-прежнему равно 0 для c2).

Итак, мой вопрос: как я могу изменить значение RFlag на 1 на с2, когда это значение меняется на 1 на с1?Возможно ли это?

...