Исключение ClassNotFound Получено, потребляя JMS ObjectMessage - PullRequest
0 голосов
/ 01 апреля 2020

Я использую 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 Я внес следующие изменения:

  1. Я внес изменения в wrapper.conf (apache -activemq-5.15.11-bin \ apache -activemq-5.15.11 \ bin \ win64)

    1. Добавлена ​​запись: wrapper.java.classpath.3=C:\Users\sidbharg\eclipse-workspace\Sid\target\camelproject-0.0.1-SNAPSHOT.jar Это местоположение файла .jar, в котором находится мой POJO (EquityFeeds).
    2. Также добавлена ​​запись: wrapper.java.additional.13=-Dorg.apache.activemq.SERIALIZABLE_PACKAGES="*"
  2. В коде «Мой потребитель» я также добавил activeMQConnectionFactory.setTrustAllPackages(true);:

public ActiveMQConnectionFactory activeMQConnectionFactory() {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
        activeMQConnectionFactory.setBrokerURL(brokerURL);
        activeMQConnectionFactory.setTrustAllPackages(true);
        return activeMQConnectionFactory;
}

В чем же проблема? Почему это дает мне исключение. Куда я иду не так? Есть ли что-то, что я забыл и нужно добавить?

1 Ответ

0 голосов
/ 01 апреля 2020

Вам нужно camelproject.EquityFeeds на пути к классу приложения, использующего JMS ObjectMessage. По-видимому, JVM не может его найти и поэтому выдает java.lang.ClassNotFoundException.

. Кроме того, вам не нужны эти изменения в wrapper.conf брокера. Слушатель пытается десериализовать сообщение, а не посредник.

...