Question 1: Do Queues provide for Client-side buffering?
PubSub subsystem can implement Client-side message buffering and thereby increase rates at which data is received by the client. Whereas, a Point-to-Point system essentially involves an intelligent polling mechanism to retrieve message from the server. There can be no buffering in the client for Queues, as a message can be delivered to a single queue receiver. It is recommended to use topics instead of queues for your messaging needs, since message transfer on topics is faster than that on Queues.
PubSub APIs can be used to simulate Queues. Please refer to $FMQ_DIR/fmq/ samples/PubSub/Queues.
Question 2: How to decide between "single topic complex selector Vs multiple topics simple selector" approach?
If the message types are previously segregated, it is recommended to send them on different topics. Message selection hits the performance drastically. The performance hit can be anywhere between 10 to 60 % depending upon message size. Also in case it is mandatory to use selection, use of simpler selection criteria is suggested (by way of segregating categories of messages to different topics.)
Question 3: What is the advantage of using server-side message filtering?
Server side message filtering reduces a lot of socket calls, since messages for a client are dropped by the server if they do not match the selector set by the client.
Question 4: Is it possible to change a consumer's selector dynamically or I have to close the connection, reset the selector and reconnect?
Consumer's message selectors cannot be modified dynamically. However it is not necessary to close the connection or reconnect for this purpose. It is sufficient if the consumer is closed (subscriber.close() API) and a new consumer is created with the new selector.
Question 5: Does FioranoMQ support multiple subscribers to the same Queue?
FioranoMQ allows multiple concurrent subscribers to receive data from the same Queue. FioranoMQ additionally ensures that in scenarios where multiple subscribers receive message from the Queue, none of the subscriptions "starve". FioranoMQ ensures that there is no "starvation" if there are N-listeners on the same Queue. This is ensured by having a Job Queue within the MQServer, with utmost N-jobs (where N is the number of Subscriptions on the Queue).
Question 6: Does FioranoMQ support installation of the same callback on multiple Queues and Topics?
A Client Application can install the same callback for any number of subscriptions (on Topics or on Queues). JMS design prevents the callback from having a synchronization block.
Question 7: What happens if Client ID is not set for the connection on which the Durable Subscription is created?
JMS Provider sets a default clientID to every connection, if the clientID is not set by the JMS Application. Every durable subscription is identified by a unique combination of clientID and SubscriptionID. Hence, if the Durable Subscription does not set a clientID, every time the subscription is created, it would result in creation of a new Durable Subscription with a different clientID. Hence, you need to explicitly set the clientID for DurableSubscription.
Question 8: Does FioranoMQ provide for concurrent execution of MessageListeners on a Session?
A JMS Session is a single threaded context and does not provide for concurrent execution of MessageListeners on a session. Hence, FioranoMQ does not support concurrent execution of MessageListeners on a session.
Question 9: How do I set the configuration options in FioranoMQ?
FioranoMQ provides a comprehensive set of configuration options. The options can be set in Fiorano Admin Studio, a user- friendly GUI. For more information refer to Chapter 4 Connection Management in the FioranoMQ Handbook.
Question 10: Does FioranoMQ support logging?
FioranoMQ supports logging and dynamic tracing facilities. Logs can be redirected to files (as txt or html) or to the console. FioranoMQ allows users to plug in their own log mechanism.
For more information refer to section 9.7 Logging and Tracing in the FioranoMQ Handbook.
Question 11: How do I perform Administrative activities using the administration tool?
FioranoMQ provides for a graphical Administration Tool using to administer the FioranoMQ Server. This GUI tool allows the Server administrator to perform a large number of administrative tasks such as the following:

  • Creation/deletion of administered objects (such as destinations, users, and connectionfactories)
  • Managing ACLs on different destinations
  • Managing clusters of MQ servers
  • Monitoring the status of repeaters. The Admin Tool can be launched in one of the following manners:
  • On Windows platforms, click Start > Programs > Fiorano > FioranoMQ 8.x > Fiorano Studio.

