Page 1 of 3 123 LastLast
Results 1 to 10 of 22
  1. #1
    Senior Member
    Join Date
    Sep 2007
    Location
    des plaines
    Posts
    41
    What I am trying to do with this example is to modify it to the point that the code can listen to some port on the same computer and an external process will be writing to that port to provide data. AS the last, the LS will deliver data to my front-end. Can you please give me a few .net tips for such solution if it is all even possible?

    Thanks a lot.

  2. #2
    Administrator
    Join Date
    Jul 2006
    Location
    Milan
    Posts
    975
    Getting data from an external process is the usual scenario.
    However, you have to obey the Data Adapter interface, based on "subscribe" and "unsubscribe" to data "items". Hence, depending on the interface supplied by your external process, your Data Adapter may have more or less work to do.
    For a HelloWorld-like demo, you can read from your external process and forward each line through an "update" call for the "greetings" item.
    We have no .net specific tips, other than the remarks provided in the API documentation, available at http://www.lightstreamer.com/docs/ad...AdapterAPI.chm

  3. #3
    Senior Member
    Join Date
    Sep 2007
    Location
    des plaines
    Posts
    41
    Yes, I have gotten my modified HelloWord sample working. But what I need in reality is the following:
    I am going to have let's say 10 HelloWord like programs that are listening to 10 external processes to get data. Then I need LS to push data being collected from 10 adapters to the same html page. In order to achive that what I do? Just
    describing all 10 adapters in my ProxyHelloWorld\adapters.xml file and that's all?

    Thanks for all your hlep.

  4. #4
    Administrator
    Join Date
    Jul 2006
    Location
    Milan
    Posts
    975
    Defining multiple Data Adapters and sending all their data to a single client page is not possible at the moment, though it will become possible with the next release of the software.
    However, you can connect to all your external processes from a single Data Adapter and assign to each flow a different item name. Your client would be able to ask for all data by specifying all the item names, in a way similar to the StockList demo example provided in Lightstreamer package.

  5. #5
    Senior Member
    Join Date
    Sep 2007
    Location
    des plaines
    Posts
    41
    Alright, I uderstand.
    I want to show a code fragment from my modified Hello World:
    <script>
    /////////////////PushPage Configuration
    var debugAlerts = true;
    var remoteAlerts = false;

    var page = new PushPage();
    page.context.setDomain("ufandd.local");
    page.onEngineCreation = function(lsEngine) {
    lsEngine.connection.setLSHost("ufdcrdev0005.ufandd .local");
    lsEngine.connection.setLSPort(8080);
    lsEngine.context.setDebugAlertsOnClientError(debug Alerts);
    lsEngine.context.setRemoteAlertsOnClientError(remo teAlerts);

    lsEngine.connection.setAdapterName("PROXY_HELLOWOR LD");
    lsEngine.changeStatus("STREAMING");
    }
    page.bind();
    page.createEngine("HelloWorldApp", "LS", "SHARE_SESSION");

    var pushtable = new OverwriteTable(null, null, "MERGE");
    page.addTable(pushtable, "hellotable");
    pushtable.onItemUpdate =
    function(itemPos, updateInfo, itemName)
    {
    // send completed scan to the front-end
    alert(updateInfo.getNewValue(itemPos));
    serverData(updateInfo.getNewValue(itemPos));
    };
    </script>
    As you can see I am overriding onItemUpdate because I also want to send data to somewherre else. It works fine, sort of. For the very first time alert box will pop up only once (as expected), but next data update will trigger the alert box twice: first with an empty value, second with the real value.

    Can you tell me what am I doing wrong here?

    BTW, my adapter's console shows one value every time.

  6. #6
    Administrator
    Join Date
    Jul 2006
    Location
    Milan
    Posts
    975
    The snippet does not fully describe the test, because the
    new OverwriteTable(null, null, "MERGE");
    instruction asks the library to find all items and fields defined in the push cells, which are in the HTML part of the page.

    To get a better idea of the update flow, please show us a Server log taken after modifying the log configuration file, by setting the priority of the "LightstreamerLogger.subscriptions" and "LightstreamerLogger.pump" categories to DEBUG.

  7. #7
    Senior Member
    Join Date
    Sep 2007
    Location
    des plaines
    Posts
    41
    While I am working on that I have another question:
    Is it possible to hide these DIVs so they will not take any space on a page:
    <div source="lightstreamer" table="hellotable" item="greetings" field="message">loading...</div>
    <div source="lightstreamer" table="hellotable" item="greetings" field="timestamp">loading...</div>

    Thanks

  8. #8
    Power Member
    Join Date
    Jul 2006
    Location
    Cesano Maderno, Italy
    Posts
    784
    yes of course, you can set to their css the display:none value and then in the onChangingValues callback add such style to their hot and cold statuses:



    Btw note that if those are the only fields in your table (ie you don't want that LS shows any cells) you can use a NonVisualTable instead of the OverwriteTable:



    HTH.

  9. #9
    Senior Member
    Join Date
    Sep 2007
    Location
    des plaines
    Posts
    41
    Here is my latest code. I understand that you are not supporting .Net but still maybe you can give me a hint:

    using System.Collections;
    using System.Threading;
    using System;
    using System.Runtime.InteropServices;
    using Lightstreamer.Interfaces.Data;
    using System.Windows.Forms;

    public class SocketToLightStreamer : IDataProvider
    {
    private IItemEventListener _listener;
    public void Init(IDictionary parameters, string configFile)
    {
    }

    public bool IsSnapshotAvailable(string itemName)
    {
    return false;
    }

    public void SetListener(IItemEventListener eventListener)
    {
    _listener = eventListener;
    }
    public void Subscribe(string itemName)
    {
    if (itemName.Equals("floorupdate"))
    {
    }
    }

    public void Unsubscribe(string itemName)
    {
    if (itemName.Equals("floorupdate"))
    {
    }
    }
    public void PushData(string data)
    {
    IDictionary eventData = new Hashtable();
    eventData["scan"] = data;
    _listener.Update("floorupdate", eventData, false);
    }
    public class GetMessage : Form
    {
    const int WM_COPYDATA = 0x004a;

    public GetMessage()
    {
    Text = "my_unique_id";
    }

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
    switch (m.Msg)
    {
    case WM_COPYDATA:
    COPYDATASTRUCT mystr = new COPYDATASTRUCT();
    Type mytype = mystr.GetType();
    mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
    IDictionary eventData = new Hashtable();
    eventData["scan"] = mystr.Data;
    SocketToLightStreamer a = new SocketToLightStreamer();
    a._listener.Update("floorupdate", eventData, false);
    break;
    }
    base.WndProc(ref m);
    }
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct COPYDATASTRUCT
    {
    public Int32 ID;
    public int Length;
    public string Data;
    }
    }
    While this code is compiling fine when I run it I get:
    "null reference" at a._listener.Update("floorupdate", eventData, false);
    Wold you suggest to how to have a form inside of SocketToLightStreamer class in a way that I could access _listener object from it?

    Thanks for the hep.

  10. #10
    Administrator
    Join Date
    Jul 2006
    Location
    Milan
    Posts
    975
    The SocketToLightStreamer class should not be instantiated directly.
    Exactly one object of this class is internally created by the Lightstreamer Remote Adapter Library.
    If you get data from outside code, as your GetMessage class seems to be, you should be able to access that object.

    Usually, the Data Adapter class starts the feed in "Init" and asks it for data in "Subscribe". There, it can send its own reference to the feed.
    This is not your case, as you feed data regardless of the subscription requests
    (note that any updates you send while no subscription is active will be lost).

    What you could do, for instance, is have your SocketToLightStreamer object assign itself to a static pointer that can be eventually consulted in GetMessage.
    Note that the best place to assign the pointer is after setting the listener in "SetListener".
    Also note that synchronization issues may need to be considered.

 

 

Similar Threads

  1. Database Feed
    By mode_vigilante in forum Adapter APIs
    Replies: 16
    Last Post: January 27th, 2012, 04:58 PM
  2. .NET web service as Data Feed
    By icaiozzi in forum Adapter APIs
    Replies: 1
    Last Post: November 19th, 2010, 12:52 PM
  3. How to deploy on an external Web Server?
    By AndyKelly in forum Client APIs
    Replies: 1
    Last Post: July 7th, 2010, 11:50 AM
  4. How And Where To Specify Database As Data Feed?
    By devidasan in forum Adapter APIs
    Replies: 1
    Last Post: March 17th, 2009, 12:00 PM
  5. External deployment
    By markgoldin in forum General
    Replies: 6
    Last Post: September 28th, 2007, 02:15 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
All times are GMT +1. The time now is 12:42 AM.