ROS DefaultNode 监听器的注册和执行
来源:互联网 发布:淘宝新店怎么刷评价 编辑:程序博客网 时间:2024/06/16 16:23
/***************监听器包EventDispatcher 然后交注册进事件分配器中******************/ public DefaultNode(NodeConfiguration nodeConfiguration, Collection<NodeListener> nodeListeners, ScheduledExecutorService scheduledExecutorService) { this.nodeConfiguration = NodeConfiguration.copyOf(nodeConfiguration);//建立DefaultNode监听事件链表 this.nodeListeners = new ListenerGroup<NodeListener>(scheduledExecutorService); //将监听事件注册到链表中this.nodeListeners.addAll(nodeListeners); this.scheduledExecutorService = scheduledExecutorService; masterUri = nodeConfiguration.getMasterUri(); masterClient = new MasterClient(masterUri); topicParticipantManager = new TopicParticipantManager(); serviceManager = new ServiceManager(); parameterManager = new ParameterManager(scheduledExecutorService); GraphName basename = nodeConfiguration.getNodeName(); NameResolver parentResolver = nodeConfiguration.getParentResolver(); nodeName = parentResolver.getNamespace().join(basename); resolver = new NodeNameResolver(nodeName, parentResolver); slaveServer = new SlaveServer(nodeName, nodeConfiguration.getTcpRosBindAddress(), nodeConfiguration.getTcpRosAdvertiseAddress(), nodeConfiguration.getXmlRpcBindAddress(), nodeConfiguration.getXmlRpcAdvertiseAddress(), masterClient, topicParticipantManager, serviceManager, parameterManager, scheduledExecutorService); slaveServer.start(); NodeIdentifier nodeIdentifier = slaveServer.toNodeIdentifier(); parameterTree = DefaultParameterTree.newFromNodeIdentifier(nodeIdentifier, masterClient.getRemoteUri(), resolver, parameterManager); publisherFactory = new PublisherFactory(nodeIdentifier, topicParticipantManager, nodeConfiguration.getTopicMessageFactory(), scheduledExecutorService); subscriberFactory = new SubscriberFactory(nodeIdentifier, topicParticipantManager, scheduledExecutorService); serviceFactory = new ServiceFactory(nodeName, slaveServer, serviceManager, scheduledExecutorService); registrar = new Registrar(masterClient, scheduledExecutorService); topicParticipantManager.setListener(registrar); serviceManager.setListener(registrar); scheduledExecutorService.execute(new Runnable() { @Override public void run() { start(); } }); } private void start() { // The Registrar must be started first so that master registration is // possible during startup. registrar.start(slaveServer.toNodeIdentifier()); // During startup, we wait for 1) the RosoutLogger and 2) the TimeProvider. final CountDownLatch latch = new CountDownLatch(2); log = new RosoutLogger(this); log.getPublisher().addListener(new DefaultPublisherListener<rosgraph_msgs.Log>() { @Override public void onMasterRegistrationSuccess(Publisher<rosgraph_msgs.Log> registrant) { latch.countDown(); } }); boolean useSimTime = false; try { useSimTime = parameterTree.has(Parameters.USE_SIM_TIME) && parameterTree.getBoolean(Parameters.USE_SIM_TIME); } catch (Exception e) { signalOnError(e); } if (useSimTime) { ClockTopicTimeProvider clockTopicTimeProvider = new ClockTopicTimeProvider(this); clockTopicTimeProvider.getSubscriber().addSubscriberListener( new DefaultSubscriberListener<rosgraph_msgs.Clock>() { @Override public void onMasterRegistrationSuccess(Subscriber<rosgraph_msgs.Clock> subscriber) { latch.countDown(); } }); timeProvider = clockTopicTimeProvider; } else { timeProvider = nodeConfiguration.getTimeProvider(); latch.countDown(); } try { latch.await(); } catch (InterruptedException e) { signalOnError(e); shutdown(); return; } //向事件监听ListenerGroup注册监听事件 signalOnStart(); } /** * SignalRunnable all {@link NodeListener}s that the {@link Node} has started. * <p> * Each listener is called in a separate thread. */ /* 任务链结构| nodeListener1—————————————nodeListener2——————————————nodeListener3------------||注册任务1_1 | ||注册任务2_1 | ||注册任务3_1 | ||注册任务4_1 | | |注册任务1_2 ||注册任务2_2 ||注册任务3_2 ||注册任务4_2 | |注册任务1_3 |注册任务2_3 |注册任务3_3 |注册任务4_3 */ private void signalOnStart() { //注册参数 DefaultNode : connectedNode final ConnectedNode connectedNode = this; //监听任务链 中的每个监听任务 注册SignalRunnable 任务 nodeListeners.signal(new SignalRunnable<NodeListener>() { @Override public void run(NodeListener listener) { listener.onStart(connectedNode); } }); } /***************监听器运行******************/ public Collection<EventDispatcher<T>> addAll(Collection<T> listeners, int limit) { Collection<EventDispatcher<T>> eventDispatchers = Lists.newArrayList(); for (T listener : listeners) { eventDispatchers.add(add(listener, limit)); // 注册监听器,并且执行监听 } return eventDispatchers; } public EventDispatcher<T> add(T listener, int queueCapacity) { EventDispatcher<T> eventDispatcher = new EventDispatcher<T>(listener, queueCapacity); eventDispatchers.add(eventDispatcher); //注册监听 executorService.execute(eventDispatcher); //执行监听 return eventDispatcher; }
0 0
- ROS DefaultNode 监听器的注册和执行
- Oracle9i的监听器动态注册
- 监听器的动态注册与静态注册
- java拦截器,过滤器,监听器的区别和执行顺序
- java拦截器,过滤器,监听器的区别和执行顺序
- 拦截器和过滤器监听器的区别执行顺序
- HttpSession监听器的执行顺序
- Oracle监听器静态注册和动态注册总结
- 给按钮注册监听器的另类方法
- 取消注册通知监听器的原因
- Oracle监听器的静态注册与动态注册
- activiti全局的监听器和链接监听器
- LINUX信号注册和执行
- 关于事件监听器的执行过程
- 监听器开始线程执行的方法
- 问题和解决 ROS节点的不可执行(线程退出)
- JComboBox注册KeyListener监听器
- 注册时钟事件监听器
- [高扩展的诀窍] -- 细粒度设计,只做一件事
- android自定义TextView(一)
- struts2之注解权限控制
- POJ-1200 Crazy Search,人生第一道hash题!
- hive select join
- ROS DefaultNode 监听器的注册和执行
- linux-shell命令之cat【输出档案内容】
- 使用runtime 实现weex 跳转原生页面
- Android 5.0后Material design icons(金属设计风格图标大全)及如何使用
- Linux服务器挂载磁盘
- linux-shell命令之cp(copy)【拷贝复制】
- java高并发解决方案
- 168. Excel Sheet Column Title
- HTML标签-表单标签