Я использую JMS ObjectMessage
через слушателя, написанного на Spring Boot. Я отправляю ObjectMessage
через приложение Camel в очередь ActiveMQ и слушаю очередь из моего класса слушателя в приложении Spring Boot.
Код:
final BindyCsvDataFormat bindy = new BindyCsvDataFormat(EquityFeeds.class);
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
CamelContext _ctx = new DefaultCamelContext();
_ctx.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
_ctx.addRoutes(new RouteBuilder() {
public void configure() throws Exception {
from("file:src/main/resources?fileName=data.csv")
.unmarshal(bindy)
.split(body())
.streaming().to("jms:queue:javaobjects.upstream.queue");
}
});
Вот мой класс POJO EquityFeeds
:
@CsvRecord(separator = ",",skipFirstLine = true)
public class EquityFeeds implements Serializable {
private static final long serialVersionUID = 1L;
@DataField(pos = 1)
private String externalTransactionId;
@DataField(pos = 2)
private String clientId;
// other fields and getters setters
...
В очереди ActiveMQ я получаю сообщение как:
camelproject.EquityFeeds@1665425
Мой JMS-слушатель в Spring Boot:
@JmsListener(destination = "javaobjects.upstream.queue")
public void capitalIQProcessor(final Message objectMessage) throws JMSException {
Object messageData = null;
if(objectMessage instanceof ObjectMessage) {
ObjectMessage objMessage = (ObjectMessage) objectMessage;
System.out.println("Starting Object Message.");
Object object = objMessage.getObject();
EquityFeeds equityFeeds = (EquityFeeds) object;
System.out.println("Object: "+equityFeeds.toString());
}
}
Я получаю Exception @ line Object object = objMessage.getObject();
:
capitalIQProcessor(javax.jms.Message) throws javax.jms.JMSException' threw exception; nested exception is javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: camelproject.EquityFeeds. Caused by: javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: camelproject.EquityFeeds. Caused by: java.lang.ClassNotFoundException: camelproject.EquityFeeds
Через переполнение стека и другие сообщения на net Я внес следующие изменения:
Я внес изменения в wrapper.conf
(apache -activemq-5.15.11-bin \ apache -activemq-5.15.11 \ bin \ win64)
- Добавлена запись:
wrapper.java.classpath.3=C:\Users\sidbharg\eclipse-workspace\Sid\target\camelproject-0.0.1-SNAPSHOT.jar
Это местоположение файла .jar, в котором находится мой POJO (EquityFeeds). - Также добавлена запись:
wrapper.java.additional.13=-Dorg.apache.activemq.SERIALIZABLE_PACKAGES="*"
В коде «Мой потребитель» я также добавил activeMQConnectionFactory.setTrustAllPackages(true);
:
public ActiveMQConnectionFactory activeMQConnectionFactory() {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
activeMQConnectionFactory.setBrokerURL(brokerURL);
activeMQConnectionFactory.setTrustAllPackages(true);
return activeMQConnectionFactory;
}
В чем же проблема? Почему это дает мне исключение. Куда я иду не так? Есть ли что-то, что я забыл и нужно добавить?