【问题标题】:Reading Clob data from ActiveMQ queue in java从 java 中的 ActiveMQ 队列中读取 Clob 数据
【发布时间】:2021-03-25 19:54:33
【问题描述】:

我已将一个 Java 对象(保存 Oracle 表中的一条记录)作为 ObjectMessage 排入 ActiveMQ 队列。接下来,我想检索 ObjectMessage 并获取其中的 Clob 数据。如果我尝试这个,我会得到错误:

java.lang.IllegalStateException: Clobs may not be accessed after serialization

我只收到 Clob 字段。从队列返回的对象中成功读取 Integer 或 String 字段。

制作人:

public void enqueuToTableQueue(String TableName, Serializable recordObject)
{
    jms_queue_name = TableName.trim().toUpperCase() + "_QUEUE";
    try {
        destination = new ActiveMQQueue(jms_queue_name); 
        producer = producerSession.createProducer(destination);
        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);            
        ObjectMessage aRecordObjMsg = producerSession.createObjectMessage(recordObject);
        aRecordObjMsg.setJMSType("OBJECT");
        
        producer.send(aRecordObjMsg);
    } catch (JMSException jex) {
        logger.info(jex);
    } catch (Exception  ex) {
        logger.info(ex);
    }
}

消费者:

public Object dequeuFromTableQueue(String  tableName){

    try {
         Message msg;
         try {
             msg = consumer.receive();
             if (msg instanceof ObjectMessage) {
                    ObjectMessage objmsg = (ObjectMessage) msg;
                    Object object = objmsg.getObject(); 
                    return object;
                } else {
                    System.out.println("Unrecognized Message type " + msg.getClass());
                }
         } catch (JMSException e) {

             System.out.println("consumer.receive() has thrown JMSException..");
             e.printStackTrace();
         }      
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

来自 Main 的异常:

Object obj = queueManager.dequeuFromTableQueue("BillData");
                
if ( obj != null) {
    BillData billData = (BillData) obj;
    System.out.println("Account Num is : " + billData.getACCOUNT_NUM()); // PRINTS SUCCESSFULLY
    
    Reader reader =null;
    try {
        reader = billData.getDATA().getCharacterStream(); //THIS LINE THROWS Exception :java.lang.IllegalStateException: Clobs may not be accessed after serialization 

我正在使用 Hibernate 从生产者的 Oracle 数据库中检索数据,我需要在从 ActiveMQ 读取数据后再次使用 Hibernate 以保存在 Postgres 中。

【问题讨论】:

    标签: hibernate deserialization activemq clob


    【解决方案1】:

    一般不鼓励使用 ObjectMessage,因为它在生产者和消费者之间引入了类路径的耦合。此外,近年来,在使用易受攻击的库解码对象时出现了安全问题,允许代码注入等。您必须在客户端进行配置更改以允许您的对象被反序列化。这些选项记录在ActiveMQ website docs

    基本上,您的连接工厂需要配置为允许在反序列化您的对象时将触及的各种包:

    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    factory.setTrustedPackages(new ArrayList(Arrays.asList("org.apache.activemq.test,org.apache.camel.test".split(","))));
    

    【讨论】:

      猜你喜欢
      • 2017-12-19
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      相关资源
      最近更新 更多