我在WebSphere 6中有一个MDB.MessageListener链接到Tibco EMS队列.在MDB中,我正在尝试写入WebSphere MQ队列.我收到以下错误:
WMSG0042I: MDB Listener LoanIQ Payments Inbound started successfully for JMSDestination jms/eid/payments
WTRN0063E: An illegal attempt to commit a one phase capable resource with existing two phase capable resources has occurred.
WTRN0086I: XAException encountered during prepare phase for transaction 00000131...0001. Local resources follow.
WTRN0089I: XATransactionWrapper@ 3fbe3fbe XAResource: com.ibm.ejs.jms.JMSManagedSession$JMSXAResource@3fb83fb8 enlisted: true mcWrapper.hashCode()1038237154: Vote: commit.
WTRN0089I: LocalTransactionWrapper@:4e2e4e2e LocalTransaction:com.ibm.ejs.jms.JMSManagedSession$JMS LocalTransaction@4e5a4e5a enlisted:true registeredForSynctruemcWrapper.hashcode()1032076676: Vote: none.
Run Code Online (Sandbox Code Playgroud)
QueueConnectionFactory实例是一个com.ibm.ejs.jms.JMSQueueConnectionFactoryHandle.我可以从中获得XAConnection吗?我需要吗?如果可能的话,我宁愿和香草JMS呆在一起.
MDB实现类似于:
public void onMessage(Message message) {
// ^^ incoming message delivered from EMS …Run Code Online (Sandbox Code Playgroud) 如果我有一个@MessageDriven使用JMS 注入EJB 的请求作用域CDI bean ,如下所示,我可以假设任何给定的Foo实例一次只能由一次onMessage调用使用吗?
换句话说,在下面的例子中,我可以安全地在Foo对象中使用成员变量来跨子例程存储状态,类似于JSF @RequestScoped托管bean吗?
请注意,如果同一个Foo对象从一个onMessage调用顺序循环到下一个调用,则可以,只要每个MessageDrivenBean实例都有自己的Foo实例,这样就可以隔离两个并发处理请求.
@MessageDriven
public class MessageDrivenBean implements MessageListener {
@Inject
private Foo foo;
public void onMessage(Message m) {
foo.doSomething();
}
}
@Named
@RequestScoped
public class Foo {
private String property;
public void doSomething() {
property = ...;
}
}
Run Code Online (Sandbox Code Playgroud) 使用消息驱动Bean时,在注释中硬编码接收消息的目标名称 @MessageDriven(mappedName = "someDestinationName")
有没有办法在运行时添加此信息?Bellow是Message Driven Bean类的示例.
package mdb.beans;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
@MessageDriven(mappedName = "someDestinationName", activationConfig =
{
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class MDBSample implements MessageListener
{
public MDBSample()
{
// constructor
}
@Override
public void onMessage(Message message)
{
// logic when message received
}
}
Run Code Online (Sandbox Code Playgroud) 当用户登录时,我需要在数据库中插入一条消息(主机名,仅作为示例).因为它只是一条文本消息,所以将EJB注入客户端(Servlets,JSP,JSF或其他东西)是非常必要的.
在这种情况下,客户端是一个身份验证过滤器,我通过它将主机名发送到消息驱动的bean.在消息驱动的bean的帮助下,消息存储在队列(而不是主题)中,然后通过将EJB注入此消息传递bean将其提交给EJB.
这里提到的策略运行良好.当EJB被强制实施安全约束时,就会出现问题.在这种情况下,它会引发有关安全性的异常.
消息驱动的bean如下所示.
@MessageDriven(mappedName = "jms/destination", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class UserStatusMessageBean implements MessageListener
{
@Resource
private MessageDrivenContext messageDrivenContext;
@EJB
private UserStatusBeanRemote userStatusBeanRemote;
public UserStatusMessageBean() {}
@Override
public void onMessage(Message message)
{
TextMessage textMessage;
try
{
if(message instanceof TextMessage)
{
textMessage = (TextMessage) message;
userStatusBeanRemote.addHost(textMessage.getText());
//This EJB method causes the exception as given below.
}
else
{
System.out.println("Message is of wrong type : " +message.getClass().getName());
} …Run Code Online (Sandbox Code Playgroud) 什么时候应该选择ejb async方法而不是MDB和java消息服务来激发异步长时间任务?
我有一个侦听WebSphere MQ的MDB.它不会按队列接收的顺序获取消息.我如何让它按顺序读取?可能吗?我应该不使用MDB吗?
如何为MDB用户配置maxSession值?
有一个MDB可以侦听来自特定队列的消息.它被定义为注释.
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "5").
为了更改maxSession的值,必须每次都编译代码.
有没有办法让用户可配置,以便不需要构建并且无需重新启动jboss?
请帮助.
我们有一个MDB监听队列读取数据并将数据发送到另一个队列
@MessageDriven(
activationConfig = { @ActivationConfigProperty(
propertyName = "destinationType", propertyValue = "javax.jms.Queue"
) },
mappedName = "jms/dataQ")
public class DataMDB implements MessageListener {
@Resource(name="jms/dataQueueConnectionFactory")
private ConnectionFactory connectionfactory;
@Resource(name="jms/dataDestinationQ")
private Destination destination;
...
}
Run Code Online (Sandbox Code Playgroud)
和一个带有bean配置的XML(ibm-ejb-jar-bnd.xml)
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar-bnd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://websphere.ibm.com/xml/ns/javaee"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-ejb-jar-bnd_1_0.xsd"
version="1.0">
<message-driven name="DataMDB">
<jca-adapter activation-spec-binding-name="eis/dataListenerMDB"
destination-binding-name="jms/dataQ" />
<resource-ref name="jms/dataQueueConnectionFactory"
binding-name="jms/dataQueueConnectionFactory" />
<resource-env-ref name="jms/dataDestinationQ"
binding-name="jms/dataDestinationQ" />
</message-driven>
</ejb-jar-bnd>
Run Code Online (Sandbox Code Playgroud)
WebSphere上此MDB的激活规范和激活规范

正如我在Google上看到的示例,这是MDB和WAS激活设置的典型示例.
我们这里有一个问题,因为这里看到的所有JNDI名称都是在Java代码anotations和ibm-ejb-jar-bnd.xml文件中硬编码的.
那么有没有一种方法可以将这些JNDI名称带到EJB项目之外,因此我们可以为所有客户构建一个项目,并且客户可以自由地拥有其标准JNDI名称.
另外,我们必须为每个客户建立不同的.ear,这是不理想的.
在此先感谢大家.欢迎任何想法.
我在域模式下运行JBoss Wildfly 8.1.0.Final,有两个节点("host-1"和"host-2"),需要从一个节点向集群中的所有节点发送消息才能执行对所有人采取某种行动.发送消息的客户端和消息接收者应该在同一个EAR中.
由于这个问题到目前为止还没有得到答复和解决,我将把问题分解为更简单的部分.请随时回答或评论一个子集,以便我进一步调查.
假设这是消息驱动bean的有效用例,我是否正确?如果没有,为什么?在这种情况下,问题的其余部分可能毫无意义.
我创建了一个javax.jms.Topic在domain.xmlJBoss的集群的域控制器的"主机1".原则上正确吗?
打算发送消息的客户端通过JNDI 查找Topic和查找ConnectionFactory(而不是例如注入它).这是正确的方法吗?
要接收消息的MDB配置为Topic通过a 监听@ActivationConfigProperty.正确?
上述设置在本地工作,即消息仅由发送它的节点接收.其他节点不接收它.发送消息的客户端代码是从WAR触发的,并且消息由同一EAR中的EJB模块中的MDB接收.
我不确定我们是否需要一个RemoteConnectionFactory或者我们是否需要使用不同的方式来查找主题(当前注入MDB并由客户端查找java:/jms/rmcTopic),因为它实际上是在远程主机上定义的.
这是我在domain.xml中的主题.我知道<clustered>标签已弃用,但我找不到最近的文档,说明如何使用Wildfly 8.1完成此操作.
<subsystem xmlns="urn:jboss:domain:messaging:2.0">
<hornetq-server>
<clustered>true</clustered>
<cluster-user>hornetqcluster</cluster-user>
<cluster-password>hornetqcluster</cluster-password>
<!-- ... -->
<jms-connection-factories>
<!-- ... -->
<connection-factory name="RemoteConnectionFactory">
<connectors>
<connector-ref connector-name="http-connector"/>
</connectors>
<entries>
<entry name="java:jboss/exported/jms/RemoteConnectionFactory"/>
</entries>
</connection-factory>
</jms-connection-factories>
<!-- ... -->
<jms-destinations>
<!-- ... -->
<jms-topic name="rmcTopic">
<entry name="java:/jms/rmcTopic"/>
</jms-topic>
</jms-destinations>
</hornetq-server>
</subsystem>
Run Code Online (Sandbox Code Playgroud)
MDB在EAR中打包为EJB模块,MDB注释为:
@MessageDriven(name = "ConfigurationMDB", activationConfig = {
@ActivationConfigProperty(propertyName …Run Code Online (Sandbox Code Playgroud) 我们需要在 Java EE 应用程序中使用队列,因为它是一个基于云的应用程序(部署在 OpenShift Online 上),我们喜欢使用 amazon sqs。
如果我正确理解了 JMS/Java EE 接收部分的理论,一个@MessageDrivenbean 由 Java EE 容器管理,以便并行创建许多 bean 实例(根据最大池大小),如果传入消息的数量高。这对于处理高负载当然是一个很大的好处。
但是,我不知道如何在 Java EE 应用程序中以这种方式集成 aws sqs。我知道来自http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-java-message-service-jms-client.html的异步接收器示例:
class MyListener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
// Cast the received message as TextMessage and print the text to screen.
if (message != null) {
System.out.println("Received: " + ((TextMessage) message).getText());
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
进而:
// Create a consumer …Run Code Online (Sandbox Code Playgroud) jms ×6
ejb ×4
java-ee ×4
ejb-3.0 ×2
ibm-mq ×2
java ×2
jboss ×2
websphere ×2
amazon-sqs ×1
annotations ×1
asynchronous ×1
cdi ×1
jaas ×1
jakarta-ee ×1
java-ee-6 ×1
jboss6.x ×1
jndi ×1
synchronous ×1
websphere-8 ×1
wildfly ×1
xa ×1