<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style>
</head>
<body class='hmmessage'><div dir='ltr'>
Sometimes answers come up when after you posted a question.<br><br>In this case the simple answer is to pass the instance to all relevant classes:<br><br>In the main code:<br>...<br>final DiscardServerHandler serverHandler = new DiscardServerHandler();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bootstrap.setPipelineFactory(new ChannelPipelineFactory() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ChannelPipeline getPipeline() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Channels.pipeline(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; new BasicFrameDecoder()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ,<b>serverHandler </b>);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>...<br>Thread thread = new MainLoopThread( <b>serverHandler </b>);<br>...<br><br>and then:<br><br>public class MainLoopThread extends Thread {<br>&nbsp;&nbsp;&nbsp; // This method is called when the thread runs<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; private Timer timer;<br>&nbsp;&nbsp;&nbsp; private int seconds = 1;<br>&nbsp;&nbsp;&nbsp; private DiscardServerHandler _handler;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public MainLoopThread( DiscardServerHandler handler) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Thread MainLoop: constructor.");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; _handler = handler;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public void run() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Thread MainLoop started.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer = new Timer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.schedule(new RemindTask( _handler ), 0, seconds * 1000);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>...<br><br>class RemindTask extends TimerTask {<br>&nbsp;&nbsp;&nbsp; private int iterations = 0;<br>&nbsp;&nbsp;&nbsp; private DiscardServerHandler handler;<br>&nbsp;&nbsp;&nbsp; private Utils utils = new Utils();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public RemindTask(DiscardServerHandler referenceToHandler) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("RemindTask: constructor."); <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; handler = referenceToHandler;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public void run() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.print((char)13 + "Timer [" + iterations + "]");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; broadCast();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; private void broadCast() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; iterations++;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int totalChannels = 0; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for ( Channel c: handler.getChannels() ) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Channel " + totalChannels);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; totalChannels++;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // c.write( )<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>...<br><br>Very likely this is 101 for most, hope it can help others.<br><br><br><div><hr id="stopSpelling">From: m4io@hotmail.com<br>To: netty-users@lists.jboss.org<br>Subject: how to write to channels periodically<br>Date: Tue, 5 Jul 2011 10:23:36 +0200<br><br>

<meta http-equiv="Content-Type" content="text/html; charset=unicode">
<meta name="Generator" content="Microsoft SafeHTML">
<style>
.ExternalClass .ecxhmmessage P
{padding:0px;}
.ExternalClass body.ecxhmmessage
{font-size:10pt;font-family:Tahoma;}

</style>

<div dir="ltr">
Hi,<br><br>I want to run some main-thread on the server which periodically checks something, later this will be some watchdog-process.<br><br>How can I reach all channels from that main thread ? <br><br>Snippets:<br><br>....<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bootstrap.setPipelineFactory(new ChannelPipelineFactory() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ChannelPipeline getPipeline() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Channels.pipeline(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; new BasicFrameDecoder()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ,new DiscardServerHandler());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bootstrap.setOption("child.tcpNoDelay", true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bootstrap.setOption("child.keepAlive", true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("Binding to " + host + ":" + port + ".\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bootstrap.bind(new InetSocketAddress(host, port));<br>&nbsp;&nbsp;&nbsp;&nbsp; // Create and start the thread<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread thread = new MainLoopThread();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thread.start();<br>....<br><br>///////////////<br><br>public class MainLoopThread extends Thread {<br>&nbsp;&nbsp;&nbsp; // This method is called when the thread runs<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; private Timer timer;<br>&nbsp;&nbsp;&nbsp; private int seconds = 3;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public void run() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Thread MainLoop started.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer = new Timer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.schedule(new RemindTask(), seconds * 1000);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>///////////////<br><br>class RemindTask extends TimerTask {<br>&nbsp;&nbsp;&nbsp; private int iterations = 0;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public void run() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Timer [" + iterations + "]");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; iterations++;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // how to reach the channels of the connected users ?<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}<br><br>As you can see the RemindTask wants to reach the channels.<br><br><br>In my ServerHandler I keep track of the channels like this:<br><br>static final ChannelGroup channels = new DefaultChannelGroup();<br><br>And the channelConnected event adds a channel to that group and the channelDisconnected event removes it.<br><br>How do I access the ChannelGroup from my thread ? I can't just instantiate the ServerHandler again from my TimerTask and then call some public method of the ServerHandler ? <br><br>Thanks in advance!<br><br><br>                                               </div>
<br>_______________________________________________
netty-users mailing list
netty-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/netty-users</div>                                               </div></body>
</html>