diff --git a/src/core/JCALibrary.properties b/src/core/JCALibrary.properties index 90956df..ca4091b 100644 --- a/src/core/JCALibrary.properties +++ b/src/core/JCALibrary.properties @@ -8,4 +8,5 @@ com.cosylab.epics.caj.CAJContext.beacon_period = 15.0 com.cosylab.epics.caj.CAJContext.repeater_port = 5065 com.cosylab.epics.caj.CAJContext.server_port = 5064 com.cosylab.epics.caj.CAJContext.max_array_bytes = 16384 +com.cosylab.epics.caj.CAJContext.max_search_interval = 300 com.cosylab.epics.caj.impl.reactor.lf.LeaderFollowersThreadPool.thread_pool_size = 5 diff --git a/src/core/com/cosylab/epics/caj/CAJContext.java b/src/core/com/cosylab/epics/caj/CAJContext.java index e9fc7a7..82d45e5 100644 --- a/src/core/com/cosylab/epics/caj/CAJContext.java +++ b/src/core/com/cosylab/epics/caj/CAJContext.java @@ -178,6 +178,11 @@ public class CAJContext extends Context implements CAContext, CAJConstants, Conf */ protected int maxArrayBytes = 16384; + /** + * Maximum interval in seconds between CA search broadcasts. Default is 5 minutes. + */ + protected float maxSearchInterval = (float) 60.0 * 5; + /** * List of context message listeners. */ @@ -404,40 +409,43 @@ protected void loadConfiguration() String eventDispatcherClassName = null; final String thisClassName = this.getClass().getName(); - if (Boolean.getBoolean("jca.use_env")) - { - // Context default configuration - eventDispatcherClassName = jcaLibrary.getProperty( gov.aps.jca.Context.class.getName()+".event_dispatcher", eventDispatcherClassName ); - - String tmp = System.getenv("EPICS_CA_ADDR_LIST"); - if (tmp != null) addressList = tmp; - - tmp = System.getenv("EPICS_CA_AUTO_ADDR_LIST"); - if (tmp != null) - autoAddressList = !tmp.equalsIgnoreCase("NO"); - else - autoAddressList = true; - - tmp = System.getenv("EPICS_CA_NAME_SERVERS"); - if (tmp != null) nameServersList = tmp; - - tmp = System.getenv("EPICS_CA_CONN_TMO"); - if (tmp != null) connectionTimeout = Float.parseFloat(tmp); - - tmp = System.getenv("EPICS_CA_BEACON_PERIOD"); - if (tmp != null) beaconPeriod = Float.parseFloat(tmp); - - tmp = System.getenv("EPICS_CA_REPEATER_PORT"); - if (tmp != null) repeaterPort = Integer.parseInt(tmp); - - tmp = System.getenv("EPICS_CA_SERVER_PORT"); - if (tmp != null) serverPort = Integer.parseInt(tmp); - - tmp = System.getenv("EPICS_CA_MAX_ARRAY_BYTES"); - if (tmp != null) maxArrayBytes = Integer.parseInt(tmp); - } - else - { + if (Boolean.getBoolean("jca.use_env")) + { + // Context default configuration + eventDispatcherClassName = jcaLibrary.getProperty( gov.aps.jca.Context.class.getName()+".event_dispatcher", eventDispatcherClassName ); + + String tmp = System.getenv("EPICS_CA_ADDR_LIST"); + if (tmp != null) addressList = tmp; + + tmp = System.getenv("EPICS_CA_AUTO_ADDR_LIST"); + if (tmp != null) + autoAddressList = !tmp.equalsIgnoreCase("NO"); + else + autoAddressList = true; + + tmp = System.getenv("EPICS_CA_NAME_SERVERS"); + if (tmp != null) nameServersList = tmp; + + tmp = System.getenv("EPICS_CA_CONN_TMO"); + if (tmp != null) connectionTimeout = Float.parseFloat(tmp); + + tmp = System.getenv("EPICS_CA_BEACON_PERIOD"); + if (tmp != null) beaconPeriod = Float.parseFloat(tmp); + + tmp = System.getenv("EPICS_CA_REPEATER_PORT"); + if (tmp != null) repeaterPort = Integer.parseInt(tmp); + + tmp = System.getenv("EPICS_CA_SERVER_PORT"); + if (tmp != null) serverPort = Integer.parseInt(tmp); + + tmp = System.getenv("EPICS_CA_MAX_ARRAY_BYTES"); + if (tmp != null) maxArrayBytes = Integer.parseInt(tmp); + + tmp = System.getenv("EPICS_CA_MAX_SEARCH_PERIOD"); + if (tmp != null) maxSearchInterval = Float.parseFloat(tmp); + } + else + { // load default Context configuration final String contextClassName = Context.class.getName(); addressList = jcaLibrary.getProperty(contextClassName + ".addr_list", addressList); @@ -448,6 +456,7 @@ protected void loadConfiguration() repeaterPort = jcaLibrary.getPropertyAsInt(contextClassName + ".repeater_port", repeaterPort); serverPort = jcaLibrary.getPropertyAsInt(contextClassName + ".server_port", serverPort); maxArrayBytes = jcaLibrary.getPropertyAsInt(contextClassName + ".max_array_bytes", maxArrayBytes); + maxSearchInterval = jcaLibrary.getPropertyAsFloat(contextClassName + ".max_search_interval", maxSearchInterval); eventDispatcherClassName = jcaLibrary.getProperty(contextClassName + ".event_dispatcher"); // load CAJ specific configuration (overrides default) @@ -459,6 +468,7 @@ protected void loadConfiguration() repeaterPort = jcaLibrary.getPropertyAsInt(thisClassName + ".repeater_port", repeaterPort); serverPort = jcaLibrary.getPropertyAsInt(thisClassName + ".server_port", serverPort); maxArrayBytes = jcaLibrary.getPropertyAsInt(thisClassName + ".max_array_bytes", maxArrayBytes); + maxSearchInterval = jcaLibrary.getPropertyAsFloat(thisClassName + ".max_search_interval", maxSearchInterval); } eventDispatcherClassName = jcaLibrary.getProperty(thisClassName + ".event_dispatcher", eventDispatcherClassName); @@ -530,6 +540,13 @@ public void configure(Configuration configuration) maxArrayBytes = configuration.getAttributeAsInteger("max_array_bytes", maxArrayBytes); } + // max. search interval + try { + maxSearchInterval = configuration.getChild("max_search_interval", false).getValueAsFloat(); + } catch(Exception ex) { + maxSearchInterval = configuration.getAttributeAsFloat("max_search_interval", maxSearchInterval); + } + // event dispathcer Configuration conf = configuration.getChild("event_dispatcher", false); if (conf != null) @@ -1262,6 +1279,7 @@ public void printInfo(PrintStream out) throws IllegalStateException { out.println("REPEATER_PORT : " + repeaterPort); out.println("SERVER_PORT : " + serverPort); out.println("MAX_ARRAY_BYTES : " + maxArrayBytes); + out.println("MAX_SEARCH_INTERVAL : " + maxSearchInterval); out.println("EVENT_DISPATCHER: " + eventDispatcher); out.print("STATE : "); switch (state) @@ -1368,6 +1386,12 @@ public int getBroadcastPort() { return getServerPort(); } + /** + * Get max. search interval + * @return max. search interval + */ + public float getMaxSearchInterval() { return maxSearchInterval; } + /** * Get event dispatcher. * @return event dispatcher. diff --git a/src/core/com/cosylab/epics/caj/impl/ChannelSearchManager.java b/src/core/com/cosylab/epics/caj/impl/ChannelSearchManager.java index d730913..d10ce42 100644 --- a/src/core/com/cosylab/epics/caj/impl/ChannelSearchManager.java +++ b/src/core/com/cosylab/epics/caj/impl/ChannelSearchManager.java @@ -35,7 +35,6 @@ public class ChannelSearchManager { private final int intervalMultiplier; private static final int MIN_SEND_INTERVAL_MS_DEFAULT = 100; - private static final int MAX_SEND_INTERVAL_MS_DEFAULT = 30000; private static final int INTERVAL_MULTIPLIER_DEFAULT = 2; private static final int MESSAGE_COALESCENCE_TIME_MS = 3; @@ -194,7 +193,8 @@ public ChannelSearchManager(CAJContext context) this.context = context; minSendInterval = MIN_SEND_INTERVAL_MS_DEFAULT; - maxSendInterval = MAX_SEND_INTERVAL_MS_DEFAULT; + // Convert from seconds to milliseconds. + maxSendInterval = (long) (context.getMaxSearchInterval() * 1000); intervalMultiplier = INTERVAL_MULTIPLIER_DEFAULT; // create and initialize send buffer diff --git a/src/core/gov/aps/jca/JCALibrary.properties b/src/core/gov/aps/jca/JCALibrary.properties index 90956df..ca4091b 100644 --- a/src/core/gov/aps/jca/JCALibrary.properties +++ b/src/core/gov/aps/jca/JCALibrary.properties @@ -8,4 +8,5 @@ com.cosylab.epics.caj.CAJContext.beacon_period = 15.0 com.cosylab.epics.caj.CAJContext.repeater_port = 5065 com.cosylab.epics.caj.CAJContext.server_port = 5064 com.cosylab.epics.caj.CAJContext.max_array_bytes = 16384 +com.cosylab.epics.caj.CAJContext.max_search_interval = 300 com.cosylab.epics.caj.impl.reactor.lf.LeaderFollowersThreadPool.thread_pool_size = 5 diff --git a/test/com/cosylab/epics/caj/cas/test/JCALibrary.properties b/test/com/cosylab/epics/caj/cas/test/JCALibrary.properties index 90956df..ca4091b 100644 --- a/test/com/cosylab/epics/caj/cas/test/JCALibrary.properties +++ b/test/com/cosylab/epics/caj/cas/test/JCALibrary.properties @@ -8,4 +8,5 @@ com.cosylab.epics.caj.CAJContext.beacon_period = 15.0 com.cosylab.epics.caj.CAJContext.repeater_port = 5065 com.cosylab.epics.caj.CAJContext.server_port = 5064 com.cosylab.epics.caj.CAJContext.max_array_bytes = 16384 +com.cosylab.epics.caj.CAJContext.max_search_interval = 300 com.cosylab.epics.caj.impl.reactor.lf.LeaderFollowersThreadPool.thread_pool_size = 5