{"data":{"markdownRemark":{"html":"<p>To output a simple field at every tick (timestep), and be able to display these fields on the console, or output to parquet files, use the annotation @Variable as described in <a href=\":version/reference/data_management/outputting_data\">Outputting Data</a>]. Many times the data being produced by the model is more complex than a simple value that needs to be output at every tick. For example, you may need to output a specific field every time a certain event takes place, or you may need to output a more complex object. In these cases, data output channels can be used to output different types of data easily to parquet.</p>\n<h2 id=\"creating-an-output-channel\"><a href=\"#creating-an-output-channel\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Creating an output channel</h2>\n<p>Output channels need to be created as part of the model initialisation (<a href=\":version/reference/modelling/model-initialisation\">more about model initialisation here</a>). </p>\n<p>Channel creation and management is done via the model context. Create a new channel with the following code. </p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  <span class=\"token annotation punctuation\">@Override</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">getChannels</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">createOutputChannel</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">setId</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"channel unique id\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">setSchema</span><span class=\"token punctuation\">(</span><span class=\"token function\">getSpecificChannelSchema</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">addLabel</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"simudyne:parquet\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Other init code</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li><code class=\"language-text\">setId()</code> -> This is required, and should be a unique string. This will be useful later for retreiving the channel.</li>\n<li><code class=\"language-text\">setSchema()</code> -> This is required. The schema defines the type of data you will be exporting with this channel. It is very important that the schema defined here matches the data you will export on this channel, to avoid errors later. See below for how to define this schema.</li>\n<li><code class=\"language-text\">addLabel()</code> -> This can be used multiple times to add as many labels as you need to. Labels can be used as personal identifiers for channels. The Simudyne SDK will only output the data written to this channel to parquet if the label 'simudyne:parquet' is added to the channel. </li>\n<li><code class=\"language-text\">build()</code> -> This is the final method that needs to be called otherwise the channel will not be created.</li>\n</ul>\n<h2 id=\"defining-the-schema\"><a href=\"#defining-the-schema\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Defining the schema</h2>\n<p>Schema definition is vital for having the channel work as expected. Simudyne SDK schema definition uses the following types:</p>\n<ul>\n<li><code class=\"language-text\">SchemaRecord</code> -> This is used for complex values - a field that will hold nested fields. <code class=\"language-text\">SchemaRecord</code> needs a name and a list of 'children' - subfields under this record. There are also optional metadata fields that can be set.</li>\n<li><code class=\"language-text\">SchemaField</code> -> This is used for simple values. A SchemaField needs a name and a field type (Boolean, Int, Long etc). There are also optional metadata fields that can be set.</li>\n<li><code class=\"language-text\">SchemaArray</code> -> This is used for fields that will hold multiple values. The array can be an array of simple values (SchemaFields) or an array of complex values (SchemaRecords). <code class=\"language-text\">SchemaArray</code> needs a name and a an item type, which is the type of data the array will hold. Accepted data types are <code class=\"language-text\">SchemaRecord</code>, <code class=\"language-text\">SchemaField</code>, <code class=\"language-text\">SchemaEnum</code> or <code class=\"language-text\">SchemaArray</code> for a nested array. There are also optional metadata fields that can be set.</li>\n<li><code class=\"language-text\">SchemaEnum</code> -> This is used for a field whose value will always be one of a known set of strings. A SchemaEnum needs a name and a list of possible strings that can be used for this field. There are also optional metadata fields that can be set.</li>\n</ul>\n<p>The schema for a channel must be a SchemaRecord. For example, to output data that may look like this in parquet:</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">  id        | name     | price   | quantity |  usedFor             | supplier\n  -----------------------------------------------------------------------------\n  &quot;123-456&quot; | apples   | 2.39    | 345      | [&quot;crumble&quot;, &quot;pie&quot;]   | &quot;x-company&quot;\n  &quot;123-457&quot; | apples   | 2.9     | 445      | [&quot;crumble&quot;, &quot;pie&quot;]   | &quot;y-company&quot;\n  &quot;123-550&quot; | avocados | 3.18    | 287      | [&quot;guacamole&quot;]        | &quot;y-company&quot;\n  </code></pre></div>\n<p>Create a schema as follows :</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaRecord</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Food prices\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"id\"</span><span class=\"token punctuation\">,</span> FieldType<span class=\"token punctuation\">.</span>String<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"name\"</span><span class=\"token punctuation\">,</span> FieldType<span class=\"token punctuation\">.</span>String<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"price\"</span><span class=\"token punctuation\">,</span> FieldType<span class=\"token punctuation\">.</span>Double<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"quantity\"</span><span class=\"token punctuation\">,</span> FieldType<span class=\"token punctuation\">.</span>Long<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaArray</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token string\">\"usedFor\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> FieldType<span class=\"token punctuation\">.</span>String<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> Subtype<span class=\"token punctuation\">.</span>None<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">SchemaEnum</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"supplier\"</span><span class=\"token punctuation\">,</span> Arrays<span class=\"token punctuation\">.</span><span class=\"token function\">asList</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"x-company\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"y-company\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"sending-data-to-the-output-channels\"><a href=\"#sending-data-to-the-output-channels\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Sending data to the output channels</h2>\n<p>It is possible to write to channels from the model, and from the agents. Use the id of the channels to get the specific channel to write to. </p>\n<p>The following example writes an entry to the channel for every OrderPlaced message it recieves.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token function\">getMessagesOfType</span><span class=\"token punctuation\">(</span>OrderPlaced<span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>\n      order <span class=\"token operator\">-</span><span class=\"token operator\">></span> \n        <span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getChannels</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">.</span><span class=\"token function\">getOutputChannelWriterById</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"channel unique id\"</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">.</span><span class=\"token function\">write</span><span class=\"token punctuation\">(</span><span class=\"token function\">getSpecificValueRecord</span><span class=\"token punctuation\">(</span>order<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"creating-value-record-objects-to-write-to-channels\"><a href=\"#creating-value-record-objects-to-write-to-channels\" aria-hidden=\"true\" class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Creating value record objects to write to channels</h2>\n<p>Simudyne SDK value definition uses the following types:</p>\n<ul>\n<li><code class=\"language-text\">ValueRecord</code> </li>\n<li><code class=\"language-text\">ValueField</code> </li>\n<li><code class=\"language-text\">ValueArray</code> </li>\n</ul>\n<p>These objects directly correspond to the Schema objects mentioned above. When creating the value for a field where the schema is <code class=\"language-text\">SchemaEnum</code>, <code class=\"language-text\">ValueField</code> should be used.</p>\n<p>The example below creates a single row to write, matching the schema above.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token keyword\">new</span> <span class=\"token class-name\">ValueRecord</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Food prices\"</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">addField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"id\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"123-456\"</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">addField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"name\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"apples\"</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">addField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"price\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2.39</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">addField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"quantity\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">345</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">ValueArray</span><span class=\"token operator\">&lt;</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span><span class=\"token string\">\"userFor\"</span><span class=\"token punctuation\">,</span> \n        Arrays<span class=\"token punctuation\">.</span><span class=\"token function\">asList</span><span class=\"token punctuation\">(</span>ValueField<span class=\"token punctuation\">.</span><span class=\"token function\">make</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"crumble\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> ValueField<span class=\"token punctuation\">.</span><span class=\"token function\">make</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"pie\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">.</span><span class=\"token function\">addField</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"supplier\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"x-company\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<div class=\"ui segment info message\">\n  <h4>Accessing channels from the agents</h4>\n  Calling `getContext()` from inside an agent will return an `AgentContext` object which gives a limited view onto the ModelContext and Channels. This is because Agents are only able to retreive channels, not create channels. \n</div>","headings":[{"value":"Creating an output channel","depth":2},{"value":"Defining the schema","depth":2},{"value":"Sending data to the output channels","depth":2},{"value":"Creating value record objects to write to channels","depth":2}],"frontmatter":{"title":"Output Channels","toc":null,"experimental":null}},"site":{"siteMetadata":{"title":"Simudyne Docs","latestVersion":"2.6"}}},"pageContext":{"absolutePath":"/home/vsts/work/1/s/content/2.6/reference/data_management/channels.md","versioned":false,"version":"2.6","kind":"reference","pagePath":"/reference/data_management/channels","chronology":{"prev":{"name":"Time Series Variables","path":"/reference/data_management/time_series"},"next":{"name":"Avro Schema","path":"/reference/data_management/avro"}},"lastUpdated":"2026-04-21T13:56:54.868Z"}}