Websphere Application server中的setMessageListener jms方法生成javax.jms.IllegalStateException:不允许使用setMessageListener方法
我使用的是WebSphereApplicationServer7.x版本 我想在JMS API的帮助下读取MQ中缓冲的消息,如下所示。 我从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
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