#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(","))));