[
https://issues.apache.org/jira/browse/ARTEMIS-3461?focusedWorklogId=665892&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-665892
]
ASF GitHub Bot logged work on ARTEMIS-3461:
-------------------------------------------
Author: ASF GitHub Bot
Created on: 17/Oct/21 00:42
Start Date: 17/Oct/21 00:42
Worklog Time Spent: 10m
Work Description: erwindon commented on a change in pull request #3796:
URL: https://github.com/apache/activemq-artemis/pull/3796#discussion_r729850641
##########
File path:
artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
##########
@@ -1726,4 +1732,47 @@ public Object getOwner() {
public void setOwner(Object object) {
this.owner = object;
}
+
+
+ //
*******************************************************************************************************************************
+ // Composite Data implementation
+
+ private static MessageOpenTypeFactory AMQP_FACTORY = new
AmqpMessageOpenTypeFactory();
+
+ static class AmqpMessageOpenTypeFactory extends
MessageOpenTypeFactory<AMQPMessage> {
+ @Override
+ protected void init() throws OpenDataException {
+ super.init();
+ addItem(CompositeDataConstants.TEXT_BODY,
CompositeDataConstants.TEXT_BODY, SimpleType.STRING);
+ }
+
+ @Override
+ public Map<String, Object> getFields(AMQPMessage m, int valueSizeLimit,
int delivery) throws OpenDataException {
+ Map<String, Object> rc = super.getFields(m, valueSizeLimit, delivery);
+
+ if (m.getBody() != null && m.getBody() instanceof AmqpValue) {
Review comment:
the null-check is redundant as (null instanceof XXX) is always false
##########
File path:
artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
##########
@@ -1726,4 +1732,47 @@ public Object getOwner() {
public void setOwner(Object object) {
this.owner = object;
}
+
+
+ //
*******************************************************************************************************************************
+ // Composite Data implementation
+
+ private static MessageOpenTypeFactory AMQP_FACTORY = new
AmqpMessageOpenTypeFactory();
+
+ static class AmqpMessageOpenTypeFactory extends
MessageOpenTypeFactory<AMQPMessage> {
+ @Override
+ protected void init() throws OpenDataException {
+ super.init();
+ addItem(CompositeDataConstants.TEXT_BODY,
CompositeDataConstants.TEXT_BODY, SimpleType.STRING);
+ }
+
+ @Override
+ public Map<String, Object> getFields(AMQPMessage m, int valueSizeLimit,
int delivery) throws OpenDataException {
+ Map<String, Object> rc = super.getFields(m, valueSizeLimit, delivery);
+
+ if (m.getBody() != null && m.getBody() instanceof AmqpValue) {
+ // this is the QPID internal representation
+ // looks like e.g.: "[msg#2430, 4, {a=5, b=5}, 6, x, y]"
Review comment:
(for better understanding, not a suggestion to change it)
using the representation function from qpid has a few disadvantages:
1) strings are not quoted, in the above example: "4" could have been a
number or a string; also the representation suggests JSON, but due to the
missing quotes it is not actually json
2) the detailed types are not visible, a number may have been INT8, INT32,
UINT8, etc.
this representation is already a huge improvement over the previous
implementation, which either showed a binary dump or it just crashed.
##########
File path:
artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
##########
@@ -1726,4 +1732,47 @@ public Object getOwner() {
public void setOwner(Object object) {
this.owner = object;
}
+
+
+ //
*******************************************************************************************************************************
+ // Composite Data implementation
+
+ private static MessageOpenTypeFactory AMQP_FACTORY = new
AmqpMessageOpenTypeFactory();
+
+ static class AmqpMessageOpenTypeFactory extends
MessageOpenTypeFactory<AMQPMessage> {
+ @Override
+ protected void init() throws OpenDataException {
+ super.init();
+ addItem(CompositeDataConstants.TEXT_BODY,
CompositeDataConstants.TEXT_BODY, SimpleType.STRING);
+ }
+
+ @Override
+ public Map<String, Object> getFields(AMQPMessage m, int valueSizeLimit,
int delivery) throws OpenDataException {
+ Map<String, Object> rc = super.getFields(m, valueSizeLimit, delivery);
+
+ if (m.getBody() != null && m.getBody() instanceof AmqpValue) {
+ // this is the QPID internal representation
+ // looks like e.g.: "[msg#2430, 4, {a=5, b=5}, 6, x, y]"
Review comment:
(for better understanding, not a suggestion to change it)
using the representation function from qpid has a few disadvantages:
1) strings are not quoted, in the above example: "4" could have been a
number or a string; also the representation suggests JSON, but due to the
missing quotes it is not actually json
2) the detailed types are not visible, a number may have been INT8, INT32,
UINT8, etc.
this representation is already a huge improvement over the previous
implementation, which either showed a binary dump or it just crashed.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
Issue Time Tracking
-------------------
Worklog Id: (was: 665892)
Time Spent: 1.5h (was: 1h 20m)
> Browse Queue fails when the queue contains AMQP highly structured messages
> --------------------------------------------------------------------------
>
> Key: ARTEMIS-3461
> URL: https://issues.apache.org/jira/browse/ARTEMIS-3461
> Project: ActiveMQ Artemis
> Issue Type: Bug
> Components: Web Console
> Affects Versions: 2.18.0
> Reporter: Erwin Dondorp
> Priority: Major
> Time Spent: 1.5h
> Remaining Estimate: 0h
>
> send AMQP message to broker with a complex AMQP data structure of at least 2
> levels.
> e.g. an array containing another array
> the code below are 6 individual snippets of simple qpid-proton-PY
> implementations:
> {code:java}
> msg = proton.Message('hello') --> OK (no levels)
> {code}
> {code:java}
> msg = proton.Message([4,5,6,'hello']) --> OK (1 level)
> {code}
> {code:java}
> msg = proton.Message({"a":4,"b":5,"c":6,"d":'hello'}) --> OK (1 level)
> {code}
> {code:java}
> msg = proton.Message([4,5,6,["abc","def","ghi"]]) --> FAIL (2 levels)
> {code}
> {code:java}
> msg = proton.Message([4,{"a":5,"b":5,"c":5},6]) --> FAIL (2 levels)
> {code}
> {code:java}
> msg = proton.Message({"a":[4,5,6,'hello']}) --> FAIL (2 levels)
> {code}
> The messages can be constructed and send in proton without any problem. The
> messages also look good when they are inspected using WireShark.
> The problem occurs when viewing the messages with "Browse queue" in the
> Artemis console.
> The message/page counters are properly populated, but the table remains
> empty.
> In the log-file, the following exception is shown:
> {noformat}
> 2021-09-06 09:10:51,863 WARN
> [org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage] class
> java.util.ArrayList is not a valid property type:
> org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException:
> class java.util.ArrayList is not a valid property type
> at
> org.apache.activemq.artemis.utils.collections.TypedProperties.setObjectProperty(TypedProperties.java:1194)
> [artemis-commons-2.18.0. jar:2.18.0]
> at
> org.apache.activemq.artemis.protocol.amqp.converter.coreWrapper.CoreMapMessageWrapper.setObject(CoreMapMessageWrapper.java:140)
> [artemis-amqp-protocol-2.18.0.jar:2.18.0]
> at
> org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.createMapMessage(AMQPMessageSupport.java:364)
> [artemis-amqp-protocol-2.18.0.jar:2.18.0]
> at
> org.apache.activemq.artemis.protocol.amqp.converter.AmqpCoreConverter.toCore(AmqpCoreConverter.java:197)
> [artemis-amqp-protocol-2.18.0.jar:2.18.0]
> at
> org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage.toCore(AMQPMessage.java:865)
> [artemis-amqp-protocol-2.18.0.jar:2.18.0]
> at
> org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage.toCore(AMQPMessage.java:875)
> [artemis-amqp-protocol-2.18.0.jar:2.18.0]
> at
> org.apache.activemq.artemis.core.management.impl.openmbean.OpenTypeSupport.convert(OpenTypeSupport.java:53)
> [artemis-server-2.18.0.jar:2.18.0]
> at
> org.apache.activemq.artemis.core.management.impl.QueueControlImpl.browse(QueueControlImpl.java:1575)
> [artemis-server-2.18.0.jar:2.18.0]
> at sun.reflect.GeneratedMethodAccessor122.invoke(Unknown Source)
> [:1.8.0_302]
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> [rt.jar:1.8.0_302]
> at java.lang.reflect.Method.invoke(Method.java:498) [rt.jar:1.8.0_302]
> at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:72)
> [rt.jar:1.8.0_302]
> at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source) [:1.8.0_302]
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> [rt.jar:1.8.0_302]
> at java.lang.reflect.Method.invoke(Method.java:498) [rt.jar:1.8.0_302]
> at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:276)
> [rt.jar:1.8.0_302]
> at
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:112)
> [rt.jar:1.8.0_302]
> at
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:46)
> [rt.jar:1.8.0_302]
> at
> com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:237)
> [rt.jar:1.8.0_302]
> at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:138)
> [rt.jar:1.8.0_302]
> at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:252)
> [rt.jar:1.8.0_302]
> at javax.management.StandardMBean.invoke(StandardMBean.java:405)
> [rt.jar:1.8.0_302]
> at
> com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
> [rt.jar:1.8.0_302]
> at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
> [rt.jar:1.8.0_302]
> at sun.reflect.GeneratedMethodAccessor14.invoke(Unknown Source)
> [:1.8.0_302]
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> [rt.jar:1.8.0_302]
> at java.lang.reflect.Method.invoke(Method.java:498) [rt.jar:1.8.0_302]
> at
> org.apache.activemq.artemis.core.server.management.ArtemisMBeanServerBuilder$MBeanInvocationHandler.invoke(ArtemisMBeanServerBuilder.java:96)
> [artemis-server-2.18.0.jar:2.18.0]
> at com.sun.proxy.$Proxy13.invoke(Unknown Source)
> at org.jolokia.handler.ExecHandler.doHandleRequest(ExecHandler.java:98)
> [jolokia-core-1.6.2.jar:]
> at org.jolokia.handler.ExecHandler.doHandleRequest(ExecHandler.java:40)
> [jolokia-core-1.6.2.jar:]
> at
> org.jolokia.handler.JsonRequestHandler.handleRequest(JsonRequestHandler.java:89)
> [jolokia-core-1.6.2.jar:]
> at
> org.jolokia.backend.MBeanServerExecutorLocal.handleRequest(MBeanServerExecutorLocal.java:109)
> [jolokia-core-1.6.2.jar:]
> at
> org.jolokia.backend.MBeanServerHandler.dispatchRequest(MBeanServerHandler.java:161)
> [jolokia-core-1.6.2.jar:]
> at
> org.jolokia.backend.LocalRequestDispatcher.dispatchRequest(LocalRequestDispatcher.java:99)
> [jolokia-core-1.6.2.jar:]
> at
> org.jolokia.backend.BackendManager.callRequestDispatcher(BackendManager.java:429)
> [jolokia-core-1.6.2.jar:]
> at
> org.jolokia.backend.BackendManager.handleRequest(BackendManager.java:158)
> [jolokia-core-1.6.2.jar:]
> at
> org.jolokia.http.HttpRequestHandler.executeRequest(HttpRequestHandler.java:197)
> [jolokia-core-1.6.2.jar:]
> at
> org.jolokia.http.HttpRequestHandler.handlePostRequest(HttpRequestHandler.java:137)
> [jolokia-core-1.6.2.jar:]
> at org.jolokia.http.AgentServlet$3.handleRequest(AgentServlet.java:460)
> [jolokia-core-1.6.2.jar:]
> at org.jolokia.http.AgentServlet.handleSecurely(AgentServlet.java:350)
> [jolokia-core-1.6.2.jar:]
> at org.jolokia.http.AgentServlet.handle(AgentServlet.java:321)
> [jolokia-core-1.6.2.jar:]
> at org.jolokia.http.AgentServlet.doPost(AgentServlet.java:284)
> [jolokia-core-1.6.2.jar:]
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
> [jetty-all-9.4.43.v20210629-uber.jar:9.4.43.v20210629]
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
> [jetty-all-9.4.43.v20210629-uber.jar:9.4.43.v20210629]
> at
> org.eclipse.jetty.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1459)
> at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
> at
> org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1626)
> at
> io.hawt.web.filters.FlightRecordingDownloadFacade.doFilter(FlightRecordingDownloadFacade.java:68)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at
> io.hawt.web.auth.LoginRedirectFilter.doFilter(LoginRedirectFilter.java:57)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at
> io.hawt.web.auth.AuthenticationFilter.lambda$executeAs$1(AuthenticationFilter.java:105)
> [hawtio-system-2.13.5.jar:2.13.5]
> at java.security.AccessController.doPrivileged(Native Method)
> [rt.jar:1.8.0_302]
> at javax.security.auth.Subject.doAs(Subject.java:422) [rt.jar:1.8.0_302]
> at
> io.hawt.web.auth.AuthenticationFilter.executeAs(AuthenticationFilter.java:104)
> [hawtio-system-2.13.5.jar:2.13.5]
> at
> io.hawt.web.auth.AuthenticationFilter.doFilter(AuthenticationFilter.java:72)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at io.hawt.web.filters.HttpHeaderFilter.doFilter(HttpHeaderFilter.java:43)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at io.hawt.web.filters.HttpHeaderFilter.doFilter(HttpHeaderFilter.java:43)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at io.hawt.web.filters.HttpHeaderFilter.doFilter(HttpHeaderFilter.java:43)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at io.hawt.web.filters.HttpHeaderFilter.doFilter(HttpHeaderFilter.java:43)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at io.hawt.web.filters.HttpHeaderFilter.doFilter(HttpHeaderFilter.java:43)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at io.hawt.web.filters.HttpHeaderFilter.doFilter(HttpHeaderFilter.java:43)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at io.hawt.web.filters.HttpHeaderFilter.doFilter(HttpHeaderFilter.java:43)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at io.hawt.web.filters.HttpHeaderFilter.doFilter(HttpHeaderFilter.java:43)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at
> io.hawt.web.auth.SessionExpiryFilter.process(SessionExpiryFilter.java:166)
> [hawtio-system-2.13.5.jar:2.13.5]
> at
> io.hawt.web.auth.SessionExpiryFilter.doFilter(SessionExpiryFilter.java:60)
> [hawtio-system-2.13.5.jar:2.13.5]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:201)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at
> org.apache.activemq.artemis.component.JolokiaFilter.doFilter(JolokiaFilter.java:50)
> [artemis-web-2.18.0.jar:2.18.0]
> at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
> at
> org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
> at
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548)
> at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
> at
> org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:602)
> at
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
> at
> org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
> at
> org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
> at
> org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
> at
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1434)
> at
> org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
> at
> org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
> at
> org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
> at
> org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
> at
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349)
> at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
> at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:59)
> at
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
> at org.eclipse.jetty.server.Server.handle(Server.java:516)
> at
> org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388)
> at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633)
> at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380)
> at
> org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
> at
> org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
> at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
> at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
> at
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
> at
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
> at
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
> at
> org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
> at
> org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:386)
> at
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
> at
> org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
> at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_302]
> {noformat}
> The stack trace has minor differences based on the exact message structure.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)