Or
Run the script, Studio.bat available in the Studio\bin folder of Fiorano installation. You can run the tool by typing the line Studio.bat at the command prompt.
• On Unix-based platforms, $FMQ_DIR/Studio/bin contains the script, Stu-dio.bat, that can be used to run the FioranoMQ Administration Tool. You can run the tool by executing the bourne shell script Studio.sh.
FioranoMQ Admin Studio uses the APIs exposed by the FioranoMQ Server. You can write your own tools that use these APIs. For more information refer to Chapter 25 Administering FioranoMQ Server Using APIs in the FioranoMQ Handbook.
Question 12: I received a system error during decompression, while trying to install FioranoMQ. What is the reason for this error?
One of the possible reasons could be lack of available free space in your "c:\" or the system directory in which you are trying to install FioranoMQ. (FioranoMQ installable needs around 120 MB of free space).
The steps required to resolve this issue is as follows:

  1. Identify a drive on your machine with more than 120 MB of free space.
  2. Create a directory d:\temp (if it does not already exist).
  3. Click Start > Settings > Control Panel and double-click System icon.
  4. Select Advanced tab.
  5. Click Environment Variables.
  6. In User Variables list, scroll down to select TEMP variable and set it's value to d:\temp. Scroll down to select TMP variable and set it's value to d:\temp.
  7. Similarly, in System Variables list, scroll down to select TEMP variable and set it's value to d:\temp. Scroll down to select TMP variable and set it's value to d:\temp
  8. Click OK.
  9. Now try installing FioranoMQ on this machine.

Question 13: Is it possible to submit and consume messages (Simple Text) into/from a Fiorano queue, using a GCC (C++) application?
It is possible to compile C++RTL application on Solaris using GCC compiler. Following are the step-by-step instructions, along with the required files:
Files Required:

  1. libjms.so file Library file containing the sources for C++ RTL, compiled with gcc on Solaris
  2. MessageAdaptor Library file present in the lib directory of FioranoMQ installation on Solaris
  3. cppc Shell script for compiling your applications

Instructions:
Copy the libjms.so (and MessageAdaptor, if required) files to the %FMQ_DIR%/ fmq/lib directory and the cppc (replacement for jmscc.sh) to the %FMQ_DIR%\fmq\bin directory. Before you compile your applications using cppc, set the following shell variables:

  1. FMQ_DIR (For example, FMQ_DIR=/export/home/ashish/FioranoMQ5.22)
  2. JAVA_HOME (For Example, JAVA_HOME=/usr/java)

The cppc script requires that the libjava.so and libjvm.so files be present in the $JAVA_HOME/jre/lib/sparc directory. If they are not present in the specified directory, change the cppc script to match your path.
The MessageAdaptor, fmq-rtl.jar and fmq-common.jar are loaded from $FMQ_DIR/fmq/lib directory. The rt.jar is loaded from $JAVA_HOME/jre/lib. Make sure these files exist in their respective paths.
Question 14: Are persistent messages actually flushed to the disk before sending back an acknowledgement, or do you only acknowledge once in memory? A few other messaging vendors claim high performance numbers using this cache memory type system for persistent messages.
All persistent messages are written to the disk before a call to publish returns. FioranoMQ offers high-performance due to a file-based datastore that is optimized for messaging.
Question 15: For the API call public Enumeration elements (byte type) method of the MQAdminService class, what are the valid values for type?
The valid arguments (Constants along with their byte values) for elements() method of MQAdminService class are as follows:
NAMED_TOPIC = 0 NAMED_QUEUE = 1; NAMED_TOPIC_CONNECTION_FACTORY = 2; NAMED_QUEUE_CONNECTION_FACTORY = 3; NAMED_ADMIN_CONNECTION_FACTORY = 4; NAMED_USER = 5; NAMED_GROUP = 6; NAMED_NEIGHBOUR = 7;
Question 16: Does FioranoMQ set RFH2 header on messages while connecting to IBM MQSeries, through FioranoMQ bridge?
FioranoMQ does not set RFH2 header on the messages sent to MQSeries queue (through FioranoMQ Bridge). FioranoMQ Bridge uses the JMS wrapper APIs provided by IBM MQSeries. FioranoMQ Bridge sends the messages to these wrapper APIs, which further set RFH2 header on the messages before sending them to MQSeries queue.
Question 17: In a clustered environment, where a dispatcher dispatches requests to one of the n servers, does each of the n servers maintain their own repository, or is there a central repository that all servers utilize?
In a clustered environment, each of the n servers maintains their own separate repository. The dispatcher provides load balancing at the connection level. Once the connection is made to one particular server, all send/receive and message caching is performed at that server. The only requirement in this case is that Connection-Factories (topic/queue) should be replicated on all the member servers as the lookup operation is performed on the dispatcher server.
A better solution for this replication is to use an LDAP server to store named objects such as TCFs, QCFs, Topics and Queues. Similarly, in this case, the LDAP server is only used for lookup while the MessageRepository for each member server is unique.
Question 18: I am making a call to getDurableSubscribersForTopic, and the API documentation says that it only returns an Enumeration of ClientIDs. I have tried String and TopicSubscriber. But with both I receive a run time class cast exception. What is the underlying class of the Enumeration? As I loop through, I have to know what Objects enumeration I have in order to process that correctly.
The call adminService.getDurableSubscribersForTopic(topicName) returns an enumeration of String array (String[]) and not String. This array consists of two strings, the ClientID of the connection on which the subscriber was made and the subscriberID of the concerned subscriber.
The code snippet for retrieving the SubscriberIDs registered on the concerned Topic is as follows:
// Get all the subscribers for this topic Enumeration jmsSubscribers = adminService.getDurableSubscribersForTopic("primary- topic"); while (jmsSubscribers.hasMoreElements()) { String[] sName = (String[]) jmsSubscribers.nextElement(); for(int i=0; i < sName.length;i++)
{ System.out.println("Client ID " + sName[i]); System.out.println("Subscriber ID " + sName[i++]);
}
Question19: Can I use the character ":" while naming Queues and Topics?
FioranoMQ creates a directory with the specified Topic/Queue name. If the directory name (containing " : " character) is allowed by the Operating System (on which FioranoMQ server is running), then FioranoMQ server allows the creation of such Topic names. For example, Windows does not allow creation of directory names with characters such as "\ / : * ? " < > ! ", whereas Linux does. Thus, FioranoMQ running on Linux allows creation of Topic names with " : " character in it.
Question 20: Does FioranoMQ supports, silent install through install shield with WAIT?
FioranoMQ supports silent install through install shield with WAIT. Following are the instructions for achieving the same:

  1. Extract the '.exe' FioranoMQ installer to a folder of your choice.
  2. The folder disk1 in the extracted folders has the file setup.exe
  3. Generate the file setup.iss using the following command:

