I want to use the jms layer, but I've a netty application and I want to write the ByteBuf mostly efficent to the queue. I think it makes no sense to convert it back from a native buffer into a byte array or stream and tunnel this throught the jvm!
Is there a way to use a ByteBuf with jms? -----Ursprüngliche Nachricht----- Von: Clebert Suconic <clebert.suco...@gmail.com> Gesendet: Dienstag, 23. März 2021 15:00 An: users@activemq.apache.org Betreff: Re: send message You were supposed to call reset right before sending though... but I did not need it on my test.. I will post a link... Anyway, if you use the JMS API, the JMS layer is very thin, and I don't think it would affect your performance in any way. you could create a BytesMessage and all the detail would be hidden away from the internal API. On Tue, Mar 23, 2021 at 9:57 AM Clebert Suconic <clebert.suco...@gmail.com> wrote: > > I'm adding a test doing exactly what you did, and it's working... > > give me 10 minutes and I will post a link here... > > On Tue, Mar 23, 2021 at 9:56 AM <tobias.w...@t-systems.com> wrote: > > > > Same Issue! > > public void sendMessageToSmtpQueue(String text) throws > > ActiveMQException { > > ClientSession session = this.sessionFactory.createSession(); > > try { > > session.start(); > > ClientMessage message = session.createMessage(true); > > message.setType(ClientMessage.TEXT_TYPE); > > message.getBodyBuffer().resetReaderIndex(); > > message.getBodyBuffer().writeString(text); > > ClientProducer producer = > > session.createProducer(ACTIVE_MQ_SMTP_QUEUE); > > producer.send(message); > > } finally { > > session.close(); > > } > > } > > > > java.lang.IndexOutOfBoundsException: Error reading in simpleString, > > length=1953068645 is greater than readableBytes=3 > > at > > org.apache.activemq.artemis.api.core.SimpleString.readSimpleString(SimpleString.java:185) > > at > > org.apache.activemq.artemis.api.core.SimpleString.readSimpleString(SimpleString.java:173) > > at > > org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper.readStringInternal(ChannelBufferWrapper.java:113) > > at > > org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper.readString(ChannelBufferWrapper.java:98) > > at > > com.tsystems.gematik.kim.mailserver.mq.MailServerActiveMQClient.receiveTextMessageFromSmtpQueue(MailServerActiveMQClient.java:94) > > at > > com.tsystems.gematik.kim.mailserver.mq.MailServerActiveMQClientTest.sendAndReceiveTextMessage(MailServerActiveMQClientTest.java:37) > > at > > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native > > Method) > > at > > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > > at > > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > at java.base/java.lang.reflect.Method.invoke(Method.java:566) > > at > > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) > > at > > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) > > at > > org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) > > at > > org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) > > at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) > > at > > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) > > at > > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) > > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) > > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) > > at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) > > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) > > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) > > at org.junit.runners.ParentRunner.run(ParentRunner.java:363) > > at > > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89) > > at > > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) > > at > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) > > at > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) > > at > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) > > at > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTe > > stRunner.java:209) > > > > > > -----Ursprüngliche Nachricht----- > > Von: Clebert Suconic <clebert.suco...@gmail.com> > > Gesendet: Dienstag, 23. März 2021 13:48 > > An: users@activemq.apache.org > > Betreff: Re: send message > > > > Can you try calling message.getBodyBuffer().resetReaderIndex(); before the > > send? > > > > if that does not work I will try your code and see what happens. > > (Let me know if doesn't please) > > > > On Tue, Mar 23, 2021 at 7:55 AM Gary Tully <gary.tu...@gmail.com> wrote: > > > > > > maybe take inspiration from > > > https://github.com/apache/activemq-artemis/blob/master/tests/integ > > > rati > > > on-tests/src/test/java/org/apache/activemq/artemis/tests/integrati > > > on/c lient/MessageBufferTest.java that passes a string, but there > > > are corresponding byte[] or buffer variants in the api. If you > > > want to skip the decoding, to access the raw buffer, you need to > > > parse the type to get to the appropriate part of the buffer. > > > There are loads of usage examples in the tests and they all work, > > > start there and break it as you go. > > > > > > the issue is the wire level encoding that the client does, the JMS > > > api hides this, as do the typed accessors, but you can get direct > > > access to the encoded buffers via the core api as you are doing > > > but you need to be type aware, for example a string can be utf-8 > > > encoded or it can be raw bytes on the wire, depending on the size > > > and chars, the encoding handles and hides this detail. But if you > > > go for direct access, you need to be aware of the encoding. > > > > > > > > > On Tue, 23 Mar 2021 at 07:37, <tobias.w...@t-systems.com> wrote: > > > > > > > > getDataBuffer gives same result! Already tried! > > > > > > > > -----Ursprüngliche Nachricht----- > > > > Von: Clebert Suconic <clebert.suco...@gmail.com> > > > > Gesendet: Dienstag, 23. März 2021 03:19 > > > > An: users@activemq.apache.org > > > > Betreff: Re: send message > > > > > > > > Why you don't use the JMS API for this? > > > > > > > > or if you really want to use the core API, use the getReadOnlyBuffer() > > > > or getDataBuffer() on the Message instead. > > > > > > > > On Mon, Mar 22, 2021 at 12:01 PM Justin Bertram <jbert...@apache.org> > > > > wrote: > > > > > > > > > > The stack-trace indicates you're invoking the "readString" > > > > > method on line > > > > > 93 of MailServerActiveMQClient.java, but I don't see that call > > > > > in the code you pasted. Therefore, that stack-trace doesn't > > > > > seem correct. Can you clarify this? > > > > > > > > > > > > > > > Justin > > > > > > > > > > On Mon, Mar 22, 2021 at 10:55 AM Dondorp, Erwin > > > > > <erwin.dond...@cgi.com> > > > > > wrote: > > > > > > > > > > > Fyi: > > > > > > 1953068645(decimal) = 74697665(hexadecimal) = "tive"(ascii > > > > > > text) And "tive" is likely part of the string "ActiveMQ"? > > > > > > e. > > > > > > > > > > > > -----Oorspronkelijk bericht----- > > > > > > Van: tobias.w...@t-systems.com <tobias.w...@t-systems.com> > > > > > > Verzonden: maandag 22 maart 2021 16:41 > > > > > > Aan: users@activemq.apache.org > > > > > > Onderwerp: AW: send message > > > > > > > > > > > > > > > > > > EXTERNAL SENDER: Do not click any links or open any attachments > > > > > > unless > > > > > > you trust the sender and know the content is safe. > > > > > > EXPÉDITEUR EXTERNE: Ne cliquez sur aucun lien et n’ouvrez aucune > > > > > > pièce > > > > > > jointe à moins qu’ils ne proviennent d’un expéditeur fiable, > > > > > > ou que vous ayez l'assurance que le contenu provient d'une source > > > > > > sûre. > > > > > > > > > > > > While sending / receiving a text message I get this > > > > > > > > > > > > java.lang.IndexOutOfBoundsException: Error reading in > > > > > > simpleString, > > > > > > length=1953068645 is greater than readableBytes=3 > > > > > > at > > > > > > org.apache.activemq.artemis.api.core.SimpleString.readSimpleString(SimpleString.java:185) > > > > > > at > > > > > > org.apache.activemq.artemis.api.core.SimpleString.readSimpleString(SimpleString.java:173) > > > > > > at > > > > > > org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper.readStringInternal(ChannelBufferWrapper.java:113) > > > > > > at > > > > > > org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper.readString(ChannelBufferWrapper.java:98) > > > > > > at com.tsystems.gematik.kim.mailserver.mq > > > > > > .MailServerActiveMQClient.receiveTextMessageFromSmtpQueue(MailServerActiveMQClient.java:93) > > > > > > at com.tsystems.gematik.kim.mailserver.mq > > > > > > .MailServerActiveMQClientTest.sendAndReceive(MailServerActiveMQClientTest.java:28) > > > > > > at > > > > > > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invo > > > > > > ke0( > > > > > > Nati > > > > > > ve > > > > > > Method) > > > > > > at > > > > > > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > > > > > > at > > > > > > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > > > > > at > > > > > > java.base/java.lang.reflect.Method.invoke(Method.java:566) > > > > > > at > > > > > > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) > > > > > > at > > > > > > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) > > > > > > at > > > > > > org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) > > > > > > at > > > > > > org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) > > > > > > at > > > > > > org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) > > > > > > at > > > > > > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) > > > > > > at > > > > > > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) > > > > > > at > > > > > > org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) > > > > > > at > > > > > > org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) > > > > > > at > > > > > > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) > > > > > > at > > > > > > org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) > > > > > > at > > > > > > org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) > > > > > > at org.junit.runners.ParentRunner.run(ParentRunner.java:363) > > > > > > at > > > > > > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89) > > > > > > at > > > > > > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) > > > > > > at > > > > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) > > > > > > at > > > > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) > > > > > > at > > > > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) > > > > > > at > > > > > > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main( > > > > > > Remo > > > > > > teTe > > > > > > stRunner.java:209) > > > > > > > > > > > > > > > > > > -----Ursprüngliche Nachricht----- > > > > > > Von: Justin Bertram <jbert...@apache.org> > > > > > > Gesendet: Montag, 22. März 2021 16:34 > > > > > > An: users@activemq.apache.org > > > > > > Betreff: Re: send message > > > > > > > > > > > > What actually fails? Do you have a stack-trace? > > > > > > > > > > > > > > > > > > Justin > > > > > > > > > > > > On Mon, Mar 22, 2021 at 9:53 AM <tobias.w...@t-systems.com> wrote: > > > > > > > > > > > > > I try to send and receive a netty ByteBuf message, but it fails. > > > > > > > What I'm doing wrong here? I even don't know ist he > > > > > > > mistake in sending or receiving! > > > > > > > I was thinking to use the jms layer, but I'm receiving the > > > > > > > data buffer throught a netty buffer and I want to avoid to > > > > > > > convert the buffer to a byte array! > > > > > > > > > > > > > > public void sendMessageToSmtpQueue(ByteBuf buf) > > > > > > > throws ActiveMQException { > > > > > > > ClientSession session = > > > > > > > this.sessionFactory.createSession(); > > > > > > > try { > > > > > > > session.start(); > > > > > > > ClientMessage message = > > > > > > > session.createMessage(true); > > > > > > > > > > > > > > message.getBodyBuffer().writeBytes(buf, 0, buf.readableBytes()); > > > > > > > ClientProducer producer = > > > > > > > session.createProducer(ACTIVE_MQ_SMTP_QUEUE); > > > > > > > producer.send(message); > > > > > > > } finally { > > > > > > > session.close(); > > > > > > > } > > > > > > > } > > > > > > > > > > > > > > public ActiveMQBuffer receiveMessageFromSmtpQueue() > > > > > > > throws ActiveMQException { > > > > > > > ActiveMQBuffer result; > > > > > > > ClientSession session = > > > > > > > this.sessionFactory.createSession(); > > > > > > > try { > > > > > > > session.start(); > > > > > > > ClientConsumer consumer = > > > > > > > session.createConsumer(ACTIVE_MQ_SMTP_QUEUE); > > > > > > > ClientMessage message = consumer.receive(); > > > > > > > result = > > > > > > > ActiveMQBuffers.fixedBuffer(message.getBodyBufferSize()); > > > > > > > message.getBodyBuffer().readBytes(result); > > > > > > > } finally { > > > > > > > session.close(); > > > > > > > } > > > > > > > > > > > > > > return result; > > > > > > > } > > > > > > > > > > > > > > > > > > > > > public void startServer() throws Exception { > > > > > > > this.configuration = new ConfigurationImpl(); > > > > > > > > > > > > > > this.configuration.addAcceptorConfiguration("in-vm", > > > > > > > ACTIVE_MQ_EMBEDDED_SERVER_URL); > > > > > > > this.configuration.setPersistenceEnabled(true); > > > > > > > this.configuration.setSecurityEnabled(false); > > > > > > > this.configuration.addQueueConfiguration(new > > > > > > > QueueConfiguration(ACTIVE_MQ_SMTP_QUEUE)); > > > > > > > > > > > > > > this.server = new > > > > > > > ActiveMQServerImpl(this.configuration); > > > > > > > this.server.start(); > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > Clebert Suconic > > > > > > > > -- > > Clebert Suconic > > > > -- > Clebert Suconic -- Clebert Suconic