Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

  • Isomorphic
    replied
    Is this related to Remote Debugging or to other usage?

    If other usage, can you please start a new thread and describe what you're usage is there?

    Leave a comment:


  • claudiobosticco
    replied
    Also, I'm considering to try the stream protocol instead of AMQP https://github.com/rabbitmq/rabbitmq.../PROTOCOL.adoc

    Have you tried it? How would I configure the Realtime Messaging to use it?

    Leave a comment:


  • claudiobosticco
    replied
    Hello Isomorphic we have a problem where RabbitMQ memory consumption grows day by day even with low usage. We're now using RabbitMQ 3.10.8, we're using streams with AMQP protocol 0-9-1

    Now on the RabbitMQ forum they're asking for details about the consuming application:

    https://groups.google.com/g/rabbitmq.../c/Pt8tZQIE8mo

    Can you tell me more about how your consuming applications are using streams over AMQP. Do they disconnect frequently? If so do they send a basic.cancel first or just terminate the channel?
    Could you please tell me those details? Or feel free to post directly on the forum.

    EDIT: see https://forums.smartclient.com/forum...time-messaging
    Last edited by claudiobosticco; 8 Dec 2022, 14:31.

    Leave a comment:


  • claudiobosticco
    replied
    Originally posted by claudiobosticco View Post
    SmartClient Version: v13.0p_2022-05-17/Enterprise Deployment (built 2022-05-17)

    Hello Isomorphic I think I've found a little bug.

    It seems that the connect method of JMSMessageDispatcher is actually picking up only the messaging.jms.connectionFactory property and not topicConnectionFactory/queueConnectionFactory, ie if I define a messaging.jms.topicConnectionFactory: myConnectionFactory it will only look for the default jms/ConnectionFactory.

    This seems to happen because when looking for messaging.jms.connectionFactory JMSException is catched, instead of Exception.
    Hello, just to ask if you noticed this post...not a blocker for me, though.

    Leave a comment:


  • claudiobosticco
    replied
    Hello Isomorphic , sorry for the slow response.

    Actually your suggested setting for the ConnectionFactory works like a charm, so now I'm using RabbitMQ streams.

    Just in case someone else needs it, this is the working configuration (in the context.xml file of my application):

    Code:
    <Resource name="jms/MyConnectionFactory"
                  type="javax.jms.ConnectionFactory"
                  factory="com.rabbitmq.jms.admin.RMQObjectFactory"
                  username="user"
                  password="pwd"
                  virtualHost="my_VH"
                  host="myRabbitMQ_host"
                  channelsQos="100"
                  threadsPerConnection="2"
                  cleanUpServerNamedQueuesForNonDurableTopicsOnSessionClose="true"/>
    
        <ResourceLink global="jms/MyConnectionFactory"
                      name="jms/MyConnectionFactory"
                      type="javax.jms.ConnectionFactory"/>
    
        <Resource auth="Application"
                  name="jms/myChannel"
                  type="javax.jms.Topic"
                  factory="com.rabbitmq.jms.admin.RMQObjectFactory"
                  destinationName="myChannel"
                  amqp="true"
                  amqpExchangeName="jms.durable.topic"
                  amqpRoutingKey="jms/myChannel"
                  amqpQueueName="myChannel"/>
        <ResourceLink global="jms/myChannel"
                      type="javax.jms.Topic"
                      name="jms/myChannel"/>
    in server.properties:

    Code:
    messaging.jms.context:_container_
    messaging.jms.jndiPrefix:jms
    messaging.jms.connectionFactory:MyConnectionFactory
    messaging.jms.encoding:json
    using RabbitMQ console I've created a queue of type Stream, named myChannel, bound to an exchange jms.durable.topic (type Topic) with routing key jms/myChannel.

    I'm using it with RabbitMQ 3.10.1, and the web application is deployed in a tomcat cluster.

    Leave a comment:


  • Isomorphic
    replied
    The error message you are getting about a missing ActiveMQ class is just your application picking up default config. As you can see from your success with RabbitMQ, the error is not having a negative effect. In fact, it would have no effect even if you did have ActiveMQ present in your project, because you are already mapping RabbitMQ as the connection factory, and SmartClient's auto-mapping will not override that. You can suppress that error message by adding this setting to your server.properties file (this doesn't switch off JMS messaging, just the logic that auto-maps a connection factory)
    Code:
    messaging.jms.publish: false
    As far as using RabbitMQ Streams to implement a single queue with multiple consumers, where all consumers receive all messages, it looks like Streams can be treated like Queues from the client point of view, as long as you specify a per-consumer QoS prefetch (as you suggest). From their documentation, it looks like you could achieve this by specifying something similar to this in the ConnectionFactory declaration in your server.xml file:
    Code:
        channelsQos="100"
    Or, you could consider using RabbitMQ's JMS Topic support (towards the bottom of the page). This does use a queue-per-subscriber, but it looks like that is handled behind the scenes by the JMS plugin. Or, if neither of those will work for you, you could consider using the fanout approach described in the first answer to this Stack Overflow post

    Note, all of these are only providing a single-queue solution at the RabbitMQ/JMS level; SmartClient would still be using a queue-per-subscriber

    Leave a comment:


  • Isomorphic
    replied
    Sorry for the slow response, we have a number of things going on (including a surprise expired cert for this subdomain!). We are getting notifications, and we'll get to this as soon as we can

    Leave a comment:


  • claudiobosticco
    replied

    Hello, could you please just confirm if you're receiving notifications from this old thread? Otherwise I'll start a new one.

    In the meantime, I've read in the RabbitMQ docs of this feature https://www.rabbitmq.com/streams.html
    which seems to have the behaviour I'm looking for:


    When wanting to deliver the same message to multiple subscribers users currently have to bind a dedicated queue for each consumer. If the number of consumers is large this becomes potentially inefficient, especially when wanting persistence and/or replication. Streams will allow any number of consumers to consume the same messages from the same queue in a non-destructive manner, negating the need to bind multiple queues.
    Do you think you could support this feature? Right now, If I try to use a queue of type Stream, I see this error:
    Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - consumer prefetch count is not set for 'queue 'updateMappaJtaChannel_1' in vhost 'JTA_VH'', class-id=60, method-id=20)
    So it seems that it's required to set the consumer prefetch.

    Leave a comment:


  • claudiobosticco
    replied
    SmartClient Version: v13.0p_2022-05-17/Enterprise Deployment (built 2022-05-17)

    Hello Isomorphic I think I've found a little bug.

    It seems that the connect method of JMSMessageDispatcher is actually picking up only the messaging.jms.connectionFactory property and not topicConnectionFactory/queueConnectionFactory, ie if I define a messaging.jms.topicConnectionFactory: myConnectionFactory it will only look for the default jms/ConnectionFactory.

    This seems to happen because when looking for messaging.jms.connectionFactory JMSException is catched, instead of Exception.

    Leave a comment:


  • claudiobosticco
    replied
    I forgot to add that also the remote debugging is working, and is using RabbitMQ.

    Also, I noticed this log at startup:

    Code:
    INFO  ISCInit JMS JNDI publishing is enabled, but configured messaging.jms.vm.factory class org.apache.activemq.ActiveMQConnectionFactory is not present in runtime - proceeding without publishing isomorphic JMS stub to JNDI
    Do I need to configure something else for messaging.jms.vm.factory ?

    Leave a comment:


  • claudiobosticco
    replied
    SmartClient Version: v13.0p_2022-05-17/Enterprise Deployment (built 2022-05-17)
    Tomcat 8.5.78

    Hello, I've got some questions and a summary which may be useful for others.

    It does seem that the Messaging is working with RabbitMQ (3.10.1) with very little configuration.

    After declaring the connection factory in the server.xml:

    Code:
    <Resource name="jms/ConnectionFactory"
                          type="javax.jms.ConnectionFactory"
                       factory="com.rabbitmq.jms.admin.RMQObjectFactory"
                      username="USER"
                      password="PWD"
                   virtualHost="/"
                          host="myHost"
                      threadsPerConnection="2"
                      cleanUpServerNamedQueuesForNonDurableTopicsOnSessionClose="true"
          />
    and adding in the tomcat libs: amqp-client-5.14.2.jar, javax.jms-api-2.0.1.jar, rabbitmq-jms-2.4.0.jar and slf4j-api-1.7.36.jar

    the messaging is working.

    In the RabbitMQ "Queues" tab I see a queue for every consumer (and the cleanUpServerNamedQueuesForNonDurableTopicsOnSessionClose is working, so I don't see temporary queues growing in number).

    I understand that the single consumer for every queue is the normal behaviour. If you configure (as I tried with amqp settings) a durable queue, it will have multiple consumers, but the messages will be delivered in a round robin sequence, so 2 consumers, 4 messages:
    - consumer 1 will get messages 1 and 3
    - consumer 2 will get messages 2 and 4

    Please correct me if it's possible to have a single queue with multiple consumers where every consumer receives all messages.

    Those temporary queues appear in the bindings under the Exchange jms.durable.topic, with the Routing Key equal to the channel identifier used in the Messaging api.

    If you declare a resource like:

    Code:
    <Resource auth="Container"
                name="jms/updateMappaJtaChannel"
                type="javax.jms.Topic"
                factory="com.rabbitmq.jms.admin.RMQObjectFactory"
                destinationName="jms/updateMappaJtaChannel"
              />
    then destinationName becomes the Routing Key. But it doesn't seem to be useful. Without it, I see this in the logs:

    INFO JMSMessageDispatcher Destination for channel 'jms/updateMappaJtaChannel' not available via JNDI - dynamically creating
    but it doesn't seem to create a problem, so I think it's safe to omit that Resource definition. Please correct me if I'm wrong.

    Now I think it would be nice to be able to create an Exchange and to have all queues of an application or channel bound to that custom Exchange.
    Otherwise in the RabbitMQ console you'll see all queues from all channels/applications, in the same listing.
    I've tried but without success.
    Is it something you think it's currently possible?

    Leave a comment:


  • Isomorphic
    replied
    Yes, they seem to have been resurrected somewhat, so there isn't a compelling reason to switch away to RabbitMQ if you are familiar with ActiveMQ and like it.

    We wouldn't want to comment on the long-term viability of either project, as that is very difficult to assess.

    Leave a comment:


  • claudiobosticco
    replied
    Originally posted by Isomorphic View Post
    As an aside, the RabbitMQ works fine out of the box. And ActiveMQ may not have a future: http://activemq.apache.org/new-features-in-60.html.
    Hello, I'm resurrecting this old thread to ask if you would still recommend RabbitMQ over ActiveMQ, as it seems that ActiveMQ is now actively maintained and developed (at least the "Artemis" release).

    Leave a comment:


  • claudiobosticco
    replied
    Now I'm confused: I've just discovered that if I use the 'publish message' feature in the rabbitMQ web console, to publish messages to my queue, I see it in browser A, first message published, browser B, 2nd message, browser C, 3rd message, and so on, browser A, 4th message, etc...

    Leave a comment:


  • claudiobosticco
    replied
    Hello, it seems that my comment about the MapMessage was really wrong, actually it was based on that line #320 of the error stacktrace:
    Code:
    2019-02-06 16:19:01,088 ERROR JMSMessageDispatcher Unable to deliver jms message
    javax.jms.MessageFormatException: Not enough bytes in message body for UTF object
    at com.rabbitmq.jms.client.message.RMQBytesMessage.readUTF(RMQBytesMessage.java:206)
    at com.isomorphic.messaging.JMSMessageDispatcher.iscMessage(JMSMessageDispatcher.java:320)
    which was in the MapMessage else-if in the decompiled code (v11.1p_2019-01-21) but I don't think that I actually could trust the line numbers in the decompiled code.

    Now I'm testing the latest build:
    SmartClient Version: v11.1p_2019-02-09/Enterprise Deployment (built 2019-02-09)
    and the previous error seems gone.

    But the behaviour is erratic.

    The consumer doesn't always receive the messages. If I have more than one consumer (a Chrome browser, a FF browser, a Safari browser, all on the same Mac), I see that sometimes one browser receives the message, sometimes two of them. I think that I've never seen all of them receive the message.
    By chance, the consumers are connected to the same node of the cluster, while the producer is connected to the other node.

    I've also tried to enable websockets, but I see this in all three browsers:
    Code:
    ISC_RealtimeMessaging.js?isc_version=v100p_2015-07-13.js:45 WebSocket connection to 'wss://myDomain/backoffice/Jta/isomorphic/websocket?ts=1549906205516&isc_noLog=1&type=connect&connectionID=conn_1&subscribedChannels=%7B%0A%20%20%20%20%22jms%2FupdateMappaJtaChannel%22%3A%7B%0A%20%20%20%20%20%20%20%20subscriptionCallback%3Anull%0A%20%20%20%20%7D%0A%7D' failed: Error during WebSocket handshake: Unexpected response code: 404
    isc_c_Messaging__connect @ ISC_RealtimeMessaging.js?isc_version=v100p_2015-07-13.js:45
    (anonymous) @ VM11008:3
    isc_c_Class_fireCallback @ ISC_Core.js?isc_version=v100p_2015-07-13.js:304
    isc_c_Timer__fireTimeout @ ISC_Core.js?isc_version=v100p_2015-07-13.js:1764
    (anonymous) @ ISC_Core.js?isc_version=v100p_2015-07-13.js:1761

    Leave a comment:

Working...
X