activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kristoffer <sto...@gmail.com>
Subject Re: Jecks, Lingo and vm://
Date Fri, 20 Oct 2006 15:45:08 GMT

Thanks for your answer. That's what is suspected. So my options are to use
tcp between modules that run in the same JVM but in diffrent classloaders,
or put activemq + deps in a shared classloader. Hmm..

Anyway i tried this out a bit and it works when sending strings.  When i try
to send a Serializable object it also works, but as soon as i do parallel
requests i get this exception:

ALLVARLIG: error dispatching message:
java.lang.RuntimeException: Invalid message will be discarded:
ActiveMQObjectMessage {commandId = 7, responseRequired = true, messageId =
ID:artimus-3
897-1161358090985-3:11:1:1:1, originalDestination = null,
originalTransactionId = null, producerId =
ID:artimus-3897-1161358090985-3:11:1:1, destinati
on = topic://ericsson.ConsumerTopic, transactionId = null, expiration =
1161358135891, timestamp = 1161358105891, arrival = 0, correlationId = null,
r
eplyTo = null, persistent = true, type = null, priority = 4, groupID = null,
groupSequence = 0, targetConsumerId = null, compressed = false, userID =
null, content = org.apache.activeio.packet.ByteSequence@f5b2e4,
marshalledProperties = org.apache.activeio.packet.ByteSequence@b3c24f,
dataStructure =
 null, redeliveryCounter = 0, size = 0, properties = null,
readOnlyProperties = true, readOnlyBody = true}
        at
org.logicblaze.lingo.jms.marshall.DefaultMarshaller.onInvalidMessage(DefaultMarshaller.java:148)
        at
org.logicblaze.lingo.jms.marshall.DefaultMarshaller.readRemoteInvocation(DefaultMarshaller.java:92)
        at
org.logicblaze.lingo.jms.JmsServiceExporterMessageListener.onMessage(JmsServiceExporterMessageListener.java:99)
        at
org.jencks.LocalTransactionEndpoint.onMessage(LocalTransactionEndpoint.java:68)
        at
org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.onMessage(MessageEndpointProxy.java:121)
        at
org.apache.activemq.ra.MessageEndpointProxy.onMessage(MessageEndpointProxy.java:60)
        at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:693)
        at
org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:163)
        at
org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:291)
        at
EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Thread.java:595)

I browsed the lingo source and found this:

public RemoteInvocation readRemoteInvocation(Message message) throws
JMSException {
    handleInvocationHeaders(message);
    if (message instanceof ObjectMessage) {
        ObjectMessage objectMessage = (ObjectMessage) message;
        Object body = objectMessage.getObject();
        if (body instanceof RemoteInvocation) {
            return (RemoteInvocation) body;
        }
    }
    return onInvalidMessage(message);
}

So it seems that the message i send is either not a ObjectMessage or the
body is not a RemoteInvocation object. But it is a bit strange, since this
works when doing single shot requests. 

I connect using on the client using:
vm://localhost?marshal=true&broker.useJmx=false&broker.persistent=false

Any ideas why this is happening?

cheers,
-Kristoffer


gnodet wrote:
> 
> The vm transport works only inside one classloader,
> so you need to put these in a shared classloader
> for you scenario to work.
> 
> On 10/20/06, kristoffer <stoffe@gmail.com> wrote:
>>
>> I did some test for this but my initial idea did not work (maybe for
>> obvious
>> reasons).
>>
>> This is how i understand what is happening:
>> Seems as if the service modules are not able to connect to the broker
>> because of classloader visibility since they are in separate WARs (this
>> is
>> how vm:// works?). These service modules then instead try to create their
>> own embeded brokers. The brokers will throw exceptions all over the place
>> with conflicting journals.
>>
>> However, i managed to get this to work, by putting activemq (4.0.2) and
>> most
>> of its dependencies (spring,xbeans etc) in system classpath. All service
>> modules seem to connect to _the_ broker and are able to communicate
>> between
>> eachother properly.
>>
>> Do i really have to restrict myself and put these jars in system
>> classpath
>> to get this to work? What am I doing wrong? (Is vm:// is infact a
>> classloader:// transport?)
>>
>> One idea I have is to make the (unwanted) creation of brokers (in the
>> service modules) to be non-persistent by providing some configuration in
>> order to avoid the journal conflicts. Would this work?
>>
>> I dont want to have a monolithic design where i put all my modules in a
>> single WAR. I also want to avoid putting things in system classpath when
>> rolling out the product in production.
>>
>> cheers,
>> -Kristoffer
>>
>>
>> kristoffer wrote:
>> >
>> > Hi,
>> >
>> > Im designing a modular system inside a servlet container were i want
>> > modules (deployed as WARs, thus separte classloaders) to communicate
>> with
>> > eachother through JMS. In order to do this effeciently I was thinking
>> of
>> > using Jencks to utilize JCA for this nice pooling, transaction and
>> > workmanager support. I dont want embedded brokers in these service
>> > modules, if it is possible?
>> >
>> > Can I deploy a broker as a separate WAR module (and classloader), which
>> > exposes a vm:// transport to the service modules? Reading from the
>> > documentation it seems as if this would work, as long as i send
>> > ObjectMessage messages between the service modules. Is this correct?
>> >
>> > I was also thinking of using Lingo so that i can have message driven
>> pojos
>> > interfaces between the service modules. Does lingo always use
>> > ObjectMessage to communicate with the broker, or is there some way i
>> can
>> > force this behaviour?
>> >
>> > One "problem" i realized (not really related to this) is that since the
>> > broker WAR need to be deployed before the service modules i need some
>> > mechanism of setting deployment dependencies between the broker and
>> > service modules. Possibly between service modules aswell. I know
>> weblogic
>> > and Jboss have a loadorder feature, but have yet to find one in for
>> > example jetty or tomcat? Anyone have a tip?
>> >
>> > As a future requirement i want to be able to scale up with multiple
>> > servlet containers that should share load between eachother, both on
>> HTTP
>> > request level (with a loadbalancer), but also between brokers.
>> >
>> > Please correct me if i missunderstood how to use activemq in the best
>> way.
>> >
>> > keep up the good work!
>> >
>> > cheers,
>> > -Kristoffer
>> >
>>
>> --
>> View this message in context:
>> http://www.nabble.com/Jecks%2C-Lingo-and-vm%3A---tf2479865.html#a6917416
>> Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>>
>>
> 
> 
> -- 
> Cheers,
> Guillaume Nodet
> 
> 

-- 
View this message in context: http://www.nabble.com/Jecks%2C-Lingo-and-vm%3A---tf2479865.html#a6919304
Sent from the ActiveMQ - User mailing list archive at Nabble.com.


Mime
View raw message