All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cosylab.epics.caj.impl.CAJNameClient Maven / Gradle / Ivy

Go to download

JCA is an EPICS Channel Access library for Java. For more information concerning EPICS or Channel Access please refer to the <a href="http://www.aps.anl.gov/epics">EPICS Web pages</a> or read the <a href="http://www.aps.anl.gov/epics/base/R3-14/8-docs/CAref.html">Channel Access manual (3.14)</a>. <p>This module also includes CAJ, A 100% pure Java implementation of the EPICS Channel Access library.</p>

There is a newer version: 2.4.10
Show newest version
package com.cosylab.epics.caj.impl;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.util.logging.Logger;

import com.cosylab.epics.caj.CAJContext;
import com.cosylab.epics.caj.impl.requests.VersionRequest;
import com.cosylab.epics.caj.util.Timer;
import com.cosylab.epics.caj.util.Timer.TimerRunnable;

public class CAJNameClient implements TransportClient, TimerRunnable, Request {
	Logger log = Logger.getLogger(CAJNameClient.class.getName());
	
	final CAJContext context;
	final InetSocketAddress addr;
	Transport transport;
	Object reconnect;
	public final ByteBuffer sendBuffer = ByteBuffer.allocateDirect(CAConstants.MAX_UDP_SEND);

	public CAJNameClient(CAJContext ctxt, InetSocketAddress ep) {
		context = ctxt;
		addr = ep;
		initBuffer();
	}

	public void initBuffer() {
		sendBuffer.clear();
	}
	
	public void connect() {
		// initially give minor version=0, the allow client to replace when Version message is received
		Transport trn = context.getTransport(this, addr, (short)0, (short)0);
		if(trn!=null) {
			transport = trn;
			log.fine("Connected to name server "+addr.toString());
		} else {
			transportClosed(); // retry later
		}
	}

	public void cancel() {
		Object recon = reconnect;
		if(recon!=null)
			Timer.cancel(recon);
	}

	// from TimerRunnable	
	
	@Override
	public void timeout(long timeToRun) {
		reconnect = null;
		connect();
	}

	// from TransportClient
	
	@Override
	public void transportUnresponsive() {}

	@Override
	public void transportResponsive(Transport transport) {}

	@Override
	public void transportChanged() {}

	@Override
	public void transportClosed() {
		transport = null;
		//TODO: exponential backoff on retry
		reconnect = context.getTimer().executeAfterDelay(10000, this);
		log.fine("Lost connection to name server "+addr.toString());
	}

	// from Request
	
	@Override
	public byte getPriority() {
		// search requests have low priority
		return Request.MIN_USER_PRIORITY;
	}

	@Override
	public ByteBuffer getRequestMessage() {
		return sendBuffer;
	}

	@Override
	public void submit() throws IOException {
		Transport trn = transport;
		if(trn!=null) {
			trn.submit(this);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy