当前位置: 首页 > 知识库问答 >
问题:

如何在同一Spring服务中实现多个SFDC出站消息接收器?

夔学智
2023-03-14

对于每个出站消息,Salesforce提供完整的独立WSDL。

为单个服务实现Spring服务很容易,使用jaxws-maven-plugin来生成类,@Endpoint@PayloadRoot等来绑定endpoint。

但是,对于不同的结构和类型层次结构,多个出站消息都共享相同的 QN(例如 http://soap.sforce.com/2005/09/outbound:notificationsurn:sobject.enterprise.soap.sforce.com:sObject)。

我知道如何根据URL路径将相同的XML名称映射到不同的处理程序

我知道如何使用带有绑定文件的生成类使用单独的包:

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    wsdlLocation="../wsdl/SFDC_Contact_Outbound_Msg.wsdl"
    version="2.0">

  <jaxb:bindings node="//xs:schema[@targetNamespace='http://soap.sforce.com/2005/09/outbound']">
    <jaxb:schemaBindings>
      <jaxb:package name="com.sforce.soap.outbound.contact"/>
    </jaxb:schemaBindings>
  </jaxb:bindings>

  <jaxb:bindings node="//xs:schema[@targetNamespace='urn:sobject.enterprise.soap.sforce.com']">
    <jaxb:schemaBindings>
      <jaxb:package name="com.sforce.soap.enterprise.sobject.contact"/>
    </jaxb:schemaBindings>
  </jaxb:bindings>

</jaxws:bindings>

然而,当试图从生成的代码中初始化< code>Jaxb2Marshaller时,它仍然无法处理XML冲突:

[WARN] [main] 09:40:45.687 AnnotationConfigEmbeddedWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException:
  Error creating bean with name 'marshaller' defined in class path resource [WebServiceConfig.class]: 
  Invocation of init method failed; nested exception is org.springframework.oxm.UncategorizedMappingException:
  Unknown JAXB exception; nested exception is com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 6 counts of IllegalAnnotationExceptions
  Two classes have the same XML type name "{urn:sobject.enterprise.soap.sforce.com}sObject". Use @XmlType.name and @XmlType.namespace to assign different names to them.
  ...

当SDFC生成的WSDL更改时,我不想再添加任何手动步骤,除了放入新文件。

有没有办法在不更改源WSDL的情况下更改package-info.java中的命名空间?

是否有一种方法可以轻松地(即不为每个包使用单独的@Bean方法)为每个包创建一个单独的编组器,然后将所有这些编组器都添加DefaultMethod odEndpoint Adapter中?

是否有其他方法来实现所有这些出站消息接收器?

共有1个答案

古文康
2023-03-14

有没有办法更改名称空间?

如果您这样做了,它们将与实际消息中的命名空间不匹配,因此不会无法编组。

有没有一种方法可以轻松地为每个包创建单独的封送拆收器?

嗯,这里有一个方法。

@PostConstruct
public void marshallers() throws IOException {
  List<String> types = Arrays.stream(applicationContext.getResources("classpath:com/sforce/soap/outbound/*"))
      .map(Resource::getFilename)
      .collect(Collectors.toList());

  for (String type : types) {
    String beanName = "marshallingPayloadMethodProcessor_" + type;
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan(
        "com.sforce.soap.outbound." + type,
        "com.sforce.soap.enterprise.sobject." + type
    );

    try {
      marshaller.afterPropertiesSet();
    } catch (Exception ex) {
      throw new BeanInitializationException("Could not initialize bean " + beanName, ex);
    }

    MarshallingPayloadMethodProcessor processor = new MarshallingPayloadMethodProcessor(marshaller);
    beanFactory.registerSingleton(beanName, processor);
  }

在这方面有几点需要注意:

  • 如果通过jar部署,则类路径目录不存在,因此需要另一种方法来获取包名称。
  • ynsterSingleton似乎破坏了一些应用程序上下文-导致不再找到不相关的bean。我不知道为什么会这样。
 类似资料:
  • 我运行生产者,它生成N条消息,我在仪表板上看到它们。当我运行接收器时,它会接收来自队列的所有消息,并且队列为空。 我需要有多个生产者生成消息到同一个队列。多个客户从队列中接收消息。消息将被队列TTL删除。但是现在第一个接收者从队列中获取所有消息。我怎么能做到这一点?

  • 我正在尝试创建一个TCP服务器,该服务器在端口5002上接受来自外部程序的消息。但是,它不接收来自外部程序的消息。 为了验证我的TCP服务器是否正常工作,我像这样使用了telnet,程序确实收到了文本“hello”。 设置wireshark时,我可以看到计算机正在端口5002上接收来自外部程序(我期待)的消息。为什么我的程序无法接收这些消息? 关于最终解决方案的最新情况: 由于负载没有停止线,我必

  • 我正在开发一个web应用程序,通过Spring Integration支持TCP连接。它有两个功能。 null null 因此,我认为协作TCP出站和入站通道适配器是困难的。然后,对TCP出站网关进行扩展,增加只接收消息的功能。我应该怎么延长?(还是你有其他想法?) 提前谢了。

  • 如何发送buf然后接收msg 方法 我正在尝试通过从连接出站发送msg并从入站接收msg然后返回消息Mono来实现此方法。但我只能在that(Publisher)方法中接收消息。它似乎无法返回数据Mono 我试过这个。 但它会一直阻塞,直到连接超时 我尝试了另一个代码。我添加了一个handle方法,并将响应放到map中。然后我可以得到单声道。fromSupply(),在映射处有一个while循环中

  • 我正在使用spring kafka来消费来自kafka的消息。消费者监听器如下。 应用程序的单个实例,并发数为6。 该主题有6个分区。 从上面的日志中可以清楚地看到,两个用户在完全相同的时间收到了来自分区和偏移量的相同消息。 每个线程继续处理消息。最后,其中一个消费者失败了,错误如下 我知道上面的错误会在有负载或消息处理需要时间时出现。在这种情况下,处理不到一秒钟,kafka主题中的消息不到10条

  • 在我的聊天应用程序中,每当用户收到新消息时,我使用FCM和Firebase功能发送通知。 为此,我有一个FirebaseMessagingService,它覆盖了。除此之外,此服务还覆盖。每当用户第一次启动应用程序时,就会调用,我检索一个新令牌并将其存储在Firebase实时数据库中。 然后我去和一些用户聊天(不关闭应用程序)。当我收到新消息时,我会收到通知。调用。 问题是,当我关闭应用程序,然后