Websphere Application server中的setMessageListener jms方法生成javax.jms.IllegalStateException:不允许使用setMessageListener方法

Websphere Application server中的setMessageListener jms方法生成javax.jms.IllegalStateException:不允许使用setMessageListener方法,java,jakarta-ee,jms,websphere,ibm-mq,Java,Jakarta Ee,Jms,Websphere,Ibm Mq,我使用的是WebSphereApplicationServer7.x版本 我想在JMS API的帮助下读取MQ中缓冲的消息,如下所示。 我从 MyListenerclass: public class MyListener implements MessageListener { @Override public void onMessage(Message message) { try { String text=((TextMessage

我使用的是WebSphereApplicationServer7.x版本

我想在JMS API的帮助下读取MQ中缓冲的消息,如下所示。 我从

MyListener
class:

public class MyListener implements MessageListener {
    @Override
    public void onMessage(Message message) {
        try {
           String text=((TextMessage)message).getText();
           System.out.println(text);
         }
         catch (JMSException e) {
            throw new RuntimeException(e);
         }
    }
}
在运行期间,我遇到异常

javax.jms.IllegalStateException: Method setMessageListener not permitted
我可以在中看到,异步消息传递的方法
setMessageListener
,禁止在WebSphere应用程序服务器中使用此方法

问题1:

这个
setMessageListener
方法不能在WAS中使用吗?
如果没有,实现上述所需功能的方法是什么

问题2:

我可以用另一句话来解释这种需要:
JMS listner不应在消息到达队列后立即接收消息。但我希望听众只在我要求的时间内收听。
我尝试了我上面提到的方法。但是我因为这个例外被阻止了


是否有其他方法可以实现此目的?

您没有初始化ConnectionFactory和队列,请尝试此方法

connectionFactory=newconnectionfactory(参数);
队列q=新队列(参数)


我认为这是一个错误,因为当消费者为null时不能使用它。

这不是WebSphere的问题。
简而言之,JMS规范不允许您在JEE容器中使用此功能: 检查:


如果要停止接收消息,可以停用管理MDB的激活规范。您可以编写wsadmin脚本并将其放在crontab中,通过管理控制台暂停它,或者使用JMX和MBean暂停它

检查以下链接:

更新

下面是代码示例。这是伪代码-无错误处理,无需检查ActiveSpec是否正确。 此代码必须以具有管理员或操作员角色的用户身份运行(因此需要启用应用程序安全性),我是通过为调用它的servlet指定
@RunAs
角色来实现的,但您可能需要以不同的方式执行

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    String action = request.getParameter("action");

    try {
        AdminService adminService = AdminServiceFactory.getAdminService();
        ObjectName asName = new ObjectName("WebSphere:*,type=J2CMessageEndpoint");

        Set names = adminService.queryNames(asName, null);
        System.out.println("Found:" + names.size());

        if(names.size() > 0) {
            ObjectName mbean = (ObjectName) names.iterator().next();
            System.out.println("mbean: " + mbean);

            if(action != null && action.equals("pause")) {
                adminService.invoke((ObjectName) mbean, "pause", null, null);
                System.out.println("invoked");
            } 
            else if(action != null && action.equals("resume")) {
                adminService.invoke((ObjectName) mbean, "resume", null, null);
                System.out.println("invoked");
            }
        }

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
您应该在日志中看到AS已停用和激活:

[4/20/17 4:24:41:029 PDT] 00000094 SystemOut     O mbean: WebSphere:name=JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,process=server1,ActivationSpec=jms/MyAS,platform=dynamicproxy,node=ubuntuNode01,J2EEApplication=JMXTestEAR,j2eeType=JCAMessageEndpoint,J2EEServer=server1,Server=server1,version=9.0.0.3,J2CResourceAdapter=SIB JMS Resource Adapter,type=J2CMessageEndpoint,mbeanIdentifier=cells/ubuntuNode01Cell/nodes/ubuntuNode01/servers/server1/resources.xml#J2CResourceAdapter_1492682844859#JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,cell=ubuntuNode01Cell,MessageDrivenBean=JMXTestEAR#JMXTestWeb.war#TestMDB,spec=1.0
[4/20/17 4:24:41:037 PDT] 00000094 ActivationSpe I   J2CA0524I: The Message Endpoint for ActivationSpec jms/MyAS (com.ibm.ws.sib.api.jmsra.impl.JmsJcaActivationSpecImpl) and MDB Application JMXTestEAR#JMXTestWeb.war#TestMDB is deactivated.
[4/20/17 4:24:41:038 PDT] 00000094 SystemOut     O invoked
[4/20/17 4:24:52:890 PDT] 00000094 SystemOut     O Found:1
[4/20/17 4:24:52:890 PDT] 00000094 SystemOut     O mbean: WebSphere:name=JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,process=server1,ActivationSpec=jms/MyAS,platform=dynamicproxy,node=ubuntuNode01,J2EEApplication=JMXTestEAR,j2eeType=JCAMessageEndpoint,J2EEServer=server1,Server=server1,version=9.0.0.3,J2CResourceAdapter=SIB JMS Resource Adapter,type=J2CMessageEndpoint,mbeanIdentifier=cells/ubuntuNode01Cell/nodes/ubuntuNode01/servers/server1/resources.xml#J2CResourceAdapter_1492682844859#JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,cell=ubuntuNode01Cell,MessageDrivenBean=JMXTestEAR#JMXTestWeb.war#TestMDB,spec=1.0
[4/20/17 4:24:52:897 PDT] 00000094 SibMessage    I   [:] CWSIV0777I: A connection to messaging engine ubuntuNode01.server1-myBus for destination testQ1 on bus myBus has been successfully created.
[4/20/17 4:24:52:898 PDT] 00000094 ActivationSpe I   J2CA0523I: The Message Endpoint for ActivationSpec jms/MyAS (com.ibm.ws.sib.api.jmsra.impl.JmsJcaActivationSpecImpl) and MDB Application JMXTestEAR#JMXTestWeb.war#TestMDB is activated.
[4/20/17 4:24:52:899 PDT] 00000094 SystemOut     O invoked

我可以在[link]()中看到方法setMessageListener for asynchronous messaging,禁止在WebSphere Application Server中使用此方法。如果您希望异步接收消息,然后创建MDB,否则请调用
consumer.receive()
方法来读取消息。@Gas,我可以使用MDB异步接收消息。但我也希望MDB在某个时间处于非活动状态,并使其在某个时间处于活动状态。是否有任何参考链接继续使用JMX。我也可以在Websphere中使用JMX,因为我没有使用JBoss。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    String action = request.getParameter("action");

    try {
        AdminService adminService = AdminServiceFactory.getAdminService();
        ObjectName asName = new ObjectName("WebSphere:*,type=J2CMessageEndpoint");

        Set names = adminService.queryNames(asName, null);
        System.out.println("Found:" + names.size());

        if(names.size() > 0) {
            ObjectName mbean = (ObjectName) names.iterator().next();
            System.out.println("mbean: " + mbean);

            if(action != null && action.equals("pause")) {
                adminService.invoke((ObjectName) mbean, "pause", null, null);
                System.out.println("invoked");
            } 
            else if(action != null && action.equals("resume")) {
                adminService.invoke((ObjectName) mbean, "resume", null, null);
                System.out.println("invoked");
            }
        }

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
[4/20/17 4:24:41:029 PDT] 00000094 SystemOut     O mbean: WebSphere:name=JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,process=server1,ActivationSpec=jms/MyAS,platform=dynamicproxy,node=ubuntuNode01,J2EEApplication=JMXTestEAR,j2eeType=JCAMessageEndpoint,J2EEServer=server1,Server=server1,version=9.0.0.3,J2CResourceAdapter=SIB JMS Resource Adapter,type=J2CMessageEndpoint,mbeanIdentifier=cells/ubuntuNode01Cell/nodes/ubuntuNode01/servers/server1/resources.xml#J2CResourceAdapter_1492682844859#JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,cell=ubuntuNode01Cell,MessageDrivenBean=JMXTestEAR#JMXTestWeb.war#TestMDB,spec=1.0
[4/20/17 4:24:41:037 PDT] 00000094 ActivationSpe I   J2CA0524I: The Message Endpoint for ActivationSpec jms/MyAS (com.ibm.ws.sib.api.jmsra.impl.JmsJcaActivationSpecImpl) and MDB Application JMXTestEAR#JMXTestWeb.war#TestMDB is deactivated.
[4/20/17 4:24:41:038 PDT] 00000094 SystemOut     O invoked
[4/20/17 4:24:52:890 PDT] 00000094 SystemOut     O Found:1
[4/20/17 4:24:52:890 PDT] 00000094 SystemOut     O mbean: WebSphere:name=JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,process=server1,ActivationSpec=jms/MyAS,platform=dynamicproxy,node=ubuntuNode01,J2EEApplication=JMXTestEAR,j2eeType=JCAMessageEndpoint,J2EEServer=server1,Server=server1,version=9.0.0.3,J2CResourceAdapter=SIB JMS Resource Adapter,type=J2CMessageEndpoint,mbeanIdentifier=cells/ubuntuNode01Cell/nodes/ubuntuNode01/servers/server1/resources.xml#J2CResourceAdapter_1492682844859#JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,cell=ubuntuNode01Cell,MessageDrivenBean=JMXTestEAR#JMXTestWeb.war#TestMDB,spec=1.0
[4/20/17 4:24:52:897 PDT] 00000094 SibMessage    I   [:] CWSIV0777I: A connection to messaging engine ubuntuNode01.server1-myBus for destination testQ1 on bus myBus has been successfully created.
[4/20/17 4:24:52:898 PDT] 00000094 ActivationSpe I   J2CA0523I: The Message Endpoint for ActivationSpec jms/MyAS (com.ibm.ws.sib.api.jmsra.impl.JmsJcaActivationSpecImpl) and MDB Application JMXTestEAR#JMXTestWeb.war#TestMDB is activated.
[4/20/17 4:24:52:899 PDT] 00000094 SystemOut     O invoked