[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [xmlblaster] bug in multiple (parallel) connections
Marcel,
thanks, creating connections via a dedicated Global seemed to have
solved the problem. I recommend adding documentation about this into
the code stating that
XmlBlasterConnection (String[] args)
and
XmlBlasterConnection (Global glob)
don't have equaly semantics.
It would be great if you could also change the String[] constructor to be
in line with the one that uses Globals.
Michael
On Mon, Feb 24, 2003 at 12:33:14PM +0100, Marcel Ruff wrote:
> Michael Atighetchi wrote:
> >A problem with multiple connection shows up in the following code,
> >which sets up IOR, SOCKET, XML-RPC, and RMI connections:
>
> Hi Michael,
>
> i believe the problem you experience is related
> to using the same Global instance for each connection.
>
> Please use the XmlBlasterConnection(Global glob)
> constructor to pass a unique Global instance, e.g.
>
> ...
> Global glob = new Global(conargs, true, false);
> XmlBlasterConnection con = new XmlBlasterConnection(glob);
> ...
>
> I have attached an example file,
>
> regards,
>
> Marcel
> >
> > XmlBlasterConnection con_corba_;
> > XmlBlasterConnection con_xmlrpc_;
> > XmlBlasterConnection con_socket_;
> > XmlBlasterConnection con_rmi_;
> >
> >
> > String[] conargs = new String[4];
> > String ip = prop.getProperty("ap1_ip");
> >
> > conargs[0]="-client.protocol";
> > conargs[1]="IOR";
> > conargs[2]="-ior.file";
> > conargs[3]="djmproxy1.ior";
> > con_corba_ = new XmlBlasterConnection (conargs);
> >
> > conargs = new String[6];
> > conargs[0]="-client.protocol";
> > conargs[1]="SOCKET";
> > conargs[2]="-socket.hostname";
> > conargs[3]=ip;
> > conargs[4]="-socket.port";
> > conargs[5]=prop.getProperty("ap1_socket");
> > con_socket_ = new XmlBlasterConnection (conargs);
> >
> > conargs[1]="XML-RPC";
> > conargs[2]="-xmlrpc.hostname";
> > conargs[3]=ip;
> > conargs[4]="-xmlrpc.port";
> > conargs[5]=prop.getProperty("ap1_xmlrpc");
> > con_xmlrpc_ = new XmlBlasterConnection (conargs);
> >
> > conargs[1]="RMI";
> > conargs[2]="-rmi.hostname";
> > conargs[3]=ip;
> > conargs[4]="-rmi.registryPort";
> > conargs[5]=prop.getProperty("ap1_rmi");
> > con_rmi_ = new XmlBlasterConnection (conargs);
> >
> >
> > XmlBlasterConnection con = con_xmlrpc_;
> > con.connect (connectQos, null)
> > con.publish (...)
> >
> >The strage thing is that the log printout from the client indicates
> >that the RMI connection is being setup, and a trace with tethereal
> >confirmed that RMI traffic goes out of the client when it publishes
> >messages. Switching the order of the last two connection
> >initializations to
> >
> > conargs[1]="RMI";
> > conargs[2]="-rmi.hostname";
> > conargs[3]=ip;
> > conargs[4]="-rmi.registryPort";
> > conargs[5]=prop.getProperty("ap1_rmi");
> > con_rmi_ = new XmlBlasterConnection (conargs);
> >
> > conargs[1]="XML-RPC";
> > conargs[2]="-xmlrpc.hostname";
> > conargs[3]=ip;
> > conargs[4]="-xmlrpc.port";
> > conargs[5]=prop.getProperty("ap1_xmlrpc");
> > con_xmlrpc_ = new XmlBlasterConnection (conargs);
> >
> >
> > XmlBlasterConnection con = con_xmlrpc_;
> > con.connect (connectQos, null)
> > con.publish (...)
> >
> >seems to have the effect that now the XML_RPC connection is being
> >used.
> >
> >Overall, it seems that multiple connections cannot be used in
> >parallel, although this is what I need.
> >
> >Comments ?
> >
> >
> >
> >
> >
>
> // xmlBlaster/demo/javaclients/AllProtocols.java
> package javaclients;
>
> import org.jutils.log.LogChannel;
> import org.xmlBlaster.util.Global;
> import org.xmlBlaster.util.MsgUnit;
> import org.xmlBlaster.util.XmlBlasterException;
> import org.xmlBlaster.client.qos.ConnectQos;
> import org.xmlBlaster.client.qos.ConnectReturnQos;
> import org.xmlBlaster.client.qos.DisconnectQos;
> import org.xmlBlaster.client.I_Callback;
> import org.xmlBlaster.client.key.UpdateKey;
> import org.xmlBlaster.client.key.PublishKey;
> import org.xmlBlaster.client.key.GetKey;
> import org.xmlBlaster.client.key.SubscribeKey;
> import org.xmlBlaster.client.key.UnSubscribeKey;
> import org.xmlBlaster.client.key.EraseKey;
> import org.xmlBlaster.client.qos.GetQos;
> import org.xmlBlaster.client.qos.GetReturnQos;
> import org.xmlBlaster.client.qos.PublishQos;
> import org.xmlBlaster.client.qos.PublishReturnQos;
> import org.xmlBlaster.client.qos.UpdateQos;
> import org.xmlBlaster.client.qos.UpdateReturnQos;
> import org.xmlBlaster.client.qos.SubscribeQos;
> import org.xmlBlaster.client.qos.SubscribeReturnQos;
> import org.xmlBlaster.client.qos.EraseQos;
> import org.xmlBlaster.client.qos.EraseReturnQos;
> import org.xmlBlaster.client.qos.UnSubscribeQos;
> import org.xmlBlaster.client.qos.UnSubscribeReturnQos;
> import org.xmlBlaster.client.protocol.XmlBlasterConnection;
>
>
> /**
> * This client connects to xmlBlaster and invokes all available methods.
> * <p />
> * We use java client helper classes to generate the raw xml strings, e.g.:
> * <pre>
> * PublishKey pk = new PublishKey(glob, "AllProtocols", "text/xml");
> *
> * generates:
> *
> * <key oid='AllProtocols' contentMime='text/xml'/>
> * </pre>
> *
> * Invoke: java javaclients.AllProtocols
> * <p />
> * Invoke: java javaclients.AllProtocols -session.name joe -passwd secret
> * at see <a href="http://www.xmlBlaster.org/xmlBlaster/doc/requirements/interface.html" target="others">xmlBlaster interface</a>
> */
> public class AllProtocols implements I_Callback
> {
> private String ME = "";
> private final Global glob;
> private final LogChannel log;
> private final String[] argsIOR = {
> "-client.protocol",
> "IOR",
> };
> private final String[] argsSocket = {
> "-client.protocol",
> "SOCKET",
> };
> private final String[] argsXmlRpc = {
> "-client.protocol",
> "XML-RPC",
> };
> private final String[] argsRmi = {
> "-client.protocol",
> "RMI",
> };
> private final Con[] conList = {
> new Con(argsIOR, "IOR connection"),
> new Con(argsSocket, "SOCKET connection"),
> new Con(argsXmlRpc, "XML-RPC connection"),
> new Con(argsRmi, "RMI connection")
> };
>
> public AllProtocols(Global glob) {
> this.glob = glob;
> this.log = glob.getLog(null);
> for(int i=0; i<conList.length; i++) {
> ME = conList[i].helpText;
> try {
> conList[i].con = new XmlBlasterConnection(conList[i].glob);
> XmlBlasterConnection con = conList[i].con;
>
> // Check if other login name or password was given on command line:
> // (This is redundant as it is done by ConnectQos already)
> String name = glob.getProperty().get("session.name", "AllProtocols");
> String passwd = glob.getProperty().get("passwd", "secret");
>
> ConnectQos qos = new ConnectQos(glob, name, passwd);
> con.connect(qos, this); // Login to xmlBlaster, register for updates
>
>
> PublishKey pk = new PublishKey(glob, "AllProtocols", "text/xml", "1.0");
> pk.setClientTags("<org.xmlBlaster><demo/></org.xmlBlaster>");
> PublishQos pq = new PublishQos(glob);
> MsgUnit msgUnit = new MsgUnit(glob, pk, "Hi", pq);
> con.publish(msgUnit);
>
>
> GetKey gk = new GetKey(glob, "AllProtocols");
> GetQos gq = new GetQos(glob);
> MsgUnit[] msgs = con.get(gk.toXml(), gq.toXml());
> GetReturnQos grq = new GetReturnQos(glob, msgs[0].getQos());
>
> log.info(ME, "Accessed xmlBlaster message with content '" + new String(msgs[0].getContent()) +
> "' and status=" + grq.getState());
>
>
> SubscribeKey sk = new SubscribeKey(glob, "AllProtocols");
> SubscribeQos sq = new SubscribeQos(glob);
> SubscribeReturnQos subRet = con.subscribe(sk.toXml(), sq.toXml());
>
>
> msgUnit = new MsgUnit(glob, pk, "Ho".getBytes(), pq);
> PublishReturnQos prq = con.publish(msgUnit);
>
> log.info(ME, "Got status='" + prq.getState() + "' for published message '" + prq.getKeyOid());
>
> try { Thread.currentThread().sleep(1000); }
> catch( InterruptedException ie) {} // wait a second to receive update()
>
>
> UnSubscribeKey uk = new UnSubscribeKey(glob, subRet.getSubscriptionId());
> UnSubscribeQos uq = new UnSubscribeQos(glob);
> UnSubscribeReturnQos[] urq = con.unSubscribe(uk.toXml(), uq.toXml());
>
> EraseKey ek = new EraseKey(glob, "AllProtocols");
> EraseQos eq = new EraseQos(glob);
> EraseReturnQos[] eraseArr = con.erase(ek.toXml(), eq.toXml());
>
> DisconnectQos dq = new DisconnectQos(glob);
> con.disconnect(dq);
> }
> catch (XmlBlasterException e) {
> log.error(ME, e.getMessage());
> }
> catch (Throwable e) {
> e.printStackTrace();
> log.error(ME, e.toString());
> }
> }
> }
>
> public String update(String cbSessionId, UpdateKey updateKey, byte[] content,
> UpdateQos updateQos)
> {
> if (updateKey.isInternal()) {
> log.info("", "Received unexpected internal message '" +
> updateKey.getOid() + " from xmlBlaster");
> return "";
> }
>
> log.info(ME, "Received asynchronous message '" + updateKey.getOid() +
> "' state=" + updateQos.getState() +
> " content=" + new String(content) + " from xmlBlaster");
>
> UpdateReturnQos uq = new UpdateReturnQos(glob);
> return uq.toXml();
> }
>
> /**
> * Try
> * <pre>
> * java javaclients.AllProtocols -help
> * </pre>
> * for usage help
> */
> public static void main(String args[]) {
> Global glob = new Global();
>
> if (glob.init(args) != 0) { // Get help with -help
> XmlBlasterConnection.usage();
> System.err.println("Example: java javaclients.AllProtocols -session.name Jeff\n");
> System.exit(1);
> }
>
> new AllProtocols(glob);
> }
> }
>
> class Con {
> public Con(String[] args, String helpText) {
> this.glob = new Global(args, true, false);
> this.helpText = helpText;
> }
> public String helpText;
> public Global glob;
> public XmlBlasterConnection con;
> };
--
matighet at bbn.com BBN Technologies