2016-10-08 2 views
1

Я новичок в java, и я пытаюсь прочитать & напишите объект коллекции ArrayList<T> в очередь JMS. Я могу записать объект в очередь, используя следующий фрагмент.Как читать объект ArrayList <T> из очереди JMS?

List<Request> reqList = new ArrayList<Request>(); 
... code that populates the list ... 
ObjectMessage om = session.createObjectMessage((Serializable) requestList); 

выше часть кода работает отлично, и я могу видеть записи в JMS очереди. Теперь я не могу прочитать записи из очереди, а ниже - фрагмент кода.

@Override 
public void onMessage(Message msg) 
{ 
    try { 
     String msgText; 
     msgText = msg.toString(); 
     List<Request> requestList = null; 
     requestList = msg.getBody(ArrayList<Request>); 

    } catch (JMSException jmse) { 
     System.err.println("An exception occurred: " + jmse.getMessage()); 
    } 
} 

я не мог закончить метод, потому что я получаю сообщение об ошибке в строке 4. Метод getBody ожидает тип класса, где я не в состоянии обеспечить. Я пробовал с различными вариантами, такими как Request[].class, ArrayList.class и request.getClass().

Но никто из них не работает. Может ли кто-нибудь помочь мне в указании правильного типа для ArrayList<T> или List<T> и как его получить?

Просто для информации, метод декларации getBody в javax.jms АФИ

public <T extends Object> T getBody(Class<T> type) throws JMSException; 

Я ценю вашу помощь.

С уважением.

ответ

0

Попробуйте отправить его следующим образом;

ArrayList<Request> reqList = new ArrayList<Request>(); 
ObjectMessage objectMessage = session.createObjectMessage(); 
objectMessage.setObject(reqList); 
producer.send(objectMessage); 

и читать его так:

... 
if (message instanceof ObjectMessage) { 
Object object = ((ObjectMessage) message).getObject(); 
ArrayList<Request> request = (ArrayList<Request>) object); 
... 

Если это не сработает, попробуйте создать и объект, который имеет несколько вариантов, как запросы, которые есть в поле списка запроса. Не забывайте, что объект Requests должен реализовывать Seriazable.

0

В заявлении msg.getBody(ArrayList<Request>), заменить ArrayList<Request> на List.class.

Метод ожидает ссылку Class, а не просто имя класса. Без суффикса .classArrayList - это просто имя типа, а не ссылка на класс. Это все равно будет генерировать предупреждение типа raw, которое (к сожалению) вам придется подавить с помощью @SuppressWarnings("rawtypes").

Существует несколько альтернатив, чтобы избежать ошибки сырых типов, если вы обнаружите, что предупреждение является отвратительным или неэффективным. Вы можете использовать Serializable.class в качестве типа возврата тела, а затем передать его List<Request>. Это позволяет избежать предупреждения типов raw, но вместо этого выдает предупреждение без предупреждения. Опять же, это можно отключить с помощью @SuppressWarnings("unchecked"), применяемого непосредственно к локальной переменной, где выполняется назначение (то есть не на уровне метода). Нет никакого реального пути вокруг этого, не подавляя предупреждения.

Смежные вопросы