Чтение данных Clob из очереди ActiveMQ в java

#hibernate #deserialization #activemq #clob

#спящий режим #десериализация #activemq #clob

Вопрос:

Я поставил в очередь объект Java (который содержит запись из таблицы Oracle) в очередь ActiveMQ как ObjectMessage . Затем я хочу получить это ObjectMessage и получить данные Clob внутри него. Если я попробую это, я получу ошибку:

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

Я получаю это только для поля Clob. Целочисленные или строковые поля успешно считываются из объекта, возвращенного из очереди.

Производитель:

 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;
}
 

Исключение из основного:

 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 от производителя, и мне нужно снова использовать Hibernate после считывания данных из ActiveMQ для сохранения в Postgres.

Ответ №1:

В общем случае использование ObjectMessage не рекомендуется, поскольку оно вводит связь путей классов между производителями и потребителями. Также в последние годы возникли проблемы с безопасностью при декодировании объектов с уязвимыми библиотеками, позволяющими вводить код и т. Д. Вы должны внести изменения в конфигурацию на стороне клиента, чтобы разрешить десериализацию ваших объектов. Эти параметры описаны в документации веб-сайта ActiveMQ

По сути, ваша фабрика соединений должна быть настроена так, чтобы разрешать различные пакеты, которые будут затронуты при десериализации ваших объектов:

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