IBM MQ 接收BytesMessage类型的消息转成String出现乱码

从字节流消息中读取消息,转成字符类型出现中文乱码,实际上是由于put到MQ中的字符编码与接收的字符编码转化不一致导致的,从日志信息可以看出,MQ中的这一条消息是有对应的Character。所以解决办法就是从message中获取字符编码,对应的代码:message.getStringProperty(WMQConstants.JMS_IBM_CHARACTER_SET)

然后拿对应的Character再转成字符串。

code:

 

String responseXml = null;
if
(message instanceof BytesMessage) {
    BytesMessage bytesMessage = (BytesMessage) message
;
    try
{
       
byte[] bys = new byte[(int) bytesMessage.getBodyLength()];
       
bytesMessage.readBytes(bys);
       
String codePage = message.getStringProperty(WMQConstants.JMS_IBM_CHARACTER_SET);
       
responseXml = new String(bys, codePage);
       
log.info("receive BytesMessage:{}", responseXml);
   
} catch (JMSException | UnsupportedEncodingException e) {
        e.printStackTrace()
;
   
}
}
else {
    TextMessage textMessage = (TextMessage) message
;
    try
{
        responseXml = textMessage.getText()
;
       
log.info("receive TextMessage:{}", responseXml);
   
} catch (JMSException e) {
        e.printStackTrace()
;
   
}
}

具体的可以参照IBM的帮助文档

https://www.ibm.com/support/knowledgecenter/zh/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q032120_.htm

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Classes contained in javax.jms.jar: javax.transaction.xa.XAResource.class javax.jms.BytesMessage.class javax.jms.Message.class javax.jms.JMSException.class javax.jms.Destination.class javax.jms.DeliveryMode.class javax.jms.Connection.class javax.jms.Session.class javax.jms.ConnectionMetaData.class javax.jms.ExceptionListener.class javax.jms.ServerSessionPool.class javax.jms.ConnectionConsumer.class javax.jms.Topic.class javax.jms.MapMessage.class javax.jms.ObjectMessage.class javax.jms.StreamMessage.class javax.jms.TextMessage.class javax.jms.MessageListener.class javax.jms.MessageProducer.class javax.jms.MessageConsumer.class javax.jms.Queue.class javax.jms.TopicSubscriber.class javax.jms.QueueBrowser.class javax.jms.TemporaryQueue.class javax.jms.TemporaryTopic.class javax.jms.ServerSession.class javax.jms.ConnectionFactory.class javax.jms.MessageNotReadableException.class javax.jms.MessageNotWriteableException.class javax.jms.QueueConnection.class javax.jms.QueueSession.class javax.jms.QueueReceiver.class javax.jms.QueueSender.class javax.jms.QueueConnectionFactory.class javax.jms.QueueRequestor.class javax.jms.TopicConnection.class javax.jms.TopicSession.class javax.jms.TopicPublisher.class javax.jms.TopicConnectionFactory.class javax.jms.TopicRequestor.class javax.jms.XAConnection.class javax.jms.XASession.class javax.jms.XAConnectionFactory.class javax.jms.XAQueueConnection.class javax.jms.XAQueueSession.class javax.jms.XAQueueConnectionFactory.class javax.jms.XATopicConnection.class javax.jms.XATopicSession.class javax.jms.XATopicConnectionFactory.class javax.jms.MessageEOFException.class javax.jms.TransactionRolledBackException.class javax.jms.MessageFormatException.class javax.jms.IllegalStateException.class javax.jms.JMSSecurityException.class javax.jms.ResourceAllocationException.class javax.jms.TransactionInProgressException.class javax.jms.InvalidDestinationException.class javax.jms.InvalidClientIDException.class javax.jms.InvalidSelectorException.class
要监听 ActiveMQ 中的 ByteMessage,可以使用 JMS API 中的 MessageListener 接口。以下是一个示例代码: ```java import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class ByteMessageListener implements MessageListener { public void onMessage(Message message) { try { if (message instanceof BytesMessage) { BytesMessage bytesMessage = (BytesMessage) message; byte[] bytes = new byte[(int) bytesMessage.getBodyLength()]; bytesMessage.readBytes(bytes); String text = new String(bytes); System.out.println("Received message: " + text); } else { System.out.println("Received message: " + message); } } catch (JMSException e) { e.printStackTrace(); } } public static void main(String[] args) throws JMSException { String brokerUrl = "tcp://localhost:61616"; ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl); Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("test.queue"); MessageConsumer consumer = session.createConsumer(destination); consumer.setMessageListener(new ByteMessageListener()); System.out.println("Waiting for messages..."); } } ``` 在这个示例中,我们创建了一个 ActiveMQConnectionFactory 对象,并使用它创建了一个连接和会话。然后我们创建了一个消息消费者,并将其设置为 MessageListener 接口的实现,以便在收到消息时调用 onMessage 方法。在 onMessage 方法中,我们首先检查收到的消息是否是 BytesMessage 类型,如果是,则读取消息中的字节数组,并将其转换为字符串。最后,我们打印出收到的消息内容。 请注意,由于我们使用了 MessageListener 接口,因此在创建消费者时不需要调用 receive 方法。相反,我们只需要等待消息到达,然后 onMessage 方法将自动被调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值