如何从JMS队列中读取ArrayList <t>对象?

时间:2016-10-08 23:07:47

标签: java arraylist jms

我是java的新手,我试图阅读&amp;将集合对象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[].classArrayList.classrequest.getClass()

但他们似乎都没有工作。任何人都可以帮我指定ArrayList<T>List<T>的正确类型以及如何获取它吗?

仅供参考,javax.jms api中getBody的方法声明是

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

感谢您的帮助。

问候。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

在语句msg.getBody(ArrayList<Request>)中,将ArrayList<Request>替换为List.class

该方法需要Class引用,而不仅仅是类的名称。如果没有.class后缀,ArrayList只是类型名称,而不是类引用。这仍然会生成原始类型警告,(不幸的是)您必须使用@SuppressWarnings("rawtypes")来抑制。

如果您发现抑制警告令人反感或无效,则有一些替代方法可以避免原始类型错误。您可以使用Serializable.class作为正文返回类型,然后将其转换为List<Request>。这样可以避免原始类型警告,但会导致未经检查的强制转换警告。同样,这可以通过将@SuppressWarnings("unchecked")直接应用于正在进行赋值的局部变量(即不在方法级别)来沉默。没有压制警告就没有真正解决这个问题。