让Hawtio在JMS消息中显示超过255个字符

让Hawtio在JMS消息中显示超过255个字符,jms,apache-camel,activemq,hawtio,Jms,Apache Camel,Activemq,Hawtio,我正在使用Hawtio浏览我的ActiveMQ队列。我还希望能够在将JMS消息重新发送到另一个队列之前对其进行编辑 我不知道如何在Hawtio中编辑消息,但这很好,我想直接在代理中修改消息是不合法的 相反,我认为我应该复制邮件正文并发送一条修改了正文的新邮件。现在,我面临的问题是,我只能看到消息正文的前255个字符。如何在hawtio中查看整个ActiveMQ消息?不仅仅是前255个字符 我认为当您使用jmxapi查询和浏览队列时,ActiveMQ中有一个硬编码的限制,这正是hawtio所使用的

我正在使用Hawtio浏览我的ActiveMQ队列。我还希望能够在将JMS消息重新发送到另一个队列之前对其进行编辑

我不知道如何在Hawtio中编辑消息,但这很好,我想直接在代理中修改消息是不合法的


相反,我认为我应该复制邮件正文并发送一条修改了正文的新邮件。现在,我面临的问题是,我只能看到消息正文的前255个字符。如何在hawtio中查看整个ActiveMQ消息?不仅仅是前255个字符

我认为当您使用jmxapi查询和浏览队列时,ActiveMQ中有一个硬编码的限制,这正是hawtio所使用的。但不记得它是否只有255字节或更高


在hawtio设置中,可能有一个ActiveMQ插件设置来更改255个字符,我也不记得了;)

我认为当您使用jmxapi查询和浏览队列时,ActiveMQ中有一个硬编码的限制,这正是hawtio所使用的。但不记得它是否只有255字节或更高


在hawtio设置中,可能有一个ActiveMQ插件设置来更改255个字符,我也不记得了;)

我认为当您使用jmxapi查询和浏览队列时,ActiveMQ中有一个硬编码的限制,这正是hawtio所使用的。但不记得它是否只有255字节或更高


在hawtio设置中,可能有一个ActiveMQ插件设置来更改255个字符,我也不记得了;)

我认为当您使用jmxapi查询和浏览队列时,ActiveMQ中有一个硬编码的限制,这正是hawtio所使用的。但不记得它是否只有255字节或更高


在hawtio设置中,可能有一个ActiveMQ插件设置来更改255个字符,我也不记得了;)

Hawtio使用JMX接口浏览队列。它调用队列上的
browse()
方法。它以
复合数据[]
的形式返回消息

转换
ActiveMQBytesMessage
时(检查class
org.apache.activemq.broker.jmx.OpenTypeSupport.bytemessagementypefactory
),会添加两个字段
BodyLength
BodyPreview
。这些字段返回以下数据

  • BodyLength
    -JMS消息正文的长度
  • BodyPreview
    -JMS消息正文的前255个字节(硬编码的长度,如他的回答中所述;-))
签入class
org.apache.activemq.broker.jmx.OpenTypeSupport.bytemessagepotentypefactory
方法
映射getFields(对象o)

Hawtio使用字段
BodyPreview
显示非文字信息

签入Hawtio文件
Hawtio-web/src/main/webapp/app/activemq/js/browse.ts