setup.exe -r -f1d:\setup.iss

  1. Open the setup.iss file and make the following change to a parameter value:

[SetupType-0] Result=301 szDir=
The value of the szDir variable under [SetupType-0] would be empty (as shown in the code above) in the generated setup.iss file. Copy the value of the szDir variable under [SdAskDestPath-0] (shown in the following code) to this szDir variable:
[SdAskDestPath-0] szDir=F:\Program Files\Fiorano\FioranoMQ Result=1

  1. After making the above mentioned changes, execute the following command on the DOS-prompt for Silent install of FioranoMQ with WAIT:

start /w setup.exe /SMS -s -a -s d:\setup.iss
This command waits on the DOS-prompt until the Silent installation of FioranoMQ is completed, and exits as soon as the same is done.
Question 21: Is C++ RTL of FioranoMQ generic to all Operating Systems or proprietary to a specific OS?
FioranoMQ comes bundled with C++ runtime libraries for the Win32 and Solaris platforms. The libraries do not have any platform specific code and can be compiled on any OS.
Question 22: Who's SOAP API does FioranoMQ support?
FioranoMQ supports SOAP messages and does not impose any restrictions on any vendor specific SOAP APIs. To demonstrate the SOAP support, we have implemented the samples using Apache SOAP APIs. But SOAP APIs of other vendors also works with FioranoMQ.
Question 23: Can I setup the FioranoMQ server on a machine that is using dual IPs, where one IP address is for the FioranoMQ server inside a corporate firewall and a separate IP for machines coming through the same firewall?
The FioranoMQ server can be setup on a dual IP machine by setting up the server socket using the hostname of machine and using an LDAP server as the JNDI store for storing the ConnectionFactories. In this case, the use of LDAP is recommended as it provides a common URL for looking up the connection factories.
Each of the ConnectionFactory can have one IP address as the primaryURL and the other IP address as the backup or failover URL. Hence, if a client is trying to connect to a wrong IP address, the attempt fails, and it is automatically transferred to the correct IP address.
For the example mentioned in the above question, the use of dual IPs can be avoided by using the HTTP proxy supports provide by FioranoMQ. In that case the FioranoMQ server should be running on the HTTP protocol. The clients inside the firewall get connected directly to the internal IP address while the clients outside the firewall gets connected to the same internal IP address through a HTTP proxy. The proxy takes care of forwarding all requests to the internal IP address.
Question 24: Is there any functionality in FioranoMQ that would allow a message not to be delivered before a specific time?
No, there is no functionality to allow a message not to be delivered before a specific time in the released versions of FioranoMQ.
Question 25: I tested the timed Request/Reply sample when FioranoMQ servers were running on HA mode. All I changed in code was adding the "BackupConnectURLs" when creating InitialContext object. The two applications (requestor and replier) ran well until I shutdown the primary active server. The backup server becomes active but clients, that are requestor and/or replier didn't detect that. The replier didn't get requests after the failure of the active primary server. While this test works for topic pub/sub and queue sender/receiver, I was wondering why request/reply doesn't work. Is this a known bug? Is there something related to the temporary topic concept that is involved in this mechanism? Does HA support request/reply?
Request/reply mechanism over temporary destinations does not work in HA. On startup, FioranoMQ server deletes all the temporary destinations existing on the server. However, you can create the request/reply functionality over normal (non temporary) destinations in your applications, which works effectively in FioranoMQ HA solution.
Question 26: In the following sample code, it appears that I do start the Topic Connection and QueueConnection before using them... could looking up the Topics be an issue?
env.put(Context.SECURITY_PRINCIPAL, config.getJMSuser());
env.put(Context.SECURITY_CREDENTIALS, config.getJMSpassword()); env.put(Context.PROVIDER_URL, config.getJMSURL()); env.put(Context.INITIAL_CONTEXT_FACTORY, "fiorano.jms.runtime.naming.FioranoIni- tialContextFactory"); InitialContext ic = new InitialContext(env); TopicConnectionFactory tcf = (TopicConnectionFactory) ic.lookup("primaryTCF"); QueueConnectionFactory qcf = (QueueConnectionFactory) ic.lookup("primaryQCF"); orderTopic = (Topic) ic.lookup("BORIS_ORDERS"); orderChangeRequestQueue = (Queue) ic.lookup("BORIS_ORDER_REQUEST"); tc = tcf.createTopicConnection(); tc.start(); ts = tc.createTopicSession(false, 1); qc = qcf.createQueueConnection(); qc.start(); qs = qc.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); TopicSubscriber tsub = ts.createSubscriber(orderTopic); tsub.setMessageListener(new OrderReceiver());
Looking up the Topics won't be an issue until you want to receive the published messages on this connection.
Question 27: Does Fiorano create the second TCP connection when the Connection is started or stopped?
FioranoMQ creates the second TCP connection when connection is started e.g. tc.start() in your case. Need of starting a connection basically depends on the usage of connection. If you are using the connection for a subscriber you have to start the connection before receiving the messages. But in case of Publishers, one can avoid starting connection. So you can defer tc.start() call until you have to receive messages on this connection.
Question 28: So for a subscriber connection you never need to start it?
For a subscriber it's necessary to start the connection, in order to receive the messages. However, for a publisher, you need not to start the connection.
Question29: When running XA samples, I see the following exception stracktrace? What is the reason for this error?
Initializing .... Connection established.......... Created the database table Inserted the messages into the database Got the oracle XA Connection Objectoracle.jdbc.xa.client.OracleXAConnection@1f5d386 Got the oracle XA Resource Objectoracle.jdbc.xa.client.OracleXAResource@18088c0 Got the oracle XID Objectoracle.jdbc.xa.OracleXid@fec107 Exception occured. Trying to close the resource javax.transaction.xa.XAException at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:626) at FioranoOracleXASample.createRDBMSObjects(FioranoOracleXASample.java:285) at FioranoOracleXASample.createObjects(FioranoOracleXASample.java:308) at FioranoOracleXASample.main(FioranoOracleXASample.java:153)
This error occurred, because the FioranoOracleXASample was unable to perform an XA recover operation. Therefore, the sample application did not seem to close its connection with Oracle properly, probably because either or both application or db server was not shut down properly and they crashed. Now that FioranoOracleXASample is attempting to re-establish the connection, Oracle needs to rollback any transactions that were in progress, but the Oracle user that FioranoOracleX-ASample is using to log into the database (scott, in this example) cannot perform the recovery. The solution is to give the Oracle user permission to perform the recovery, specifically to access the internal Oracle tables used to manage recovery. In SQL Plus as SYSOPER or SYSDBA, run this command:
grant select on DBA_PENDING_TRANSACTIONS to PUBLIC
If you don't want to grant this permission to all users, specify only the user listed in the error (in this example, scott). Then restart the database, and this time you should be able to successfully re-run FioranoOracleXASample.
Question 30: How can I change the user limit for the maximum number of open file descriptors for a user other than root?
The steps required, to change the user limit, for the maximum number of open file descriptors for a user other than root are as follows:

  1. Login as root.
  2. Edit the file /etc/security/limits.conf as root and make the following changes or add the following lines, respectively:

devel soft nofile 10000
devel hard nofile 20000
The "soft limit" in the first line, defines the number of file handles, or open files that the developer user have after login. If the developer user gets error messages about running out of file handles, then the developer user can increase the number of file handles like in this example up to 20000 (hard limit) by running the following command:
ulimit -n 20000

  1. Setting "hard" and "soft" limits in the given example might not work properly when you login as developer from an SSH session. It might work if you log in as root and so to developer. If you have this problem, you should try to set UsePrivilegeSeparation in /etc/ssh/sshd_config to "no" and restart the SSH daemon by executing service sshd restart.
  2. To ensure that the changes have taken place, login as developer from an SSH session and run the following command:

ulimit -n
You should see the output as 10000 which is the soft limit defined above.

Adaptavist ThemeBuilder EngineAtlassian Confluence