function createBodyText(message) {
    if (message.Text) {
        ...
    } else if (message.BodyPreview) {
        ...
        if (code === 1 || code === 2) {
            // bytes and text
            var len = message.BodyPreview.length;
            var lenTxt = "" + textArr.length;
            body = "bytes:\n" + bytesData + "\n\ntext:\n" + textData;
            message.textMode = "bytes (" + len + " bytes) and text (" + lenTxt + " chars)";
        } else {
            // bytes only
            var len = message.BodyPreview.length;
            body = bytesData;
            message.textMode = "bytes (" + len + " bytes)";
        }
        ...
    } else {
        message.textMode = "unsupported";
        ...
如果你想改变它,你要么在中改变它,要么在中改变它

一个冗长而冗长的例子来说明这个解释

import static java.lang.System.out;
import java.lang.management.ManagementFactory;
import java.util.Enumeration;
import java.util.concurrent.TimeUnit;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.management.MBeanServer;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeType;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.broker.jmx.QueueViewMBean;
import org.apache.activemq.command.ActiveMQBytesMessage;
import org.apache.activemq.command.ActiveMQTextMessage;

public class BodyPreviewExample {

    public static void main(String[] args) throws Exception {
        String password = "password";
        String user = "user";
        String queueName = "TEST_QUEUE";
        String brokerUrl = "tcp://localhost:61616";

        BrokerService broker = BrokerFactory.createBroker("broker:"+brokerUrl);
        broker.start();
        broker.waitUntilStarted();

        Connection conn = new ActiveMQConnectionFactory(brokerUrl)
                .createConnection(user, password);
        conn.start();

        Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue producerQueue = session.createQueue(queueName);
        MessageProducer producer = session.createProducer(producerQueue);

        // create a dummy message
        StringBuilder sb = new StringBuilder(1000);
        for (int i = 0; i < 100; i++) {
            sb.append(">CAFEBABE<");
        }

        // create and send a JMSBytesMessage
        BytesMessage bytesMsg = session.createBytesMessage();
        bytesMsg.writeBytes(sb.toString().getBytes());
        producer.send(bytesMsg);

        // create and send a JMSTextMessage
        TextMessage textMsg = session.createTextMessage();
        textMsg.setText(sb.toString());
        producer.send(textMsg);

        producer.close();

        out.printf("%nmessage info via session browser%n");
        String format = "%-20s = %s%n";
        Queue consumerQueue = session.createQueue(queueName);
        QueueBrowser browser = session.createBrowser(consumerQueue);
        for (Enumeration p = browser.getEnumeration(); p.hasMoreElements();) {
            out.println();
            Object next = p.nextElement();
            if (next instanceof ActiveMQBytesMessage) {
                ActiveMQBytesMessage amq = (ActiveMQBytesMessage) next;
                out.printf(format, "JMSMessageID", amq.getJMSMessageID());
                out.printf(format, "JMSDestination", amq.getJMSDestination());
                out.printf(format, "JMSXMimeType", amq.getJMSXMimeType());
                out.printf(format, "BodyLength", amq.getBodyLength());
            } else if (next instanceof ActiveMQTextMessage) {
                ActiveMQTextMessage amq = (ActiveMQTextMessage) next;
                out.printf(format, "JMSMessageID", amq.getJMSMessageID());
                out.printf(format, "JMSDestination", amq.getJMSDestination());
                out.printf(format, "JMSXMimeType", amq.getJMSXMimeType());
                out.printf(format, "text.length", amq.getText().length());
            } else {
                out.printf("unhandled message type: %s%n", next.getClass());
            }
        }
        session.close();
        conn.close();

        // access the queue via JMX
        out.printf("%nmessage info via JMX browse operation%n");
        MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
        ObjectName name = new ObjectName("org.apache.activemq:type=Broker"
                + ",brokerName=localhost"
                + ",destinationType=Queue"
                + ",destinationName=" + queueName);
        QueueViewMBean queue
                = MBeanServerInvocationHandler.newProxyInstance(mbeanServer,
                        name, QueueViewMBean.class, true);
        CompositeData[] browse = queue.browse();
        for (CompositeData compositeData : browse) {
            out.println();
            CompositeType compositeType = compositeData.getCompositeType();
            out.printf(format, "CompositeType", compositeType.getTypeName());
            out.printf(format,"JMSMessageID",compositeData.get("JMSMessageID"));
            if (compositeData.containsKey("BodyLength")) {
                // body length of the ActiveMQBytesMessage
                Long bodyLength = (Long) compositeData.get("BodyLength");
                out.printf(format, "BodyLength", bodyLength);
                // the content displayed by hawtio
                Byte[] bodyPreview = (Byte[]) compositeData.get("BodyPreview");
                out.printf(format, "size of BodyPreview", bodyPreview.length);
            } else if (compositeData.containsKey("Text")) {
                String text = (String) compositeData.get("Text");
                out.printf(format, "Text.length()", text.length());
            }
        }
        // uncomment if you want to check with e.g. JConsole
        // TimeUnit.MINUTES.sleep(5);
        broker.stop();
    }
}

Hawtio使用JMX接口浏览队列。它调用队列上的
browse()
方法。它以
复合数据[]
的形式返回消息

转换
ActiveMQBytesMessage
时(检查class
org.apache.activemq.broker.jmx.OpenTypeSupport.bytemessagementypefactory
),会添加两个字段
BodyLength
BodyPreview
。这些字段返回以下数据

  • BodyLength
    -JMS消息正文的长度
  • BodyPreview
    -JMS消息正文的前255个字节(硬编码的长度,如他的回答中所述;-))
签入class
org.apache.activemq.broker.jmx.OpenTypeSupport.bytemessagepotentypefactory
方法
映射getFields(对象o)

Hawtio使用字段
BodyPreview
显示非文字信息

签入Hawtio文件
Hawtio-web/src/main/webapp/app/activemq/js/browse.ts

function createBodyText(message) {
    if (message.Text) {
        ...
    } else if (message.BodyPreview) {
        ...
        if (code === 1 || code === 2) {
            // bytes and text
            var len = message.BodyPreview.length;
            var lenTxt = "" + textArr.length;
            body = "bytes:\n" + bytesData + "\n\ntext:\n" + textData;
            message.textMode = "bytes (" + len + " bytes) and text (" + lenTxt + " chars)";
        } else {
            // bytes only
            var len = message.BodyPreview.length;
            body = bytesData;
            message.textMode = "bytes (" + len + " bytes)";
        }
        ...
    } else {
        message.textMode = "unsupported";
        ...
如果你想改变它,你要么在中改变它,要么在中改变它

一个冗长而冗长的例子来说明这个解释

import static java.lang.System.out;
import java.lang.management.ManagementFactory;
import java.util.Enumeration;
import java.util.concurrent.TimeUnit;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.management.MBeanServer;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeType;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.broker.jmx.QueueViewMBean;
import org.apache.activemq.command.ActiveMQBytesMessage;
import org.apache.activemq.command.ActiveMQTextMessage;

public class BodyPreviewExample {

    public static void main(String[] args) throws Exception {
        String password = "password";
        String user = "user";
        String queueName = "TEST_QUEUE";
        String brokerUrl = "tcp://localhost:61616";

        BrokerService broker = BrokerFactory.createBroker("broker:"+brokerUrl);
        broker.start();
        broker.waitUntilStarted();

        Connection conn = new ActiveMQConnectionFactory(brokerUrl)
                .createConnection(user, password);
        conn.start();

        Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue producerQueue = session.createQueue(queueName);
        MessageProducer producer = session.createProducer(producerQueue);

        // create a dummy message
        StringBuilder sb = new StringBuilder(1000);
        for (int i = 0; i < 100; i++) {
            sb.append(">CAFEBABE<");
        }

        // create and send a JMSBytesMessage
        BytesMessage bytesMsg = session.createBytesMessage();
        bytesMsg.writeBytes(sb.toString().getBytes());
        producer.send(bytesMsg);

        // create and send a JMSTextMessage
        TextMessage textMsg = session.createTextMessage();
        textMsg.setText(sb.toString());
        producer.send(textMsg);

        producer.close();

        out.printf("%nmessage info via session browser%n");
        String format = "%-20s = %s%n";
        Queue consumerQueue = session.createQueue(queueName);
        QueueBrowser browser = session.createBrowser(consumerQueue);
        for (Enumeration p = browser.getEnumeration(); p.hasMoreElements();) {
            out.println();
            Object next = p.nextElement();
            if (next instanceof ActiveMQBytesMessage) {
                ActiveMQBytesMessage amq = (ActiveMQBytesMessage) next;
                out.printf(format, "JMSMessageID", amq.getJMSMessageID());
                out.printf(format, "JMSDestination", amq.getJMSDestination());
                out.printf(format, "JMSXMimeType", amq.getJMSXMimeType());
                out.printf(format, "BodyLength", amq.getBodyLength());
            } else if (next instanceof ActiveMQTextMessage) {
                ActiveMQTextMessage amq = (ActiveMQTextMessage) next;
                out.printf(format, "JMSMessageID", amq.getJMSMessageID());
                out.printf(format, "JMSDestination", amq.getJMSDestination());
                out.printf(format, "JMSXMimeType", amq.getJMSXMimeType());
                out.printf(format, "text.length", amq.getText().length());
            } else {
                out.printf("unhandled message type: %s%n", next.getClass());
            }
        }
        session.close();
        conn.close();

        // access the queue via JMX
        out.printf("%nmessage info via JMX browse operation%n");
        MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
        ObjectName name = new ObjectName("org.apache.activemq:type=Broker"
                + ",brokerName=localhost"
                + ",destinationType=Queue"
                + ",destinationName=" + queueName);
        QueueViewMBean queue
                = MBeanServerInvocationHandler.newProxyInstance(mbeanServer,
                        name, QueueViewMBean.class, true);
        CompositeData[] browse = queue.browse();
        for (CompositeData compositeData : browse) {
            out.println();
            CompositeType compositeType = compositeData.getCompositeType();
            out.printf(format, "CompositeType", compositeType.getTypeName());
            out.printf(format,"JMSMessageID",compositeData.get("JMSMessageID"));
            if (compositeData.containsKey("BodyLength")) {
                // body length of the ActiveMQBytesMessage
                Long bodyLength = (Long) compositeData.get("BodyLength");
                out.printf(format, "BodyLength", bodyLength);
                // the content displayed by hawtio
                Byte[] bodyPreview = (Byte[]) compositeData.get("BodyPreview");
                out.printf(format, "size of BodyPreview", bodyPreview.length);
            } else if (compositeData.containsKey("Text")) {
                String text = (String) compositeData.get("Text");
                out.printf(format, "Text.length()", text.length());
            }
        }
        // uncomment if you want to check with e.g. JConsole
        // TimeUnit.MINUTES.sleep(5);
        broker.stop();
    }
}

Hawtio使用JMX接口浏览队列。它调用队列上的
browse()
方法。它以
复合数据[]
的形式返回消息

转换
ActiveMQBytesMessage
时(检查class
org.apache.activemq.broker.jmx.OpenTypeSupport.bytemessagementypefactory
),会添加两个字段
BodyLength
BodyPreview
。这些字段返回以下数据

  • BodyLength
    -JMS消息正文的长度
  • BodyPreview
    -JMS消息正文的前255个字节(硬编码的长度,如他的回答中所述;-))
签入class
org.apache.activemq.broker.jmx.OpenTypeSupport.bytemessagepotentypefactory
方法
映射getFields(对象o)

Hawtio使用字段
BodyPreview
显示非文字信息

签入Hawtio文件
Hawtio-web/src/main/webapp/app/activemq/js/browse.ts

function createBodyText(message) {
    if (message.Text) {
        ...
    } else if (message.BodyPreview) {
        ...
        if (code === 1 || code === 2) {
            // bytes and text
            var len = message.BodyPreview.length;
            var lenTxt = "" + textArr.length;
            body = "bytes:\n" + bytesData + "\n\ntext:\n" + textData;
            message.textMode = "bytes (" + len + " bytes) and text (" + lenTxt + " chars)";
        } else {
            // bytes only
            var len = message.BodyPreview.length;
            body = bytesData;
            message.textMode = "bytes (" + len + " bytes)";
        }
        ...
    } else {
        message.textMode = "unsupported";
        ...
如果你想改变它,你要么在中改变它,要么在中改变它

一个冗长而冗长的例子来说明这个解释

import static java.lang.System.out;
import java.lang.management.ManagementFactory;
import java.util.Enumeration;
import java.util.concurrent.TimeUnit;
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.management.MBeanServer;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeType;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.broker.jmx.QueueViewMBean;
import org.apache.activemq.command.ActiveMQBytesMessage;
import org.apache.activemq.command.ActiveMQTextMessage;

public class BodyPreviewExample {

    public static void main(String[] args) throws Exception {
        String password = "password";
        String user = "user";
        String queueName = "TEST_QUEUE";
        String brokerUrl = "tcp://localhost:61616";

        BrokerService broker = BrokerFactory.createBroker("broker:"+brokerUrl);
        broker.start();
        broker.waitUntilStarted();

        Connection conn = new ActiveMQConnectionFactory(brokerUrl)
                .createConnection(user, password);
        conn.start();

        Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue producerQueue = session.createQueue(queueName);
        MessageProducer producer = session.createProducer(producerQueue);

        // create a dummy message
        StringBuilder sb = new StringBuilder(1000);
        for (int i = 0; i < 100; i++) {
            sb.append(">CAFEBABE<");
        }

        // create and send a JMSBytesMessage
        BytesMessage bytesMsg = session.createBytesMessage();
        bytesMsg.writeBytes(sb.toString().getBytes());
        producer.send(bytesMsg);

        // create and send a JMSTextMessage
        TextMessage textMsg = session.createTextMessage();
        textMsg.setText(sb.toString());
        producer.send(textMsg);

        producer.close();

        out.printf("%nmessage info via session browser%n");
        String format = "%-20s = %s%n";
        Queue consumerQueue = session.createQueue(queueName);
        QueueBrowser browser = session.createBrowser(consumerQueue);
        for (Enumeration p = browser.getEnumeration(); p.hasMoreElements();) {
            out.println();
            Object next = p.nextElement();
            if (next instanceof ActiveMQBytesMessage) {
                ActiveMQBytesMessage amq = (ActiveMQBytesMessage) next;
                out.printf(format, "JMSMessageID", amq.getJMSMessageID());
                out.printf(format, "JMSDestination", amq.getJMSDestination());
                out.printf(format, "JMSXMimeType", amq.getJMSXMimeType());
                out.printf(format, "BodyLength", amq.getBodyLength());
            } else if (next instanceof ActiveMQTextMessage) {
                ActiveMQTextMessage amq = (ActiveMQTextMessage) next;
                out.printf(format, "JMSMessageID", amq.getJMSMessageID());
                out.printf(format, "JMSDestination", amq.getJMSDestination());
                out.printf(format, "JMSXMimeType", amq.getJMSXMimeType());
                out.printf(format, "text.length", amq.getText().length());
            } else {
                out.printf("unhandled message type: %s%n", next.getClass());
            }
        }
        session.close();
        conn.close();

        // access the queue via JMX
        out.printf("%nmessage info via JMX browse operation%n");
        MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
        ObjectName name = new ObjectName("org.apache.activemq:type=Broker"
                + ",brokerName=localhost"
                + ",destinationType=Queue"
                + ",destinationName=" + queueName);
        QueueViewMBean queue
                = MBeanServerInvocationHandler.newProxyInstance(mbeanServer,
                        name, QueueViewMBean.class, true);
        CompositeData[] browse = queue.browse();
        for (CompositeData compositeData : browse) {
            out.println();
            CompositeType compositeType = compositeData.getCompositeType();
            out.printf(format, "CompositeType", compositeType.getTypeName());
            out.printf(format,"JMSMessageID",compositeData.get("JMSMessageID"));
            if (compositeData.containsKey("BodyLength")) {
                // body length of the ActiveMQBytesMessage
                Long bodyLength = (Long) compositeData.get("BodyLength");
                out.printf(format, "BodyLength", bodyLength);
                // the content displayed by hawtio
                Byte[] bodyPreview = (Byte[]) compositeData.get("BodyPreview");
                out.printf(format, "size of BodyPreview", bodyPreview.length);
            } else if (compositeData.containsKey("Text")) {
                String text = (String) compositeData.get("Text");
                out.printf(format, "Text.length()", text.length());
            }
        }
        // uncomment if you want to check with e.g. JConsole
        // TimeUnit.MINUTES.sleep(5);
        broker.stop();
    }
}

Hawtio使用JMX接口浏览队列。它调用队列上的
browse()
方法。它以
复合数据[]
的形式返回消息

转换
ActiveMQBytesMessage
时(检查class
org.apache.activemq.broker.jmx.OpenTypeSupport.bytemessagementypefactory
),会添加两个字段
BodyLength
BodyPreview
。这些字段返回以下数据

  • BodyLength
    -JMS消息正文的长度
  • 车身预览
    -前25个